当我处理两个不同的功能(在从母版创建的两个不同的分支上)时,很烦人的是,我继续进行合并时将没有提交历史记录。

我会更好地解释。当我完成分支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,因为这将摆脱对FG进行的更改。相反,会发生三向合并,这将创建具有两个父级的提交以及一个提交消息。现在,可以将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

08-28 00:55
查看更多