删除特定提交 [英] Remove specific commit
问题描述
我和一个朋友一起做一个项目,他编辑了一堆不应该编辑的文件.不知何故,我将他的作品合并到我的作品中,无论是在我拉出它时,还是当我试图挑选出我想要的特定文件时.我一直在寻找和玩了很长时间,试图弄清楚如何删除包含对这些文件的编辑的提交,这似乎是在 revert 和 rebase 之间折腾,并且没有直接的例子,而且文档假设我知道的比我知道的多.
I was working with a friend on a project, and he edited a bunch of files that shouldn't have been edited. Somehow I merged his work into mine, either when I pulled it, or when I tried to just pick the specific files out that I wanted. I've been looking and playing for a long time, trying to figure out how to remove the commits that contain the edits to those files, it seems to be a toss up between revert and rebase, and there are no straightforward examples, and the docs assume I know more than I do.
所以这是问题的简化版本:
So here is a simplified version of the question:
鉴于以下情况,我如何删除提交 2?
Given the following scenario, how do I remove commit 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
这是我一直在尝试恢复的示例
Here is an example of how I have been trying to revert
$ 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 在计算要还原的差异时使用的算法要求
The algorithm that Git uses when calculating diffs to be reverted requires that
- 被还原的行不会被任何后来的提交修改.
- 没有任何其他相邻"在历史较晚提交.
相邻"的定义基于上下文差异的默认行数,即 3.因此,如果 'myfile' 是这样构造的:
The definition of "adjacent" is based on the default number of lines from a context diff, which is 3. So if 'myfile' was constructed like this:
$ 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(-)
然后一切都按预期进行.
Then it all works as expected.
第二个答案很有趣.有一个尚未正式发布的功能(尽管它在 Git v1.7.2-rc2 中可用)称为 Revert Strategy.你可以像这样调用 git:
The second answer was very interesting. There is a feature that has not yet been officially released (though it is available in Git v1.7.2-rc2) called Revert Strategy. You can invoke git like this:
git revert --strategy resolve
git revert --strategy resolve <commit>
它应该能更好地理解你的意思.我不知道可用策略的列表是什么,也不知道任何策略的定义.
and it should do a better job of figuring out what you meant. I do not know what the list of available strategies is, nor do I know the definition of any strategy.
这篇关于删除特定提交的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!