我使用git pull
了合并冲突:
unmerged: _widget.html.erb
You are in the middle of a conflicted merge.
我知道该文件的其他版本是好的,而我的是不好的,因此我的所有更改都应该放弃。我怎样才能做到这一点?
[rejected] gh-pages -> gh-pages (non-fast-forward)
我使用git pull
了合并冲突:
unmerged: _widget.html.erb
You are in the middle of a conflicted merge.
我知道该文件的其他版本是好的,而我的是不好的,因此我的所有更改都应该放弃。我怎样才能做到这一点?
[rejected] gh-pages -> gh-pages (non-fast-forward)
Answers:
由于您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
git fetch origin
-> git reset origin (soft reset, your changes are still present)
-> git checkout file_to_use_their_version_of another_file (steamroll your own changes back to match the origin)
我再也不会使用git pull了。由于在我最新的代码与来源之间的斗争中,来源应始终获胜,而我始终应git fetch
与git rebase origin
。这实际上使我之间的合并和冲突变得越来越少。
git log ..@{upstream}
或git diff ..@{upstream}
)。之后,像您一样,我将重新整理工作。
git merge -X theirs remote_branch
,而不是git pull --strategy=theirs remote_branch
作为theirs
看起来像一个的选项recursive
git merge --abort
是更可取的。
如果您的git版本> = 1.6.1,则可以使用git reset --merge
。
另外,正如@Michael Johnson所提到的,如果您的git版本> = 1.7.4,也可以使用git merge --abort
。
与往常一样,在开始合并之前,请确保您没有未提交的更改。
git merge --abort
等同于git reset --merge
何时MERGE_HEAD
存在。
MERGE_HEAD
进行合并时出现。
另外,关于开始合并时未提交的更改:
如果您有更改,则不想在开始合并之前提交,只需git stash
在合并之前,git stash pop
完成合并或中止之后再提交即可。
<commit>
?#GitMoment:-o
git merge --abort
只是一个代名词git reset --merge
?这个名字当然更有意义,但是它具有相同的功能吗?
git merge --abort
中止当前的冲突解决过程,并尝试重构合并前状态。
如果合并开始时存在未提交的工作树更改,
git merge --abort
则在某些情况下将无法重构这些更改。因此,建议始终在运行git merge之前提交或存储更改。
git merge --abort
等同于git reset --merge
何时MERGE_HEAD
存在。
我认为这是git reset
您需要的。
请注意,这git revert
意味着与svn revert
- 非常不同的东西-在Subversion中,还原将放弃您(未提交的)更改,将文件从存储库返回到当前版本,而git revert
“撤消”提交。
git reset
应该做等同于svn revert
,也就是说,放弃不必要的更改。
在这种特定的用例中,您实际上并不想中止合并,而只是以特定的方式解决冲突。
也不特别需要重置并执行具有不同策略的合并。git已经正确地突出显示了冲突,并且接受其他方面的更改的要求仅适用于此文件。
对于冲突中的未合并文件,git会在索引中提供文件的通用基本版本,本地版本和远程版本。(这是读取它们的位置,以便在3向差异工具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
git 1.6.1
命令很有意义,而且很好。那正是我想要的。我认为1.6.1之前的解决方案不完善,并且需要有关git其他部分的知识,这些知识应与合并解析过程分开。但是新版本很棒!
注释表明这git reset --merge
是的别名git merge --abort
。值得注意的是,git merge --abort
它仅等同于存在git reset --merge
a的MERGE_HEAD
情况。可以在git help for merge命令中阅读。
当存在MERGE_HEAD时,git merge --abort等效于git reset --merge。
合并失败后,如果MERGE_HEAD
没有合并失败,则可以使用git reset --merge
(但不一定使用)撤消失败的合并git merge --abort
。它们不仅是同一事物的新旧语法。
就个人而言,我发现git reset --merge
在与上述情况相似的情况下功能更强大,并且合并通常失败。
git stash apply
对我造成了合并冲突,但git merge --abort
没有帮助git reset --merge
。
保留工作副本状态的另一种方法是:
git stash
git merge --abort
git stash pop
我通常不建议这样做,因为它实际上就像在Subversion中合并一样,因为它在接下来的提交中丢弃了分支关系。
由于Git 1.6.1.3 git checkout
能够从合并的任意一侧检出:
git checkout --theirs _widget.html.erb
源树
因为您没有提交合并,所以只需双击另一个分支(这意味着将其签出),然后当sourcetree询问您有关放弃所有更改的信息时,请同意:)