使用“git revert”来取消添加一行的更改?

Posted

技术标签:

【中文标题】使用“git revert”来取消添加一行的更改?【英文标题】:Use "git revert" to back-out a change adding a line? 【发布时间】:2012-04-26 22:27:40 【问题描述】:

以下 pastebin 是一个 repo,其中包含一个文件,每行键入一、二、三、四、五。

每一行都单独提交到 git 中:

http://pastebin.ca/raw/2136179

然后我尝试使用命令git revert <commmit which creates two> 删除第二行

得到:

error: could not revert b4e0a66... second
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'

这么简单的事情应该没有冲突吗?还是我做错了/得到了错误的命令?

合并细节似乎也没有意义:

one
<<<<<<< HEAD
two
three
four
five
=======
>>>>>>> parent of b4e0a66... second

这不是说只删除一个吗?我原以为只有两个会受到影响...

git 1.7.10

【问题讨论】:

【参考方案1】:

我尝试重复您的步骤并发现了同样的问题。您似乎只能还原最近的提交。 在我的存储库中:

$ git log --oneline
9a25594 five
f8f1ec4 four
3c75345 three
e6cd245 two
8349ccc one
d2f16c4 for stkofl  <<==== ignore this one

$ git revert 9a25 --no-edit
Finished one revert.
[master 82bbc79] Revert "five"
 1 files changed, 0 insertions(+), 1 deletions(-)
$ git reset --hard
HEAD is now at 82bbc79 Revert "five"

似乎不允许恢复不是一组连续提交的任何一组提交,包括 HEAD(最近的提交)。

当然,你可以这样做:

    $ git show e6cd |patch -R
    patching file file
    Hunk #1 succeeded at 1 with fuzz 1.

然后提交结果。

【讨论】:

您当然可以还原不是最近的提交。在这种情况下它只是不起作用。 糟糕,但说得好!如果最新版本的 git 有 --strategy= 修复,我很想知道,如果没有,我最终会给你打勾到patch -R 我需要使用patch -R -p1 才能(几乎)工作。 git show 的输出在 a/fileb/file 之间存在差异,如果不添加 -p1 选项,则无法应用。最终,事情发生了很大的变化,以至于在我的情况下,很多更改最终都被patch 拒绝了,但我可以解决它们。【参考方案2】:

更改保存为上下文差异...如果您查看 third 的差异,您会注意到它是根据包含 two 的行应用的,这意味着它取决于提交介绍了two。同样,每个连续的提交都依赖于前一个提交,这就是为什么它想要删除引入two 之后的所有提交(因为它们最终都依赖于该提交)。这就是为什么在一般情况下您不应该依赖能够恢复提交,而只能在提交后立即恢复。

【讨论】:

啊,好吧,你是说我应该只在我可能只做 git reset --hard HEAD^ 的地方使用这个命令? 好吧,如果你推动了它仍然很有用,但没有我希望的那么有用..(我不太可能一推就塞满了) 我尝试了手动方式来执行此处描述的“hg backout”mercurial.selenic.com/wiki/Backout(用 checkout 替换 revert。)同样的事情发生了! ***.com/a/3207170 似乎猜测合并策略 resolve 会解决问题,但我的 revert 版本没有它我用运行上述评论的合并命令尝试了它,但没有运气我会等我拿到更新的版本后必须回来。 听起来你比我更了解正在发生的事情。有趣的是,最新版本的 Mercurial hg backout 开箱即用,没有更改合并策略标志(但在旧版本中,它像 git 1.7.10 一样失败)

以上是关于使用“git revert”来取消添加一行的更改?的主要内容,如果未能解决你的问题,请参考以下文章

git resetgit checkout和git revert的区别

合并来自 git revert 的冲突 - 我应该接受当前的更改还是传入,为啥?

git revert

git revert 后,合并显示没有更改并且已经更新

代码回滚:git resetgit checkout和git revert区别和联系

git revert和git reset的区别