我的故事是我从分支feature/bar
开始,进行了更改并提交。
然后我从该分支签出到feature/foo
,进行一些更改并提交。
然后我回到feature/bar
,进行更多更改并提交。
现在,当我结帐到feature/foo
并合并feature/bar
时,我遇到了冲突。
但是我不想在feature/foo
中创建另一个提交消息。我想使用git amend
,所以我的更改日志将保持干净。
我该怎么办?
答案 0 :(得分:2)
我的故事是我从分支功能/栏开始,进行了更改并提交。然后,我从该分支签出到feature / foo,进行了一些更改,然后提交。然后我返回到功能/栏,进行更多更改并提交。
Git历史记录是一个图形,因此让我们将其绘制出来。您的存储库如下所示。
A - B - E - F [feature/bar]
\
C - D [feature/foo]
foo
和bar
具有分歧表示自子分支以来父分支中已有提交。这很正常。
现在,当我结帐到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输出变化,从而使历史记录易于理解。