Git的另一个选择还原

时间:2018-01-19 19:51:03

标签: git

我遇到了一个问题,我正在尝试使用git revert创建一个新的提交,它基本上会在主分支中重复几个旧的提交。我一直坚持这个问题很长一段时间我每次尝试运行git revert <sha>我首先得到这个错误:

error: Your local changes would be overwritten by revert.
hint: Commit your changes or stash them to proceed.
fatal: revert failed`

我尝试添加,提交和推送,然后重试但是我得到了同样的错误,它一直让我一遍又一遍地合并相同的冲突。我试过git stash,但仍然没有运气。

git stash
Saved working directory and index state WIP on (no branch): <branch>
git revert <sha>
error: could not revert <sha> 
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'`

此时,我只想在我想要的提交中克隆存储库作为当前并将其添加为头部。我试图保留我的提交历史,否则我会使用git checkout。

任何建议都会非常感激!

2 个答案:

答案 0 :(得分:1)

类似于@phd所说的,你有两个不同的错误。第一个是有意义的,因为你有未提交的更改。第二个对你的意图没有意义,因为你处于合并冲突的中间,而不是在一个分支上。不确定你是否仍然处于这种情况,但我会跑git merge --abort然后git stash然后git revert <sha>你应该是金色的。

答案 1 :(得分:1)

由于您在master中声明了提交的重复,我假设您正在处理不同的分支,并且您的历史记录如下所示:

A-B-C-D   master
 \E-ζ-F*  dev

其中ζ几乎是C的重复,F*是一些后续提交加上一个脏工作树。既然你提到“它让我一遍又一遍地合并相同的冲突”,你可能会尝试将master合并到dev,这可能会因ζ和{{1}而导致冲突不是实际的重复 - 也许一些评论增加了冲突等。

所以我最好的猜测是你真的喜欢像

这样的东西
C

即。将A-B-C-D master \ ↓ E--D'-F'* dev (or maybe E--F--D'*) 合并到master,而没有几乎重复的提交dev

你已经ζ摆脱了肮脏的状态。如果您是迄今为止唯一撤销分支的用户,则可以考虑通过git stash重写历史记录,只需从历史记录中清除git rebase -i E,即可获得临时分支ζ。然后E-F再次获取git merge master和可选E-F-D'来交换git rebase -i EF。最后,D'取回您的工作树,希望没有任何合并冲突。

如果您无法选择重写历史记录,则可以在修复合并冲突后git stash pop直接获取git merge master。无需还原更改,但让合并评论包含有关此内容的信息,并可能将E-ζ-F-D'添加到git note