我合并了一个分支,但并非所有的变化都合并了?

时间:2014-01-09 15:10:52

标签: git

我已经将一个分支合并为主人:

git checkout master
git merge work_branch

我解决并承诺了一些冲突,但是有些变化没有发现,我无法弄清楚原因。

如果我git checkout work_branch我可以看到文件views.pymaster不同,但如果我git merge work_branch master,我会Already up-to-date. master 1}}这里发生了什么?我希望work_branch与{{1}}相同。

4 个答案:

答案 0 :(得分:1)

在你合并之后,假设你有。

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

如果您的提交B更改views.py,并且您未在work_branch上更改,那么

是正常的
  • 合并时,该文件没有冲突
  • 两个分支上的文件不一样(即:提交EF之间)
  • 再次合并work_branch没有意义,因此Already up-to-date

如果您希望masterwork_branch完全相同(例如:像提交E),您可以在回购的根目录下执行

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

编辑后续评论:

另一方面,如果你只改变了提交views.py中的E(即:B上也没有C),那么似乎很奇怪EF上的文件不一样。

如果您没有推送/共享合并提交,则可能需要重试合并,以防先前发生操作错误:

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

答案 1 :(得分:0)

我认为您不熟悉Git工作流程。

您可能尚未在work_branch中投放。确保您已在work_bench中提交了作品。

解决冲突后,请确保您git add views.py之前git commitgit commit-a选项(我总是忘记这样做)

如果你帮助你做了一切正确的事情,我想我需要知道你的回购日志,看看确实发生了什么。

答案 2 :(得分:0)

git merge在您所在的分支和您合并的分支之间执行三向合并。这意味着,粗略地说,git:

  1. 标识共同的祖先提交; masterwork_branch;
  2. 共享的“最近”提交
  3. 在祖先和master之间生成差异,并在祖先和work_branch之间产生差异。这些差异描述了在每个分支上完成的工作。
  4. 应用work_branch中与master上的差异不冲突的每个差异。
  5. 因此,在分支中合并不会使您与其合并的相同的分支,它会为您提供一个新的状态,其中包含所有工作双方

    如果你真正想要做的是让一个分支与另一个分支相同,你可以(当你master签出时):

    1. 在顶级目录中使用git checkout work_branch -- .使您的工作副本完全处于work_branch中的状态,并提交这些更改。 (您也可以为单个路径或目录执行此操作)。这将在master的现有历史记录中创建一个新提交,引入更改以使其相同。或者:
    2. git reset --hard work_branch时使用master。这会将master的历史记录替换为work_branch

答案 3 :(得分: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_branch合并到master,然后在合并之前向master提交新内容,然后确定work_branch尚未准备好master {1}}。您现在有几个选项可以解决此问题。

  • git reset --hard返回提交A,然后git cherry-pick C返回master
  • git rebase -i返回A并删除提交M
  • git revert M创建了提交M'

前两个选项基本相同,只是有不同的工作流程。最后一个选项会在您的历史记录中同时显示M和新提交M',其中M'包含完全撤消在创建{{1}的合并期间带来的所有内容的更改}

当您确定M现已准备好并且您想要合并它时,就会出现问题。当您执行合并时,work_branch中的work_branch发生的任何更改都不会被M 撤消。要获得更改,您必须删除提交M'对您的历史记录的影响。您还有两个选项,它们基本相同,但现在您尝试删除M'

最简单的做法很可能是恢复还原提交。在再次合并M'之前git revert M'。这也可以在重新合并work_branch之后起作用,但它可能会导致您以前执行此操作时无法获得的冲突。这将使你得到类似的东西:

work_branch
相关问题