Git: 四種將分支與主線同步的方法
19 Jun 2018四種將分支與主線同步的方法
git pull origin master
git fetch origin master; git merge origin/master
git fetch origin master; git rebase origin/master
git fetch origin master; git cherry-pick origin/master
先來做名詞解釋和看一些範例。
名詞解釋
- master:本地分支名。
- origin master:origin 表示遠端,master 表示分支名,接在 origin 之後表示是遠端分支名。
- origin/master:遠端分支在本地的拷貝,因此稱為本地分支。
範例
git fetch origin master
:取得遠端分支 master 的資料。git merge origin/master
:合併本地分支 origin/master 的程式碼。git push origin master
:將本地提交紀錄推至遠端分支 master。
看更多。
說明
方法一:git pull
- Step 1:切換到新分支。
- Step 2:從遠端更新程式碼,並將 master 合併至新的分支。HEAD 指向新分支的程式碼。
$ git checkout <new_branch>
$ git pull origin master
以上作法同方法二:git fetch
+ git merge
。
加入參數 --rebase
,這樣就會以 rebase 的方式合併(同註一)。
- Step 1:切換到新分支。
- Step 2:在分支
<new_branch>
合併從遠端更新完畢後的 master 的程式碼,並以 rebase 的方式合併。HEAD 指向 master 的程式碼。
$ git checkout <new_branch>
$ git pull origin master --rebase
方法二:git fetch
+ git merge
- Step 1:取得遠端資料並更新本地 master 程式碼。
- Step 2:將 master 的程式碼合併至新分支中。HEAD 指向新分支的程式碼。
$ git fetch origin master
$ git checkout master
$ git merge origin/master
$ git checkout <new_branch>
$ git merge master
以下是更簡單的作法,不更新本地 master 分支,直接與本地分支 origin/master 合併。
$ git fetch origin master
$ git merge origin/master
方法三:git fetch
+ git rebase
- Step 1:取得遠端資料並更新本地程式碼。
- Step 2:切換到新分支,新分支以 master 為新的基準點,將分支所修改的程式碼紀錄接在後面。HEAD 指向新分支的程式碼。
$ git fetch origin master
$ git checkout master
$ git merge origin/master
$ git checkout <new_branch>
$ git rebase master
也可以這樣寫,不切換到新分支,直接指定新的基準點。
- Step 1:取得遠端資料並更新本地 master 程式碼。
- Step 2:以 master 為新的參考基準點,將分支
<new_branch>
的修改接在新的基準點後。
$ git fetch origin master
$ git checkout master
$ git merge origin/master
$ git rebase master <new_branch>
以下是更簡單的作法,不更新本地 master 分支,直接以 origin/master 為新的基準點,將新分支所修改的程式碼紀錄接在後面。
$ git fetch origin master
$ git rebase origin/master
註一
方法三的意義等同於 git pull origin master --rebase
。
方法四:git cherry-pick
- Step 1:從遠端取得更新,接著切換到新分支。
- Step 2:使用 cherry-pick 將目前 origin/master 所在位置與新分支差異的提交紀錄揀選(合併)至新分支,並需要建立一個提交紀錄來儲存這些變更。
$ git fetch origin master
$ git checkout <new_branch>
$ git cherry-pick origin/master
但不建議使用這個方法,因為在 graph 中並不會顯示合併,而是將 master 的某些提交紀錄「揀選」到新分支形成分岔。並且,之後若要合併回主線,仍須再解一次衝突。解完 conflict 後若無差異,則會回到使用 cherry-pick 合併後的狀況(註 2)。由於找不到類似的資料,因此在這裡提問。
註 2
之後要合併回主線仍需使用前三種方法,例如:使用 git pull origin master
,這樣就會形成一個小耳朵,表示回到主線了。