當你在某個分支進行修改但還沒完成全部修改,這時想切換到其餘分支上進行一些工做,而你又不想提交進行了一半的工做,那就可使用 git stash
命令。
下次想切換回這個分支繼續前面的工做時,用 git stash pop
把儲藏的內容取出便可。git
git stash
會把內容推到棧上,而 git stash pop
將內容從棧上推出。因此不管進行幾回的 git stash
,取出內容時都遵循「先進後出」的原則哈。git commit --amend
最多見的用法是上次提交信息寫錯,或提交文件多了或漏了之時,從新提交覆蓋上一次提交。shell
其實它還有一個用法,就是用來合併提交。例如上次提交的修改並不徹底,再做修改以後能夠用該命令把本次提交與上次提交合並在一塊兒。bash
在須要回滾一次或屢次提交時,能夠用git reset
。因爲該命令比較危險,建議用於已經把最新提交推到遠程倉庫上的本地分支。工具
把已在暫時區的文件取消,恢復到已修改未暫存狀態。spa
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
後面也能夠帶版本號,直接回退到指定版本。cdn
git reset的三種參數blog
--hard
,如git reset --hard [version]
會執行如下操做:
--soft
,如 git reset --soft [version]
會執行上述的操做a。即只更改引用的指向,不改變暫存區和工做區。--mixed
或者不使用參數(默認爲--mixed
),如 git reset [version]
會執行上述的操做a和b。即更改引用的指向及重置暫存區,可是不改變工做區。--no-ff
是不快速合併的意思rem
git merge
的結果:
被merge的分支和當前分支在圖形上併爲一條線,被merge的提交點逐一合併到當前分支。
git merge --no-ff
的結果:
被merge的分支和當前分支不在一條線上,被merge的提交點還在原來的分支上,同時在當前分支上產生一個合併點。這樣在回滾時很是方便,版本樹也很清晰。
git rebase
通常解釋爲變基
,也有解釋爲衍合
,我的以爲變基
比較容易理解。
git merge
是把兩個分支的代碼合併到一塊兒,其實git rebase
也是相同的做用,可是表現上是兩種不一樣的形式。
例如如今 dev 提交了一次,master 在此以後也提交了一次,兩個分支的狀態以下:
能夠看出git merge
後,不管加不加--no-ff
參數,提交點的順序都和提交的時間順序相同,即 master 的提交在 dev 以後,如圖:
而git rebase
後,順序就變成被rebase
的分支(master)全部提交都在前面,進行rebase
的分支(dev)提交都在被rebase
的分支以後,在同一分支上的提交點仍按時間順序排列,如圖:
從上面的圖能夠看出,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
,理由下面會說。
在通常狀況下,加與不加--rebase
是沒有區別的。然而,結合上面說的git rebase
功能,能夠知道某個分支可能與其遠程分支發生分離,而當你pull
時,你的本地分支仍是和原來的遠程分支同樣,這時若是使用git pull
,則會變成你的本地分支和遠程分支合併,正確的作法是git pull --rebase
,纔會拉取到最新的分支。
因此推薦在任什麼時候候pull
遠程分支,最好加上--rebase
參數。
查看提交記錄的命令是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複製代碼