2017-06-21 83 views
0

说我这样做如下操作:如何在恢复后提交相同的提交,同时保留提交信息?

git init 
touch initial && git add initial && git commit -m "Initial commit" 
git checkout -b A 
touch test_1 && git add . && git commit -m "Commiting test 1"                                                          NORMAL 
touch test_2 && git add . && git commit -m "Commiting test 2"                                                          NORMAL 
git checkout master 
git merge --no-ff A 
git revert -m 1 head 

现在,恢复这些提交,变化的东西后,我决定,我再次想这些提交。我不能再做git merge A,因为那些提交已经在分支中。

我宁愿不做git revert head,因为当有人跑git blame时,他们会看到Revert "Revert "Merge branch 'A'""这不是特别有用。所以我想要保留原始提交的提交消息/正文。

我的破解是在A上运行git rebase,并稍微修改了第一次提交的消息,因此提交的哈希值已更新,我可以再次合并,但必须有更好的方法来完成同样的事情。

回答

0

你能恢复的还原:

git revert <commit sha of the revert> 

另一种选择是樱桃采摘两次提交之间的差异:

git cherry-pick master...dev 

最后,你也可以把差异变成补丁然后应用它:

git diff commit1 commit2 > some.patch 
git apply some.patch 
+0

我宁愿不恢复恢复(请参阅问题为什么)。你能更具体地说明我将如何使用樱桃挑选?可以肯定的是,我不能做'git cherry-pick master ... A',因为最后一次提交是樱桃挑选不喜欢的合并。 –

+0

我已经添加了修补程序选项,也许您可​​以使用它在您选择的提交之间创建一个修补程序。 – hurturk

0

恢复恢复比在脚下改变更多信息sudde通过改版而无需解释。

记住:

  • revert保留提交信息,并有效地创建一个反向的补丁,这就是为什么Git把合并后的分支,拒绝,直到复归回复到重新合并。

  • rebase删除历史。除非有必要,否则不想删除历史记录。

+0

要清楚,我没有在主人身上运行rebase。我在A上运行它,然后将A合并回主。 –

+0

这更糟糕。当回复已经引入了自己的混乱时,它会让你的Git历史混乱。你最好坚持回复。 – Makoto

+0

为什么更糟?我弄乱的唯一git历史记录是在功能分支上,它不需要一致的历史记录。 –

0

确实,绊倒一系列回复 - 回复是令人讨厌的。

(更糟糕的是,在一次冲刺中,有一段代码路径,我认为总共有六个恢复级别,我看过去了。幸运的是,这个分支不适合发布。)

默认情况下,恢复记录它正在恢复的提交的哈希ID,因此您可以简单地明确选择原始提交(也可以编辑消息以指出它在恢复后重新导入)。这甚至可以通过提供-m参数进行合并,尽管这里偶尔会出现一些边界情况(所以要小心结果)。

或者 - 更安全 - 恢复合并的恢复,但是然后编辑提交消息以提供更多信息。您可以将git revert命令或git commit --amend恢复恢复提交使用-e/--edit(这是默认设置),以将其复制到具有改进的提交消息的新的改进的提交。