2011-06-22 44 views
2

假設我有以下情況:git-rebase:收斂兩個不同的分支/庫

存在User Foo的存儲庫主。用戶欄會分散這個存儲庫,因此這兩個存儲庫都是同步的。現在,用戶欄實現了一個功能並創建了一個名爲「barbranch」的本地分支。當用戶Bar完成一個特性的時候,Foo提交併推送了一些東西到主存儲庫。所以基本上這樣的情況如下:

A---B---C---D main repository 
     \ 
      E  forked repository (where C=E) 
      \ 
      F barbranch on forked repository 

現在在用戶Foo的回購中如何恢復正常?

天真,我會說:

# switch to the local master and merge barbranch into it 
git checkout master 
git pull 
git pull upstream 
git push 
git merge barbranch 
# merge conflicts occur 
vi somefile 
git commit -a 
git rebase origin master 
# this conflict occurs again 
vi somefile 
git commit -a 
git status # says I'm on (no branch) ?! 
git push 
g it checkout master 
# conflict occurs again! 
vi somefile 
git commit -a 
git push 
# send merge request to user Foo 

最後這給了我三醜承諾,而不是一個。我發現。雖然我無法弄清楚確切的命令是什麼,整個過程最終會如何。

回答

2

它取決於你想得到的樹。

如果你想代表真正的工作歷史上的樹,你不應該用「變基」,但如果你想「線性化」與重訂工作的唯一的「合併」

# on bar repo 
git fetch upstream 
git checkout master 
git merge upstream/master (fast-forward) 
git merge barbranch 
# resolve conflicts (adding resolved files) 
git commit 
git push upstream master 

,這裏就是你應該這樣做:

# on bar repo 
git fetch upstream 
git checkout master 
git merge upstream/master (fast-forward) 
git checkout barbranch 
git rebase master 
# resolve conflicts + commits (each commit will be processed separately: so you may need to do that several times if various commits are in conflict with the upstream) 
git checkout master 
git merge barbranch **(fast-forward after the rebase)** 
git push upstream master 
+0

謝謝,是的,我想要「線性化」版本。只是爲了澄清一下:我在哪個分支上執行'git fetch upstream'? 「解決衝突+提交」的每一步最後都是'vi somefile; git commit -a',對吧? – user694971

+1

您可以從任何地方獲取。爲每個衝突文件+最終的「git commit」解決衝突=(「vi」+「git add resolved_file」)。當多個文件發生衝突時,這種方式會更好:您可以每次都知道哪些衝突文件尚未使用「git status」解決。 –

+0

這真的很奇怪,我收到[this]這樣的消息(http://pastebin.com/NFirzz6g)。雖然這個分支已經在問題的補丁被接受之前創建... – user694971

2

我認爲以下情況應該適合您的情況。

  • 結帳主
  • 拉動分叉處到本地主
  • 手動修復的衝突
  • 提交關於解決衝突的變化
  • 推掌握

這實際上導致3次提交到您的主人(您將有提交E & F和您的衝突解決委員會T)。