我使用了 git pull 并发生了合并冲突:
git pull
unmerged: _widget.html.erb You are in the middle of a conflicted merge.
我知道该文件的其他版本是好的,我的是坏的所以我的所有更改都应该放弃 . 我怎样才能做到这一点?
由于评论表明 git reset --merge 是 git merge --abort 的别名,因此值得注意 git merge --abort 仅相当于 git reset --merge ,因为存在 MERGE_HEAD . 这可以在git help for merge命令中读取 .
git reset --merge
git merge --abort
MERGE_HEAD
git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.
合并失败后,如果没有 MERGE_HEAD ,则可以使用 git reset --merge 撤消失败的合并,但不一定使用 git merge --abort , so they are not only old and new syntax for the same thing 撤消 .
就个人而言,我发现 git reset --merge 对于类似于上述场景的场景更加强大,并且一般来说合并失败 .
我认为你需要的是 git reset .
git reset
请注意, git revert 表示与 svn revert 非常不同的东西 - 在Subversion中,revert将丢弃您的(未提交的)更改,将文件从存储库返回到当前版本,而 git revert "undoes"提交 .
git revert
svn revert
git reset 应该相当于 svn revert ,也就是说,丢弃不需要的更改 .
由于Git 1.6.1.3 git checkout已经能够从合并的任何一方结账:
git checkout --theirs _widget.html.erb
由于您的 pull 未成功,因此 HEAD (不是 HEAD^ )是您分支上的最后"valid"提交:
pull
HEAD
HEAD^
git reset --hard HEAD
你想要的另一件事就是让他们的改变超越你的改变 .
较旧版本的git允许您使用“他们的”合并策略:
git pull --strategy=theirs remote_branch
但是这已被删除,如this message by Junio Hamano(Git维护者)中所述 . 如the link中所述,您可以这样做:
git fetch origin git reset --hard origin
中止当前的冲突解决过程,并尝试重建合并前的状态 . 如果合并开始时存在未提交的工作树更改,则git merge --abort在某些情况下将无法重建这些更改 . 因此,建议在运行git merge之前始终提交或存储更改 . 当MERGE_HEAD存在时,git merge --abort相当于git reset --merge .
http://www.git-scm.com/docs/git-merge
如果你的git版本是> = 1.6.1,你可以使用 git reset --merge .
另外,正如@Michael Johnson所提到的,如果你的git版本> = 1.7.4,你也可以使用 git merge --abort .
与往常一样,确保在开始合并之前没有未提交的更改 .
来自git merge man page
当 MERGE_HEAD 存在时, git merge --abort 相当于 git reset --merge .
合并正在进行时存在 MERGE_HEAD .
此外,关于开始合并时未提交的更改:
如果你有更改,你不想在开始合并之前提交,只需在合并之前 git stash ,在完成合并或中止之后 git stash pop .
git stash
git stash pop
如果您最终遇到合并冲突并且没有任何事情要提交但仍然在应用所有下面提到的命令后仍然显示合并错误,
git reset --hard HEAD git pull --strategy=theirs remote_branch git fetch origin git reset --hard origin
请删除
.git \ index.lock
file [在恢复的情况下将粘贴剪切到其他位置],然后根据所需的版本输入以下任何一个命令 .
git reset --hard HEAD git reset --hard origin
希望有所帮助!
另一种保留工作副本状态的替代方法是:
git stash git merge --abort git stash pop
我通常建议不要这样做,因为它实际上就像在Subversion中合并一样,因为它会抛弃以下提交中的分支关系 .
在这个特定的用例中,您并不想真正中止合并,只需以特定方式解决冲突 .
也没有特别需要重置和执行与不同策略的合并 . git正确地突出了冲突,接受其他方面更改的要求仅适用于这一个文件 .
对于冲突中的未合并文件,git使索引中的文件的公共基础,本地和远程版本可用 . (这是通过 git mergetool 读取它们以用于3向差异工具的地方 . )您可以使用 git show 来查看它们 .
git mergetool
git show
# common base: git show :1:_widget.html.erb # 'ours' git show :2:_widget.html.erb # 'theirs' git show :3:_widget.html.erb
解决冲突以逐字使用远程版本的最简单方法是:
git show :3:_widget.html.erb >_widget.html.erb git add _widget.html.erb
或者,使用git> = 1.6.1:
我发现以下内容适用于我(将单个文件还原为预合并状态):
git reset *currentBranchIntoWhichYouMerged* -- *fileToBeReset*
10 回答
由于评论表明
git reset --merge
是git merge --abort
的别名,因此值得注意git merge --abort
仅相当于git reset --merge
,因为存在MERGE_HEAD
. 这可以在git help for merge命令中读取 .合并失败后,如果没有
MERGE_HEAD
,则可以使用git reset --merge
撤消失败的合并,但不一定使用git merge --abort
, so they are not only old and new syntax for the same thing 撤消 .就个人而言,我发现
git reset --merge
对于类似于上述场景的场景更加强大,并且一般来说合并失败 .我认为你需要的是
git reset
.请注意,
git revert
表示与svn revert
非常不同的东西 - 在Subversion中,revert将丢弃您的(未提交的)更改,将文件从存储库返回到当前版本,而git revert
"undoes"提交 .git reset
应该相当于svn revert
,也就是说,丢弃不需要的更改 .由于Git 1.6.1.3 git checkout已经能够从合并的任何一方结账:
由于您的
pull
未成功,因此HEAD
(不是HEAD^
)是您分支上的最后"valid"提交:你想要的另一件事就是让他们的改变超越你的改变 .
较旧版本的git允许您使用“他们的”合并策略:
但是这已被删除,如this message by Junio Hamano(Git维护者)中所述 . 如the link中所述,您可以这样做:
http://www.git-scm.com/docs/git-merge
如果你的git版本是> = 1.6.1,你可以使用
git reset --merge
.另外,正如@Michael Johnson所提到的,如果你的git版本> = 1.7.4,你也可以使用
git merge --abort
.与往常一样,确保在开始合并之前没有未提交的更改 .
来自git merge man page
当
MERGE_HEAD
存在时,git merge --abort
相当于git reset --merge
.合并正在进行时存在
MERGE_HEAD
.此外,关于开始合并时未提交的更改:
如果你有更改,你不想在开始合并之前提交,只需在合并之前
git stash
,在完成合并或中止之后git stash pop
.如果您最终遇到合并冲突并且没有任何事情要提交但仍然在应用所有下面提到的命令后仍然显示合并错误,
请删除
file [在恢复的情况下将粘贴剪切到其他位置],然后根据所需的版本输入以下任何一个命令 .
希望有所帮助!
另一种保留工作副本状态的替代方法是:
我通常建议不要这样做,因为它实际上就像在Subversion中合并一样,因为它会抛弃以下提交中的分支关系 .
在这个特定的用例中,您并不想真正中止合并,只需以特定方式解决冲突 .
也没有特别需要重置和执行与不同策略的合并 . git正确地突出了冲突,接受其他方面更改的要求仅适用于这一个文件 .
对于冲突中的未合并文件,git使索引中的文件的公共基础,本地和远程版本可用 . (这是通过
git mergetool
读取它们以用于3向差异工具的地方 . )您可以使用git show
来查看它们 .解决冲突以逐字使用远程版本的最简单方法是:
或者,使用git> = 1.6.1:
我发现以下内容适用于我(将单个文件还原为预合并状态):