签出旧的提交,并使其成为一个新的提交
在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
。 这将打开一个文本编辑器,并允许您指定要更改的提交。
在尝试使用一些重要的东西之前,先练习另一个存储库。 手册页应该给你所有你需要的信息。