Git學習筆記

Git 三個區域、四種狀態

  • 工做區(Working Directory)就是你在電腦裏能看到的目錄
  • 版本庫(Repository)工做區有一個隱藏目錄.git,這個不算工做區,而是Git的版本庫。

Git的版本庫裏存了不少東西,其中最重要的就是稱爲stage(或者叫index)的暫存區,還有Git爲咱們自動建立的第一個分支master,以及指向master的一個指針叫HEADhtml

在這裏插入圖片描述

在這裏插入圖片描述

Git相關命令操做

設置Git參數git

# 顯示當前的 Git 配置
git config --list

# 設置提交倉庫時的用戶名信息
git config --global user.name "fuziwang"

# 設置提交倉庫時的郵箱信息
git config --global user.email "2622860598@qq.com"

三個區域、四種狀態相關操做github

# 在當前目錄新建一個 Git 代碼庫
git init

# 添加指定文件到暫存區
git add [file1] [file2]

# 提交暫存區到倉庫
git commit –m [message]

# 直接從工做區提交到倉庫,前提該文件已經有倉庫中的歷史版本
git commit –a –m [message]

# 顯示變動信息,能夠展現四種狀態的相關信息
git status

# 顯示當前分支的歷史版本
git log
git log --pretty=oneline "在一行顯示"

# 記錄你的每一次提交版本和回退版本的信息
git reflog

# 查看readme.txt文件在工做區和版本庫裏面最新版本的區別
git diff HEAD -- readme.txt

# 當對工做區進行修改以後,(無論上一次是否git add)尚未git add,丟棄對工做區的修改
git checkout -- [file]

# 當已經添加到暫存區,尚未git commit,能夠把暫存區的修改撤銷掉(unstage),從新放回工做區
git reset HEAD [file]

# 版本回退,一旦把文件改亂了,或者誤刪了文件,還能夠從最近的一個commit恢復
git reset --hard HEAD^
git reset --hard "commit-id"

# 刪除工做區文件,而且將此次刪除放入暫存區,以後只須要git commmit,不須要git add
git rm [file1] [file2]

# 更名文件,而且將這個更名放入暫存區,以後只須要git commmit,不須要git add
git mv [file-origin] [file-renamed]

Git分支管理

每次提交,Git都把它們串成一條時間線,這條時間線就是一個分支。在Git裏,有一個主分支,即master分支。HEAD嚴格來講不是指向提交,而是指向mastermaster纔是指向提交的,因此,HEAD指向的就是當前分支。面試

每次提交,master分支都會向前移動一步,這樣,隨着版本的不斷提交,master分支的線也愈來愈長:安全

master-line

Fast-forward 快速合併

fast-forword

# 建立dev分支,而後切換到dev分支
# git checkout命令加上-b參數表示建立並切換 至關於 git branch dev & git chekout dev
git checkout -b dev

# 查看當前分支是什麼
git branch

# 把dev分支的工做成果合併到master分支上 git merge命令用於合併指定分支到當前分支
git merge dev

# 合併完成後,刪除dev分支
git branch -d dev

# 若是要放棄分支的全部操做,不進行合併,強制刪除分支的全部操做
git branch -D feature-vulcan

解決衝突

solve-problem

上述圖片過程當中會出現衝突,還原衝突過程:bash

  • 準備新的feature1分支,對readme.md文件進行修改,而且在新的分支上進行了一次提交。
  • 切換到master分支,一樣對readme.me文件進行修改,而且在主分支上進行了一次提交。
  • 此時進行合併,git merge feature 運行這個命令會產生衝突,此時須要解決衝突,須要手動修改文件內容。
  • Git用<<<<<<<,=======,>>>>>>>標記出不一樣分支的內容,對文件進行修改後,再進行一次提交

用帶參數的git log也能夠看到分支的合併狀況app

~/learngit(master) » git log --graph --pretty=oneline --abbrev-commit
*   a0c8a45 conflict fixed
|\  
| * a8b263e AND simple
* | 5565d9c & simple
|/  
* faa2e24 branch test
...

--no-ff 方式的 git merge

  • 建立並切換dev分支,修改readme.txt文件,並提交一個新的commit
  • 切換回master,準備合併dev分支,請注意--no-ff參數,表示禁用Fast forward

合併後,咱們用git log看看分支歷史:ssh

~/learngit(master) » git log --graph --pretty=oneline --abbrev-commit
*   fc2593c merge with no-ff
|\  
| * ecca429 add merge
|/  
*   2a45671 conflict fixed
...

Git stash

若是如今接到一個修復bug的任務時,須要建立一個分支bug-1來修復它,可是,當前正在dev上進行的工做尚未提交,工做只進行到一半,還無法提交。此時須要去修復bug,當前工做區須要暫時保存下來,等bug修復徹底再繼續工做。fetch

Git提供了一個stash功能,能夠把當前工做現場「儲藏」起來,等之後恢復現場後繼續工做:網站

~/learngit(dev*) » git stash
Saved working directory and index state WIP on dev: ecca429 add merge
HEAD 如今位於 ecca429 add merge

此時能夠進行bug的修復。修復完成後,回到dev開發工做中,用git stash list命令看看當前保存的環境狀態。

~/learngit(dev) » git stash list
stash@{0}: WIP on dev: ecca429 add merge

工做現場還在,Git把stash內容存在某個地方了,可是須要恢復一下,有兩個辦法:

  • git stash apply恢復,可是恢復後,stash內容並不刪除,你須要用git stash drop來刪除
  • git stash pop,恢復的同時把stash內容也刪了

Rebase

對於該部分,能夠看一下http://gitbook.liuhui998.com/...,我以爲這個講解的更加清楚

rebase操做能夠把本地未push的分叉提交歷史整理成直線rebase的目的是使得咱們在查看歷史提交的變化時更容易,由於分叉的提交須要三方對比。

應用場景:當本地比遠程倉庫多了幾個提交以後,須要git push,但當push的時候發現,遠程倉庫已經有人先進行了推送,所以須要先pull下來,此時輸入git log --graph --pretty=oneline --abbrev-commit 會發現內容很是亂很差看,此時能夠輸入git rebase

~/learngit(master) » git rebase
First, rewinding head to replay your work on top of it...
Applying: add comment
Using index info to reconstruct a base tree...
M    hello.py
Falling back to patching base and 3-way merge...
Auto-merging hello.py
Applying: add author
Using index info to reconstruct a base tree...
M    hello.py
Falling back to patching base and 3-way merge...
Auto-merging hello.py
-----------------------------------------------------------
# 此時再輸入git log命令會發現內容進行了整理
~/learngit(master) » git log --graph --pretty=oneline --abbrev-commit
* 7e61ed4 (HEAD -> master) add author
* 3611cfe add comment
* f005ed4 (origin/master) set exit=1
* d1be385 init hello
...

Git與GitHub

更多github的使用:http://developer.51cto.com/ar...

GitHub這個網站就是提供Git倉庫託管服務的,本地Git倉庫和GitHub倉庫之間的傳輸是經過SSH加密的,因此,須要一點設置:

第1步:建立SSH Key。在用戶主目錄下,看看有沒有.ssh目錄,若是有,再看看這個目錄下有沒有id_rsaid_rsa.pub這兩個文件,若是已經有了,可直接跳到下一步。若是沒有,打開Shell(Windows下打開Git Bash),建立SSH Key:

~ » ssh-keygen -t rsa -C "2622860598@qq.com"

在用戶主目錄裏找到.ssh目錄,裏面有id_rsaid_rsa.pub兩個文件,這兩個就是SSH Key的祕鑰對,id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰。

第2步:登錄GitHub,打開「Account settings」「SSH Keys」頁面:點「Add SSH Key」,填上任意Title,在Key文本框裏粘貼id_rsa.pub文件的內容:

爲何GitHub須要SSH Key呢?
由於GitHub須要識別出你推送的提交確實是你推送的,而不是別人冒充的,而Git支持SSH協議,因此,GitHub只要知道了你的公鑰,就能夠確認只有你本身才能推送。GitHub容許添加多個Key

提交代碼到遠程倉庫

將遠程倉庫代碼更新到本地

面試常考:討論git pullgit fetch 的關係:

  • git fetch 至關因而從遠程獲取最新到本地,不會自動merge
  • git pull:至關因而從遠程獲取最新版本並merge到本地 在實際使用中,git fetch更安全一些

Git命令操做

# 下載一個項目和它的整個代碼歷史
# url 格式: https://github.com/[userName]/reposName
git clone [url]

# 增長遠程倉庫,並命名
git remote add [shortname] [url]

# 將本地的提交推送到遠程倉庫
git push [remote] [branch]
推送分支:git push origin dev

# 將遠程倉庫的提交拉下到本地
git pull [remote] [branch]

# 查看遠程庫的信息,用git remote,或者,用git remote -v顯示更詳細的信息
git remote
~/learngit(master) » git remote -v
origin    https://github.com/fuziwang/learngit.git (fetch)
origin    https://github.com/fuziwang/learngit.git (push)

# 本地分支和遠程分支的連接關係沒有建立
git branch --set-upstream branch-name origin/branch-name
相關文章
相關標籤/搜索