2015-02-09 173 views
11

当我处理两个不同的功能时(在主文件夹中创建的两个不同的分支上),我非常讨厌在继续合并时没有提交历史记录。在'git合并'后保留提交历史记录

我会解释得更好。当我完成Branch-A的工作时,我将它合并为主文件。这很好,如果我git log我看到我在Branch-A上所做的所有提交。

相反,当我完成工作就科-B和我尝试将其合并到(后科-A已被合并),我必须指定提交消息合并(而对于第一个分支我没有被问到任何东西)。 并合并到后,如果我输入git log,我无法看到科-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... 

......这将更准确地反映所执行的提交的历史记录。

我不明白为什么我可以保留两个分支之一的历史。

我怎样才能保持一切清除没有这些合并提交隐藏/省略了合并提交的真实历史?

回答

0

使用rebase而不是merge。从tutorial

如果检查衍合分支的日志,它看起来像一个线性 历史:似乎所有的工作发生在系列中,即使它最初 发生在平行。

我想,从您的Branch-B的变化不能用快进合并到master合并。在这种情况下,three-way-merge完成:

而不是仅仅移动分支指针向前,Git会创建一个新的 快照,从这个三方合并的结果,并自动 创建一个新的承诺,它指向它。这被称为合并 提交,并且是特殊的,它有多个父代。

我会在将它们提交到master以保持线性历史记录之前始终将我的提交重新绑定。

11

看起来第一次合并是快进,第二次合并是三次合并。

说明

Git有合并的两个版本:快进和三通。 (还有其他版本,但这不是发生在这里的情况。)默认行为是在可能的情况下执行快进合并,否则执行三向合并。

当正在合并的提交的当前位置为当前位置时,可以进行快进合并(可以使用选项--ff-only强制此行为,这会导致合并在无法快进时失败)它的历史分支。例如:

A - B - C - D <-master 
      \ 
       E - F - G <- branch-a 

Excecuting git merge(默认设置),将导致

A - B - C - D - E - F - G <- branch-a <-master 

你也不会得到一个机会来编辑合并提交,因为是没有的。然而,一旦发生这种情况,您的另一支将主发散(不只是提前):

A - B - C - D - E - F - G <-master 
        \ 
        E1 - E2 <- branch-b 

因此,GIT中不能只移动主的指针从GE2,因为这将摆脱的变化是在FG中制成。相反,会发生三方合并,这会创建一个具有两个父代的提交,并且还具有提交消息。现在,主人可以移动到此提交。 (请注意,在这种情况下,主机和支路B切勿指向同犯。

A - B - C - D - E - F - G - H <-master 
        \  /
        E1 - E2 <- branch-b 

如果你想有那么一个线性的历史,你需要使用底垫中,但事先警告,如果任何人有看到你的分支提交,这可能会导致超出这个答案范围的问题,使用rebase将涉及到两个步骤,重新绑定和快速合并,所以,而不是合并你在分支-bgit rebase master。这创建了新的提交,它们是旧提交的副本,即相同的变更集,作者信息和消息,但新提交者信息和父历史记录(我将图中的提交E1'和E2'称为表明他们只是副本。)T他老的提交会一直存在,直到他们是垃圾回收,但除非你看看引用日志将是不可到达的。)

A - B - C - D - E - F - G <-master 
        \  \ 
        E1 - E2 \ 
          E1' - E2' <- branch-b 

执行git checkout master; git merge --ff-only branch-b现在快进你变成主人,从而给你一个线性的历史。

A - B - C - D - E - F - G - E1' -E2' <-master <- branch-b 
+0

我需要将'master'合并到'branch-b',当我在两者中都有变化时。我如何重写'branch-b'就像从'G'开始,而不是'E'?但保留'branch-b'的提交历史并将更改提交到'branch-b'是冲突。假设我只有一个知道'branch-b'的人。 – hlcs 2017-03-17 20:51:18

+0

Nvm它确切'git rebase master'。 – hlcs 2017-03-17 21:28:12

相关问题