Git 學習筆記 - 17 - Rebase
Git 學習筆記 - 17 - Rebase
注:本文參照的是廖雪峰老師的Git教程
概述:
之前有用到 git log --graph --pretty=oneline --abbrev-commit
命令去檢視分支變化的軌跡,我們可以看到整個軌跡是彎彎曲曲的,特別是經歷了多人協作後,遇到衝突問題,先pull下來,然後push上去,會變得更加難看,要想強迫這個軌跡變得整潔一點,可以使用 rebase 命令。
我這邊在dev上新建了一個分支testhello,然後在這個testhello分支上修改hello.py檔案,然後合併到dev分支上去,然後又合併到master分支上,加上之前的操作,看起來就有點彎彎曲曲了。
ps:其中在合併到master分支上時,進入了一個我沒怎麼注意的介面,沒看懂,然後我就直接輸入 :Q!
就退出了,不過沒影響合併。
ps:我擦,我沒使用 --no-ff 的,直接把dev給合併上去了…
操作:
教程上說的是多人協作引起的軌跡不好看:
在和遠端分支同步後,我們對hello.py
這個檔案做了兩次提交。用git log
命令看看:(還是之前的帶引數的老命令)
* 582d922 (HEAD -> master) add author * 8875536 add comment * d1be385 (origin/master) init hello * e5e69f1 Merge branch 'dev' |\ | * 57c53ab (origin/dev, dev) fix env conflict | |\ | | * 7a5e5dd add env | * | 7bd91f1 add new env ...
注意到Git用(HEAD -> master)
和(origin/master)
標識出當前分支的HEAD和遠端origin的位置分別是582d922 add author
和d1be385 init hello
,本地分支比遠端分支快兩個提交。
現在我們嘗試推送本地分支:git push origin master
To github.com:michaelliao/learngit.git
! [rejected] master -> master (fetch first)
error: failed to push some refs to '[email protected] :michaelliao/learngit.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
很不幸,失敗了,這說明有人先於我們推送了遠端分支。按照經驗,搞定它,這時加上剛才合併的提交,現在我們本地分支比遠端分支超前3個提交。
用git log --graph --pretty=oneline --abbrev-commit
看看:
* e0ea545 (HEAD -> master) Merge branch 'master' of github.com:michaelliao/learngit
|\
| * f005ed4 (origin/master) set exit=1
* | 582d922 add author
* | 8875536 add comment
|/
* d1be385 init hello
...
對強迫症童鞋來說,現在事情有點不對頭,提交歷史分叉了。如果現在把本地分支push到遠端,有沒有問題?
有!
什麼問題?
不好看!
有沒有解決方法?
有!
這個時候,rebase就派上了用場。我們輸入命令git rebase
可以整理。
ps:測試失敗,後續想了想或許我應該在master上造一個衝突,這樣的話或許會看到結果。
總結:
- rebase操作可以把本地未push的分叉提交歷史整理成直線;
- rebase的目的是使得我們在檢視歷史提交的變化時更容易,因為分叉的提交需要三方對比。