如何检出旧的提交并将其提交给新的提交

我想跟随另一个关于这个问题的问题:“签出旧的提交并将其作为新的提交

但他们说:“不要那样做!” 所以似乎我必须提出一个新问题。 (尽管我认为对我来说最好的答案不是按照预期的那样工作,而是同一个问题......

如果我提交了ABCDEF (想象这些都是SHA的)。 我想将整个存储库完全保存为C ,然后提交它以创建与C完全相同的'G' 。 所以当我完成时,即使C&G是相同的,日志也是ABCDEFG。

一个答案表明樱桃挑选,这似乎是完美的,但它使我解决了CF之间的每一个冲突。 我看了看文件,我试图--force无论如何,然后推荐--patch--patch是最接近的,但它不是绝对的。 那么有没有办法让樱桃挑选只选择C版本的冲突?

另一个最接近的答案是签出C ,但是我找不到将它保留在同一分支上的魔术字。 在最近的训练我完成说用“神奇短跑冲刺”末告诉git你想这个对当前分支,但无论我做什么,它会创建一个“(无分支)”分支。

我相信你可以告诉我,我对git(以及一般的命令行)很陌生,但我试图自己弄清楚。 如果你可以使用你推荐的详细版本,那么它会更好地坚持在我的头上,将不胜感激。 ( -a = --all-a = --annotate-a = --albuquerque?

这看起来很简单,而且你可能想要用git做什么 - 如果你改变了主意,可以返回以前的提交而不会丢失中间提交。


你介意产生: ABCDEF-F'-E'-D'其中的代码的状态D'也正是因为它是在C (所以G == D' )? 在这种情况下,只需恢复FED 如果您不想要中间步骤,请revert但不应用,然后提交。 那是:

$ git revert -n HEAD
$ git revert -n HEAD~
$ git revert -n HEAD~2
$ git commit -m 'Revert D,E,and F'

在此之后,当前的HEAD是G,并且两个提交G和C应该包含相同的代码树。 你可以通过检查git cat-file -p HEAD | grep ^tree的输出来验证 git cat-file -p HEAD | grep ^treegit cat-file -p C | grep ^tree git cat-file -p C | grep ^tree 。 这两个命令都应该提供相同的输出。

但是为什么你想保持中间提交并不是很清楚。 如果你想要他们为后代,那么做一些事情: git branch old-stuffgit reset C这会将当前分支设置回C ,但是DEF仍然可以在名为old-stuff的分支中查看。


我想你需要使用git cherry-pick

https://www.kernel.org/pub/software/scm/git/docs/git-cherry-pick.html


git cherry-pick --strategy=recursive -X ours C

GIT中合并(1):

递归策略可以采用以下选项:

我们的

这个选项强制相​​互冲突的hunk通过支持我们的版本自动解决。 [...]

“我们”和“他们的”是指两个合并提交。 但是,我不确定git cherry-pick会采用哪种方式来处理提交,因此您可能需要-X theirs取而代之。 你可以创建一个新的分支,试试看看。

链接地址: http://www.djcxy.com/p/18853.html

上一篇: How to checkout an old commit and make it a new commit

下一篇: Git rename from index.lock to index failed