当我处理两个不同的功能(在从母版创建的两个不同的分支上)时,很烦人的是,我继续进行合并时将没有提交历史记录。
我会更好地解释。当我完成分支A的工作时,我将其合并为master。很好,如果我git log
,我可以看到我在Branch-A上所做的所有提交。
代替,当我完成Branch-B的工作并尝试将其合并到master(在Branch-A已被合并之后)时,我必须为合并指定提交消息(而对于第一个分支,我有没有被问到任何东西)。
合并到master之后,如果我键入git log
,则在master分支的历史记录中看不到Branch-B的提交
假设我有
**Branch A**
commit 09b2unfas9d781n2e
Add more stuff
commit 8uj8masd89jas898a
Add stuff
**Branch B**
commit 09b2unfas9d781n2e
Add feature setting
commit 8uj8masd89jas898a
Add feature
我完成了
**Master**
commit 6hf6h8hd871udjkdn
Merge: 09b2un 34osd6
Merge branch 'Branch-B' into master
commit 09b2unfas9d781n2e
Add more stuff
commit 8uj8masd89jas898a
Add stuff
commit 34osd62dhc91123j8
I'm a previous commit from 'master'.
The last one before branching...
而我想获得,例如:
**Master**
commit 09b2unfas9d781n2e
Add feature setting
commit 8uj8masd89jas898a
Add feature
commit 09b2unfas9d781n2e
Add more stuff
commit 8uj8masd89jas898a
Add stuff
commit 34osd62dhc91123j8
I'm a previous commit from 'master'.
The last one before branching...
...这将更准确地反射(reflect)已执行提交的历史记录。
我不明白为什么我只能保留两个分支之一的历史记录。
如果没有那些隐藏/忽略合并提交的真实历史的合并提交,我如何保持所有内容的清晰?
最佳答案
看起来第一个合并是快速前进,而第二个合并是三路合并。
说明
Git有两种合并方式:快进和三向。 (还有其他版本,但这不是这里发生的事情。)默认行为是在可能的情况下进行快进合并,否则进行三向合并。
当正在合并的提交在其历史记录中具有分支的当前位置时,可以进行快速合并(可以使用--ff-only
选项强制执行此操作,这将在无法进行快速合并时导致合并失败) 。例如:
A - B - C - D <-master
\
E - F - G <- branch-a
执行
git merge
(使用默认设置)将导致A - B - C - D - E - F - G <- branch-a <-master
您也将没有机会编辑合并提交,因为没有提交。但是,一旦发生这种情况,您的另一个分支将与master分支(不仅仅是向前):
A - B - C - D - E - F - G <-master
\
E1 - E2 <- branch-b
因此,Git不能仅将master的指针从
G
移到E2
,因为这将摆脱对F
和G
进行的更改。相反,会发生三向合并,这将创建具有两个父级的提交以及一个提交消息。现在,可以将master移至该提交。 (请注意,在这种情况下,master和branch-b不会指向同一提交。A - B - C - D - E - F - G - H <-master
\ /
E1 - E2 <- branch-b
如果您希望拥有线性历史记录,则需要使用rebase,但是请注意,如果其他人看到您的分支提交,则可能导致超出此答案范围的问题。使用变基将涉及两个步骤,变基,然后快速合并。因此,与其合并,不如先在分支-b 和
git rebase master
上执行以下命令。这将创建新的提交,这些新的提交是旧提交的副本,即,相同的更改集,作者信息和消息,但是新的提交者信息和父历史记录。 (我在插图中将提交E1'和E2'表示为副本。)旧提交将一直存在,直到被垃圾回收为止,但是除非您查看reflog,否则它们是无法访问的。A - B - C - D - E - F - G <-master
\ \
E1 - E2 \
E1' - E2' <- branch-b
现在,执行
git checkout master; git merge --ff-only branch-b
会将您的更改快速转发到master,从而为您提供线性历史记录。A - B - C - D - E - F - G - E1' -E2' <-master <- branch-b