我和一个朋友一起做一个项目,他编辑了一堆不应该编辑的文件。不知何故,我将他的作品合并到我的作品中,无论是在我拉出它时,还是在我试图挑选出我想要的特定文件时。我一直在寻找和玩很长时间,试图弄清楚如何删除包含对这些文件的编辑的提交,这似乎是revert和rebase之间的折腾,并且没有直接的例子,并且文档假设我比我知道的更多。
所以这是问题的简化版本:
鉴于以下情况,我如何删除提交 2?
$ mkdir git_revert_test && cd git_revert_test
$ git init
Initialized empty Git repository in /Users/josh/deleteme/git_revert_test/.git/
$ echo "line 1" > myfile
$ git add -A
$ git commit -m "commit 1"
[master (root-commit) 8230fa3] commit 1
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 myfile
$ echo "line 2" >> myfile
$ git commit -am "commit 2"
[master 342f9bb] commit 2
1 files changed, 1 insertions(+), 0 deletions(-)
$ echo "line 3" >> myfile
$ git commit -am "commit 3"
[master 1bcb872] commit 3
1 files changed, 1 insertions(+), 0 deletions(-)
预期的结果是
$ cat myfile
line 1
line 3
这是我一直在尝试恢复的示例
$ git revert 342f9bb
Automatic revert failed. After resolving the conflicts,
mark the corrected paths with 'git add <paths>' or 'git rm <paths>'
and commit the result.
有四种方法可以这样做:
干净的方式,还原但记录还原:
苛刻的方式,只删除最后一次提交:
注意:避免
git reset --hard
因为它也会丢弃自上次提交以来文件中的所有更改。如果--soft
不起作用,请尝试--mixed
或--keep
。Rebase(显示最后 5 次提交的日志并删除您不想要的行,或者重新排序,或者将多个提交合并为一个,或者做任何您想做的事情,这是一个非常通用的工具):
如果犯了一个错误:
快速变基:仅删除使用其 id 的特定提交:
备选方案:您也可以尝试:
另一种选择:
作为最后的手段,如果您需要完全自由的历史编辑(例如,因为 git 不允许您编辑您想要的内容),您可以使用这个 very fast 开源应用程序: reposurgeon 。
注意:当然,所有这些更改都是在本地完成的,之后您应该
git push
将更改应用到远程。如果你的 repo 不想删除提交(“不允许快进”,当你想删除你已经推送的提交时会发生这种情况),你可以使用git push -f
强制推送更改。注意 2:如果在一个分支上工作并且你需要强制推送,你应该绝对避免
git push --force
因为这可能会覆盖其他分支(如果你对它们进行了更改,即使你当前的结帐是在另一个分支上)。首选在强制推送时始终指定远程分支:git push --force origin your_branch
。