使用Git修改合并冲突

时间:2018-06-20 19:14:34

标签: git

我的故事是我从分支feature/bar开始,进行了更改并提交。

然后我从该分支签出到feature/foo,进行一些更改并提交。

然后我回到feature/bar,进行更多更改并提交。

现在,当我结帐到feature/foo并合并feature/bar时,我遇到了冲突。

但是我不想在feature/foo中创建另一个提交消息。我想使用git amend,所以我的更改日志将保持干净。

我该怎么办?

1 个答案:

答案 0 :(得分:2)

  

我的故事是我从分支功能/栏开始,进行了更改并提交。然后,我从该分支签出到feature / foo,进行了一些更改,然后提交。然后我返回到功能/栏,进行更多更改并提交。

Git历史记录是一个图形,因此让我们将其绘制出来。您的存储库如下所示。

A - B - E - F [feature/bar]
     \
      C - D [feature/foo]

foobar具有分歧表示自子分支以来父分支中已有提交。这很正常。

  

现在,当我结帐到feature / foo并合并feature / bar时,发生冲突。但是我不想在feature / foo中创建另一个提交消息。

与其通过合并更新分支,不如通过rebase更新分支。假装您的分支始终写在当前foo的顶部,从而简化了流程。

git merge feature/bar为您提供了此功能。如果做得足够多,历史就会变得混乱。

A - B - E - F [feature/bar]
     \       \
      C - D - E [feature/foo]

git rebase feature/bar为您提供了这个...

A - B - E - F [feature/bar]
             \
              C1 - D1 [feature/foo]

Git在feature/foo当前提示的顶部重播feature/bar中的每个提交。因此,看来feature/foo是在最新的feature/bar上开发的。没有不必要的合并提交。

任何冲突都在发生冲突的地方进行处理。因此,如果您在C中进行更改而发生冲突,Git将停止,允许您重写提交并继续。

请注意,这些是具有新提交ID的新提交。如果您以前曾推过feature/foo,则必须用git push --force推它。


在处理完分支并准备好合并后,请使用git merge --no-ff feature/foo以确保存在合并提交。

A - B - E - F -------- G [feature/bar]
             \       /
              C1 - D1 [feature/foo]

您希望此合并提交保留记录哪些提交被分组为一个功能的记录。您可以使用提交消息来记录有关分支的信息,例如问题跟踪器的链接。当您git branch -d feature/foo分支时,该功能提示框仍然存在,以帮助将来的代码考古学家。

A - B - E - F -------- G [feature/bar]
             \       /
              C1 - D1

并且由于您使用rebase更新了分支,因此尽管历史上有分支,但实际的git历史和线性历史是相同的。 git log将按照预期的线性顺序G,D1,C1,F,E,B,A输出变化,从而使历史记录易于理解。