我使用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 --mergea的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询问您有关放弃所有更改的信息时,请同意:)