2014-01-09 51 views
0

我已經合併一個分支到主:我已經合併了一個分支,但並非所有更改都已合併?

git checkout master 
git merge work_branch 

有一些衝突,我決心和承諾,但也有一些變化,這沒碰到過來,我想不通爲什麼。

如果我做git checkout work_branch我可以看到該文件views.py不同於master,但如果我不git merge work_branchmaster我得到Already up-to-date.這是怎麼回事?我想masterwork_branch相同。

+0

你在主內的任何東西上運行'git revert'?例如,你有意/無意地將'work_branch'合併爲'master',然後'git revert'合併? – asm

+0

@AndrewMyers是的,我意外地合併和恢復了。 – fredley

回答

1

比方說你有,你的合併

A -- B -- C -- F 
\   /L master 
    \- D -- E--/ 
      L work_branch 

後,如果您提交B改變views.py,如果你不改就work_branch,那麼它是

  • 你不必是正常的」 t在合併時在該文件上有衝突
  • 兩個分支上的文件不會相同(即:在提交EF之間)
  • 再次合併work_branch沒有意義,因此Already up-to-date

如果你想master是酷似work_branch(即:像犯E),你可以做,在你的回購

git checkout master 
git checkout work_branch -- . 
git commit --all 

編輯的根跟進評論:

另一方面,如果您僅在提交E(即:既不在B也不在C)更改views.py,則它是s eems很奇怪,EF上的文件不一樣。

如果您沒有推/分享您的合併提交,你可能要重新合併,在以前的情況下發生操作錯誤:

git checkout C 
git branch -f master 
git checkout master 
git merge work_branch 
+0

我的問題是,提交E中的工作尚未合併到master中,即多個來自'work_branch'的提交尚未合併。 – fredley

0

我假設你不熟悉Git的工作流程。

您可能還沒有在您的work_branch承諾。確保您已在work_bench中完成您的工作。

當你已經解決了衝突,請確保你沒有git add views.py之前git commit或者乾脆git commit-a選項(我總是忘記這樣做)

如果你幫助,你做的一切都是正確的,我想我需要了解您的回購日誌以確定發生了什麼事情。

0

git merge執行三向合併您正在分支和您合併的分支之間。這意味着,大致上,git:

  1. 標識共同的祖先提交;由masterwork_branch共享的「最近」提交;
  2. 生成一個祖先和master,而且祖先和work_branch之間一個diff之間的差異。這些差異描述了在每個分支上完成的工作。
  3. 應用來自work_branch每個DIFF不會與一個在master衝突。

所以,在一個分支合併不會使你在相同你合併在一個分支,它可以讓你有所有的工作從兩側一個新的狀態。

如果你真的想要做的真的是什麼讓一個分支相同的另一種,你可以(在您有master檢出):

  1. 使用git checkout work_branch -- .在頂級目錄,使你的工作副本完全是它在work_branch中的狀態,並提交這些更改。 (您也可以爲單個路徑或目錄執行此操作)。這將在master的現有歷史記錄中創建一個新的提交,以引入更改以使其相同。或者:
  2. 使用git reset --hard work_branch當你在master。這用work_branch代替master的歷史。
+0

我有一種感覺,這是因爲我以爲我知道我在用'rebase'做的事情,但沒有... – fredley

+0

啊,那可能是這樣的;通常發生這種情況是因爲分支地形與您認爲的不同。你可以使用'git log -p master^work_branch'和'git log -p work_branch^master'查看合併的每一面的提交和補丁,或者'git log --oneline --decorate --graph master work_branch'來查看ASCII藝術中的分支關係。 –

+0

由於'rebase',我的工作分支與主人提交的日期一致,因此我使用@gturri的提示來覆蓋所有內容,儘管感謝提示。 – fredley

0

既然您注意到您之前已有git reverted我認爲您與合併與還原之間的交互發生衝突。 git revert通過創建一個新的提交來完成撤消恢復的提交。比如說你有以下的樹。

A -- master 
| B -- work_branch 
| | 
|/
M -- Merge work_branch to master. 
| 
C -- New commit on master. 
| 
M' -- git revert M (undoes B) 

在這種情況下,你合併work_branchmaster,然後提交新的東西master對合並的頂部,然後再決定你work_branch沒有準備好master呢。你現在有幾個選擇來解決這個問題。

  • git reset --hard回犯A,然後git cherry-pick Cmaster
  • git rebase -i回A和刪提交M
  • git revert M它創建提交M'

前兩個選項基本上相當於他們只是有不同的工作流程。最後一個選項讓你既M並在歷史上新的提交M'其中M'包含正好撤消一切創造M在合併過程中帶來的變化。

的問題,當你決定work_branch現在已經準備好,並要進行合併發生。當你做合併你不會得到work_branch發生在MM'發生的任何變化。爲了恢復變更,您必須刪除提交M'對您的歷史記錄的影響。你有幾個選項,他們基本上是相同的,但現在你試圖刪除M'

最簡單的事情很可能是恢復恢復提交。所以git revert M'再次合併work_branch之前。這也將在重新編號work_branch後生效,但它可能會導致以前不會得到的衝突。這會得到你喜歡的東西:

A -- master 
| B -- work_branch 
| | 
| /| 
M |  -- Merge work_branch to master. 
| | 
C | -- New commit on master. 
| | 
M' D  -- git revert M (undoes B) 
|/
F  -- git merge work_branch (You see changes from D, but not B) 
| 
M'' -- git revert M' (undoes M', you now see changes from B) 
相關問題