1. 程式人生 > >Git 學習筆記 - 17 - Rebase

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 authord1be385 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的目的是使得我們在檢視歷史提交的變化時更容易,因為分叉的提交需要三方對比。