2016-02-25 38 views
1

我想通過使用rebase而不是merge來避免在遠程存儲庫上出現經常性分支交叉點。Git rebase而不是合併,正確的方法來做到這一點?

爲了讓大家更好的瞭解我想實現什麼,請考慮以下情況:

$ git lg 
* 2345678 hotfix (HEAD -> master) 
* 1234567 foo (origin/master, origin/HEAD) 

$ git push 
! [rejected] master -> master (fetch first) 

$ git fetch 
$ git lg 
* 2345678 hotfix (HEAD -> master) 
| * 3456789 other change (origin/master, origin/HEAD) 
|/ 
* 1234567 foo 

通常情況下,解決這個問題的標準方式是merge後跟一個push

$ git merge origin/master 
$ git lg 
* 4567890 Merge remote-tracking branch 'origin/master' 
|\ 
* | 2345678 hotfix (HEAD -> master) 
| * 3456789 other change (origin/master, origin/HEAD) 
|/ 
* 1234567 foo 
$ git push 

我不喜歡這個解決方案,因爲我可以很容易地避免在這種特殊情況下的分支。所以,讓我們恢復更改與git reset --hard head~1並嘗試另一種解決方案,而不是:

$ git rebase origin/master 
First, rewinding head to replay your work on top of it... 
Applying: hotfix 

$ git lg 
* 2345678 hotfix (master) 
| * 5678901 hotfix (HEAD) 
| * 3456789 other change (origin/master, origin/HEAD) 
|/ 
* 1234567 foo 

現在到了不愉快的部分在那裏我有我的master遷回其HEAD

$ git branch -D master 
$ git checkout -b master 
$ git push 
$ git branch --set-upstram-to=origin/master master 
Branch master set up to track remote branch master from origin. 
$ git lg 
* 5678901 hotfix (HEAD -> master, origin/master, origin/HEAD) 
* 3456789 other change 
* 1234567 foo 

我的問題是如何能我簡化了我的rebase並避免了不愉快的部分?

回答

3

我認爲最簡單的方法就是改變拉動工作流程。這裏有幾個選項。

首先,你可以使用--rebase標誌拉

git pull --rebase 

%的文檔,git pull執行fetch,隨後在其默認配置merge。使用--rebase標誌將取代mergerebase :)

其次,你可以設置默認爲始終以git pull

git config --global pull.rebase true 

做到這一點,我建議第一種方法,如設置底墊的默認讓我緊張。我爲git pull --rebase創建了一個別名git pr以使其更容易。這樣我可以做出每次拉動的決定。

2

問題是您直接在本地的主分支上工作。當您對主分支進行一些本地更改並且開始後也存在上游更改時,將會出現像您在問題中所述的衝突。因此,避免這種情況的解決方案僅僅是不直接在主分支上工作,而是在一個或多個其他本地分支上工作。

因此,您將修補程序更改放在單獨的分支上,例如hotfix_branch,然後正常讀取/拉出主分支(沒有任何衝突!)。當您想要傳遞修補程序更改時,您將重新綁定該修補程序分支以停留在新提取的主分支之上,將修補程序分支合併到主服務器和推送服務器。

示例命令:

$ git pull master 
$ git checkout -b hotfix_branch master 
$ $EDITOR some.file 
# Time passes and changes are made on origin/master 
$ git add some.file 
$ git commit -m "hotfix" 
$ git pull master       # No conflicts sine master is "clean" 
$ git rebase master hotfix_branch  # This step might have merge conflicts but 
             # if so those will come no matter what you 
             # do with regards to branching 
$ git checkout master 
$ git merge hotfix_branch 
$ git push 

有一個小窗口,在其中間你拉有可能出現在origin/master的新變化,並試圖推動主,但如果是這樣,你只需要做

$ git checkout master     # if not already on the master branch 
$ git reset origin/master 

然後再次從第二個pull master命令開始在上面的列表中。

相關問題