Git 使用技巧

儲藏修改

git stash

當你在某個分支進行修改但還沒完成全部修改,這時想切換到其餘分支上進行一些工做,而你又不想提交進行了一半的工做,那就可使用 git stash 命令。
下次想切換回這個分支繼續前面的工做時,用 git stash pop 把儲藏的內容取出便可。git

  • 幫助理解
    git stash 會把內容推到棧上,而 git stash pop 將內容從棧上推出。因此不管進行幾回的 git stash,取出內容時都遵循「先進後出」的原則哈。

屢次提交合成一次

git commit --amend

git commit --amend最多見的用法是上次提交信息寫錯,或提交文件多了或漏了之時,從新提交覆蓋上一次提交。shell

其實它還有一個用法,就是用來合併提交。例如上次提交的修改並不徹底,再做修改以後能夠用該命令把本次提交與上次提交合並在一塊兒。bash

git reset

在須要回滾一次或屢次提交時,能夠用git reset。因爲該命令比較危險,建議用於已經把最新提交推到遠程倉庫上的本地分支。工具

  • git reset HEAD [filename]

把已在暫時區的文件取消,恢復到已修改未暫存狀態。spa

  • git reset HEAD~[n]

git reset後面可帶參數HEAD~[n](n >= 1)。表示回退到n個提交以前。同時,它也能夠用來合併提交。下面的寫法與git commit --amend結果是同樣的。命令行

git reset HEAD~1
git commit複製代碼

下面的用法則是合併了屢次提交code

git reset HEAD~2
git commit複製代碼
  • git reset [version]

git reset後面也能夠帶版本號,直接回退到指定版本。cdn

  • git reset的三種參數blog

    1. 使用參數--hard,如git reset --hard [version]會執行如下操做:
      1. 替換引用的指向。引用指向新的提交ID。
      2. 替換暫存區。替換後,暫存區的內容和引用指向的目錄樹一致。
      3. 替換工做區。替換後,工做區的內容變得和暫存區一致,也和HEAD所指向的目錄樹內容相同。
    2. 使用參數--soft,如 git reset --soft [version]會執行上述的操做a。即只更改引用的指向,不改變暫存區和工做區。
    3. 使用參數--mixed或者不使用參數(默認爲--mixed),如 git reset [version]會執行上述的操做a和b。即更改引用的指向及重置暫存區,可是不改變工做區。

不快速合併

git merge --no-ff

--no-ff是不快速合併的意思rem

與git merge的區別

git merge的結果:

被merge的分支和當前分支在圖形上併爲一條線,被merge的提交點逐一合併到當前分支。

image
image

git merge --no-ff的結果:

被merge的分支和當前分支不在一條線上,被merge的提交點還在原來的分支上,同時在當前分支上產生一個合併點。這樣在回滾時很是方便,版本樹也很清晰。

image
image

變基

git rebase

git rebase通常解釋爲變基,也有解釋爲衍合,我的以爲變基比較容易理解。

與git merge的區別

git merge是把兩個分支的代碼合併到一塊兒,其實git rebase也是相同的做用,可是表現上是兩種不一樣的形式。

例如如今 dev 提交了一次,master 在此以後也提交了一次,兩個分支的狀態以下:

image
image

  • 提交點順序

能夠看出git merge後,不管加不加--no-ff參數,提交點的順序都和提交的時間順序相同,即 master 的提交在 dev 以後,如圖:

image
image

git rebase後,順序就變成被rebase的分支(master)全部提交都在前面,進行rebase的分支(dev)提交都在被rebase的分支以後,在同一分支上的提交點仍按時間順序排列,如圖:

image
image

  • 變基

從上面的圖能夠看出,dev 在rebase master 後,分支發生了變化,本來是兩個分支,rebase的結果看起來是: dev 是基於 master 的分支,且產生了一些新提交。

通常來講,rebase後的 dev 和遠程的origin/dev會發生分離,在命令行界面中會提示:

Your branch and 'origin/dev' have diverged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)複製代碼

這時須要用git push -f強制推送,覆蓋遠程分支。若使用了提示中的git pull,結果會變成合並,併產生一個合併提交點。

注:慎用git push -f!

git pull --rebase

注意git pull時請加上--rebase,理由下面會說。

與git pull的區別

在通常狀況下,加與不加--rebase是沒有區別的。然而,結合上面說的git rebase功能,能夠知道某個分支可能與其遠程分支發生分離,而當你pull時,你的本地分支仍是和原來的遠程分支同樣,這時若是使用git pull,則會變成你的本地分支和遠程分支合併,正確的作法是git pull --rebase,纔會拉取到最新的分支。

因此推薦在任什麼時候候pull遠程分支,最好加上--rebase參數。

查看本地操做記錄

git reflog

查看提交記錄的命令是git log,而git reflog的功能是查看本地操做記錄,如此一來能夠看到本地的commit, merge, rebase等操做記錄。

6fe46ab HEAD@{0}: rebase finished: returning to refs/heads/dev
6fe46ab HEAD@{1}: rebase: dev modify a
2c92bcb HEAD@{2}: rebase: checkout master
9b26f5d HEAD@{3}: reset: moving to 9b26f5db1e8597b884c45114fbbff36c440da274
5531fc0 HEAD@{4}: merge master: Merge made by the 'recursive' strategy.
9b26f5d HEAD@{5}: checkout: moving from master to dev複製代碼

Git工具推薦

  • SourceTree
  • GUI Clients
相關文章
相關標籤/搜索