签出旧的提交,并使其成为一个新的提交

在Git上,说我搞砸了我的提交,我想让版本3提交前作为新版本。 如果我做git checkout xxxx ,它创build一个新的分支,似乎我只能合并它? 我可以把这个新的“主版本”?

我想要:

 ABCDE 

成为

 ABCDEF 

其中F与C具有完全相同的内容

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

我真正想要的只是使旧的提交在某个时候新的提交,无论我的工作目录或最新的提交。

我怎么去做这个?

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

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

这听起来像你只是想重置为C; 那就是树:

ABC

你可以通过reset来做到这一点:

 git reset --hard HEAD~3 

(注意:你之前说过3次提交,所以就是我写的;在你的例子中C只有两次提交之前,所以你可能要使用HEAD~2


你也可以使用revert如果你想要的,但据我所知,你需要做一个恢复一次:

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

这将创build一个新的提交F,这是与D相同的内容,并且G是与C相同的内容。如果你想要,你可以重新组合这些内容

这正是我想要做的。 我不知道以前的命令git cherry-pick C ,这听起来不错,但你似乎这样做是从另一个分支,但不是在同一个分支上的变化,有没有人试过?

所以我做了一些其他的工作:我从文件中得到了旧的提交文件所需的文件

 git checkout <commit-hash> <filename> 

例如: git checkout 08a6497b76ad098a5f7eda3e4ec89e8032a4da51 file.css

– >这需要从旧的提交文件

然后我做了我的改变。 我又犯了

 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检查了我的历史git log ,而且我还有我的历史以及从旧文件所做的新更改。 我也可以推。

请注意,要回到您想要的状态,您需要在不需要的更改之前放置提交的哈希值。 在做之前,请确保您没有未提交的更改。

Eloone通过文件与它进行了归档

 git checkout <commit-hash> <filename> 

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

 git checkout <commit-hash> . 

git cherry-pick C

其中C是C的提交散列。这将旧的提交应用于最新的提交。

到目前为止的其他答案创build新的提交,以撤销旧的提交。 有可能回去“改变历史”,但这可能有点危险。 如果您正在更改的提交没有推送到其他存储库,则应该执行此操作。

你正在寻找的命令是git rebase --interactive

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

在尝试使用一些重要的东西之前,先练习另一个存储库。 手册页应该给你所有你需要的信息。