关于git:签出旧提交并使其成为新提交


Checkout old commit and make it a new commit

本问题已经有最佳答案,请猛点这里访问。

在Git上,假设我把提交弄乱了,我想把3版提交变成新版本。如果我做git checkout xxxx,它会创建一个新的分支,看起来我只能合并它?我可以把这个变成新的"主版本"吗?

我想要:

1
A-B-C-D-E

成为

1
A-B-C-D-E-F

其中f与c的内容完全相同

如果我使用git revert xxxx,它看起来肯定会有冲突,我需要手动解决。

我真正想要的是在某个时刻使旧的提交成为新的提交,而不管我的工作目录中有什么或者最新的提交。

我该怎么做呢?


1
2
3
git rm -r .
git checkout HEAD~3 .
git commit

提交之后,新的HEAD中的文件将与修订版HEAD~3中的文件相同。


听起来您只是想重置为C;这使得树:

A-B-C

你可以用reset来实现:

1
git reset --hard HEAD~3

(注意:您在前面说过三次提交,所以这就是我所写的;在您的示例中,C只是两次提交,所以您可能想要使用HEAD~2

如果您愿意,也可以使用revert,不过据我所知,您需要一次回复一次:

1
2
git revert HEAD     # Reverts E
git revert HEAD~2   # Reverts D

这将创建一个新的commit f,它与d和g的内容相同,而g的内容与c的内容相同。


这正是我想要做的。我不太确定之前的命令git cherry-pick C,听起来不错,但似乎您这样做是为了从另一个分支获得更改,但不是在同一个分支,有人尝试过吗?

所以我做了一些其他的工作:我从旧的提交文件中一个接一个地得到了我想要的文件

1
git checkout <commit-hash> <filename>

前任:git checkout 08a6497b76ad098a5f7eda3e4ec89e8032a4da51 file.css

->这会将文件从旧提交文件中提取出来

然后我做了一些改变。我再次承诺。

1
2
3
4
git status (to check which files were modified)
git diff (to check the changes you made)
git add .
git commit -m"my message"

我和git log核对了我的历史,我仍然保留着我的历史以及我对旧文件所做的新修改。我也可以推。

请注意,要返回想要的状态,您需要将提交的散列放在不需要的更改之前。另外,在执行此操作之前,请确保没有未提交的更改。


Eloone用

1
git checkout <commit-hash> <filename>

但是你可以通过这样做更容易地签出所有文件

1
git checkout <commit-hash> .


git cherry-pick C

其中c是c的提交哈希。这将在最新的提交哈希之上应用旧的提交。


到目前为止,另一个答案是创建新的提交,以撤消旧提交中的内容。可以回到过去"改变历史",但这可能有点危险。只有在更改的提交没有被推送到其他存储库时,才应该这样做。

你要找的命令是git rebase --interactive

如果你想换头3,你要发出的命令是git rebase --interactive HEAD~4。这将打开一个文本编辑器,并允许您指定要更改的提交。

在用重要的东西尝试之前,先在不同的存储库中进行练习。手册页应该提供您所需的所有其他信息。