2957

我使用git pull并遇到了合并冲突:

unmerged:   _widget.html.erb

You are in the middle of a conflicted merge.

我知道该文件的其他版本是好的,而我的是坏的,所以我的所有更改都应该被放弃。我怎样才能做到这一点?

4

15 回答 15

2556

由于您pull不成功,因此HEAD(not HEAD^) 是您分支上的最后一个“有效”提交:

git reset --hard HEAD

您想要的另一部分是让他们的更改覆盖您的更改。

旧版本的 git 允许您使用“他们的”合并策略:

git pull --strategy=theirs remote_branch

但这已被删除,正如Junio Hamano(Git 维护者)在此消息中所解释的那样。如链接中所述,您可以这样做:

git fetch origin
git reset --hard origin
于 2008-09-19T14:33:20.870 回答
2235

如果您的 git 版本 >= 1.6.1,则可以使用git reset --merge.

此外,正如@Michael Johnson 所提到的,如果您的 git 版本 >= 1.7.4,您也可以使用git merge --abort.

与往常一样,请确保在开始合并之前没有未提交的更改。

git merge 手册页

git merge --abort相当于git reset --merge何时MERGE_HEAD出现。

MERGE_HEAD正在进行合并时出现。

此外,关于开始合并时未提交的更改:

如果您有不想在开始合并之前提交的更改,只需git stash在合并之前和git stash pop完成合并或中止之后提交。

于 2010-03-28T23:16:48.167 回答
612
git merge --abort

中止当前的冲突解决过程,并尝试重建预合并状态。

如果在合并开始时存在未提交的工作树更改,git merge --abort则在某些情况下将无法重建这些更改。因此,建议在运行 git merge 之前始终提交或存储您的更改。

git merge --abort相当于git reset --merge何时 MERGE_HEAD出现。

http://www.git-scm.com/docs/git-merge

于 2012-11-12T21:40:24.550 回答
113

我想这是git reset你需要的。

请注意,这git revert意味着一些非常不同的东西,例如,svn revert在 Subversion 中,revert 将丢弃您的(未提交的)更改,将文件从存储库返回到当前版本,而git revert“撤消”提交。

git reset应该做相当于svn revert,即丢弃不需要的更改。

于 2008-09-19T13:25:09.910 回答
78

在这个特定的用例中,您并不想中止合并,只需以特定方式解决冲突。

也没有特别需要重置和执行不同策略的合并。git 已正确突出显示冲突,并且接受另一方更改的要求仅适用于这个文件。

对于冲突中未合并的文件,git 会在索引中提供文件的通用基础、本地和远程版本。(这是在 3-way diff 工具中读取它们的地方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 checkout --theirs _widget.html.erb
于 2008-09-20T10:41:32.293 回答
75

对于 git >= 1.6.1:

git merge --abort

对于旧版本的 git,这将完成这项工作:

git reset --merge

或者

git reset --hard
于 2020-06-26T05:36:45.607 回答
66

您可以中止合并步骤:

git merge --abort

否则你可以保留你的更改(你在哪个分支上)

git checkout --ours file1 file2 ...

否则您可以保留其他分支更改

git checkout --theirs file1 file2 ...
于 2020-11-26T09:20:26.373 回答
59

评论表明这git reset --mergegit merge --abort. 值得注意的是,这git merge --abort仅相当于git reset --merge假设 aMERGE_HEAD存在。这可以在 git help for merge 命令中阅读。

当 MERGE_HEAD 存在时, git merge --abort 等效于 git reset --merge。

合并失败后,如果没有MERGE_HEAD,则可以使用 撤消失败的合并git reset --merge,但不一定使用git merge --abort它们不仅是同一事物的新旧语法

就我个人而言,我发现git reset --merge对于类似于所描述的场景的场景更强大,并且通常合并失败。

于 2015-04-02T12:16:45.667 回答
30

如果您最终遇到合并冲突并且没有任何要提交的内容,但仍然显示合并错误。应用所有下面提到的命令后,

git reset --hard HEAD
git pull --strategy=theirs remote_branch
git fetch origin
git reset --hard origin

请删除

.git\index.lock

文件[在恢复的情况下剪切粘贴到其他位置],然后根据您想要的版本输入以下任何命令。

git reset --hard HEAD
git reset --hard origin

希望有帮助!!!

于 2018-04-10T21:26:02.707 回答
20

另一种保留工作副本状态的方法是:

git stash
git merge --abort
git stash pop

我通常不建议这样做,因为它实际上就像在 Subversion 中合并,因为它在以下提交中丢弃了分支关系。

于 2010-07-13T18:57:42.047 回答
18

由于 Git 1.6.1.3git checkout已经能够从合并的任一侧检出:

git checkout --theirs _widget.html.erb
于 2010-07-17T01:29:33.400 回答
11

可能不是 OP 想要的,但对我来说,我试图将一个稳定的分支合并到一个特性分支,并且有太多的冲突。我没有设法重置更改,因为 HEAD 被许多提交更改,所以简单的解决方案是强制签出到一个稳定的分支。然后您可以结帐到另一个分支,它将与合并前一样。

git checkout -f master

git checkout side-branch

于 2021-07-29T12:56:48.560 回答
4

为了避免陷入这种麻烦,可以扩展该方法并在合并之前git merge --abort创建一个单独的测试分支

案例:您有一个主题分支,它没有被合并,因为您分心/出现了一些事情/您知道,但它已经(或已经)准备好了。

现在可以将它合并到master中吗?

测试分支中工作以估计/找到解决方案,然后放弃测试分支并在主题分支中应用解决方案。

# Checkout the topic branch
git checkout topic-branch-1

# Create a _test_ branch on top of this
git checkout -b test

# Attempt to merge master
git merge master

# If it fails you can abandon the merge
git merge --abort
git checkout -
git branch -D test  # we don't care about this branch really...

努力解决冲突。

# Checkout the topic branch
git checkout topic-branch-1

# Create a _test_ branch on top of this
git checkout -b test

# Attempt to merge master
git merge master

# resolve conflicts, run it through tests, etc
# then
git commit <conflict-resolving>

# You *could* now even create a separate test branch on top of master
# and see if you are able to merge
git checkout master
git checkout -b master-test
git merge test

最后再次检查主题分支,从测试分支应用修复并继续 PR。最后删除测试和主测试。

涉及?是的,但在我做好准备之前,它不会影响我的主题或主分支。

于 2021-06-10T07:27:32.153 回答
2

我发现以下内容对我有用(将单个文件恢复为预合并状态):

git reset *currentBranchIntoWhichYouMerged* -- *fileToBeReset*
于 2017-10-31T00:56:24.403 回答
-10

源树

因为您没有提交合并,所以只需双击另一个分支(这意味着签出它),当 sourcetree 询问您是否放弃所有更改时,请同意。

笔记

这个答案是针对那些使用 SourceTree 作为 git 客户端的人。

于 2020-02-21T16:19:32.997 回答