如何检出旧的提交并将其提交给新的提交
我想跟随另一个关于这个问题的问题:“签出旧的提交并将其作为新的提交
但他们说:“不要那样做!” 所以似乎我必须提出一个新问题。 (尽管我认为对我来说最好的答案不是按照预期的那样工作,而是同一个问题......
如果我提交了ABCDEF
(想象这些都是SHA的)。 我想将整个存储库完全保存为C
,然后提交它以创建与C
完全相同的'G'
。 所以当我完成时,即使C&G是相同的,日志也是ABCDEFG。
一个答案表明樱桃挑选,这似乎是完美的,但它使我解决了C
和F
之间的每一个冲突。 我看了看文件,我试图--force
无论如何,然后推荐--patch
。 --patch
是最接近的,但它不是绝对的。 那么有没有办法让樱桃挑选只选择C
版本的冲突?
另一个最接近的答案是签出C
,但是我找不到将它保留在同一分支上的魔术字。 在最近的训练我完成说用“神奇短跑冲刺”末告诉git
你想这个对当前分支,但无论我做什么,它会创建一个“(无分支)”分支。
我相信你可以告诉我,我对git(以及一般的命令行)很陌生,但我试图自己弄清楚。 如果你可以使用你推荐的详细版本,那么它会更好地坚持在我的头上,将不胜感激。 ( -a
= --all
或-a = --annotate
或-a = --albuquerque?
)
这看起来很简单,而且你可能想要用git做什么 - 如果你改变了主意,可以返回以前的提交而不会丢失中间提交。
你介意产生: ABCDEF-F'-E'-D'
其中的代码的状态D'
也正是因为它是在C
(所以G
== D'
)? 在这种情况下,只需恢复F
, E
和D
如果您不想要中间步骤,请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 ^tree
和git cat-file -p C | grep ^tree
git cat-file -p C | grep ^tree
。 这两个命令都应该提供相同的输出。
但是为什么你想保持中间提交并不是很清楚。 如果你想要他们为后代,那么做一些事情: git branch old-stuff
, git reset C
这会将当前分支设置回C
,但是D
, E
和F
仍然可以在名为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
取而代之。 你可以创建一个新的分支,试试看看。