使用“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/file
和 b/file
之间存在差异,如果不添加 -p1
选项,则无法应用。最终,事情发生了很大的变化,以至于在我的情况下,很多更改最终都被patch
拒绝了,但我可以解决它们。【参考方案2】:
更改保存为上下文差异...如果您查看 third
的差异,您会注意到它是根据包含 two
的行应用的,这意味着它取决于提交介绍了two
。同样,每个连续的提交都依赖于前一个提交,这就是为什么它想要删除引入two
之后的所有提交(因为它们最终都依赖于该提交)。这就是为什么在一般情况下您不应该依赖能够恢复提交,而只能在提交后立即恢复。
【讨论】:
啊,好吧,你是说我应该只在我可能只做 git reset --hard HEAD^ 的地方使用这个命令? 好吧,如果你推动了它仍然很有用,但没有我希望的那么有用..(我不太可能一推就塞满了) 我尝试了手动方式来执行此处描述的“hg backout”mercurial.selenic.com/wiki/Backout(用 checkouthg backout
开箱即用,没有更改合并策略标志(但在旧版本中,它像 git 1.7.10 一样失败)以上是关于使用“git revert”来取消添加一行的更改?的主要内容,如果未能解决你的问题,请参考以下文章
git resetgit checkout和git revert的区别
合并来自 git revert 的冲突 - 我应该接受当前的更改还是传入,为啥?