我和一个朋友一起做一个项目,他编辑了一堆不应该编辑的文件。不知何故,我将他的作品合并到我的作品中,无论是在我拉出它时,还是在我试图挑选出我想要的特定文件时。我一直在寻找和玩很长时间,试图弄清楚如何删除包含对这些文件的编辑的提交,这似乎是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 在计算要还原的差异时使用的算法要求
“相邻”的定义基于上下文差异的默认行数,即 3。因此,如果“myfile”是这样构造的:
$ cat >myfile <<EOF line 1 junk junk junk junk line 2 junk junk junk junk line 3 EOF $ git add myfile $ git commit -m "initial check-in" 1 files changed, 11 insertions(+), 0 deletions(-) create mode 100644 myfile $ perl -p -i -e 's/line 2/this is the second line/;' myfile $ git commit -am "changed line 2 to second line" [master d6cbb19] changed line 2 1 files changed, 1 insertions(+), 1 deletions(-) $ perl -p -i -e 's/line 3/this is the third line/;' myfile $ git commit -am "changed line 3 to third line" [master dd054fe] changed line 3 1 files changed, 1 insertions(+), 1 deletions(-) $ git revert d6cbb19 Finished one revert. [master 2db5c47] Revert "changed line 2" 1 files changed, 1 insertions(+), 1 deletions(-)
然后一切都按预期工作。
第二个答案很有趣。有一个尚未正式发布的功能(尽管它在 Git v1.7.2-rc2 中可用)称为 Revert Strategy。你可以像这样调用 git:
git revert --strategy resolve <提交>
它应该更好地弄清楚你的意思。我不知道可用策略列表是什么,也不知道任何策略的定义。