我使用了 git pull
并发生了合并冲突:
unmerged: some_file.txt
You are in the middle of a conflicted merge.
如何放弃对文件的更改并仅保留拉取的更改?
[rejected] gh-pages -> gh-pages (non-fast-forward)
由于您的 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 版本 >= 1.6.1,则可以使用 git reset --merge
。
此外,正如@Michael Johnson 所提到的,如果您的 git 版本是 >= 1.7.4,您也可以使用 git merge --abort
。
与往常一样,请确保在开始合并之前没有未提交的更改。
当存在 MERGE_HEAD
时,git merge --abort
等效于 git reset --merge
。
MERGE_HEAD
在进行合并时出现。
此外,关于开始合并时未提交的更改:
如果您有不想在开始合并之前提交的更改,只需在合并之前 git stash
和在完成合并或中止合并之后 git stash pop
提交。
<commit>
? #GitMoment :-o
git merge --abort
只是 git reset --merge
的同义词吗?这个名字当然更有意义,但它有相同的功能吗?
git merge --abort
中止当前的冲突解决过程,并尝试重建预合并状态。如果合并开始时存在未提交的工作树更改, git merge --abort 在某些情况下将无法重建这些更改。因此,建议在运行 git merge 之前始终提交或存储您的更改。当 MERGE_HEAD 存在时, git merge --abort 等效于 git reset --merge。
http://www.git-scm.com/docs/git-merge
我认为这是您需要的git reset
。
请注意,git revert
与 svn revert
的含义非常不同 - 在 Subversion 中,revert 将丢弃您的(未提交的)更改,将文件从存储库返回到当前版本,而 git revert
“撤消”提交。
git reset
应该与 svn revert
等效,即丢弃不需要的更改。
对于 git >= 1.6.1:
git merge --abort
对于旧版本的 git,这将完成这项工作:
git reset --merge
或者
git reset --hard
在这个特定的用例中,您并不想中止合并,只需以特定方式解决冲突。
也没有特别需要重置和执行不同策略的合并。 git 已正确突出显示冲突,并且接受另一方更改的要求仅适用于这个文件。
对于冲突中未合并的文件,git 会在索引中提供文件的通用基础、本地和远程版本。 (这是 git mergetool
从中读取它们以在 3 向差异工具中使用的位置。)您可以使用 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 的其他部分,这些部分应该与合并解析过程分开。但是新版本很棒!
:1:
、:2:
和:3:
的语法是恢复基础和两个“提示”文件的方法,但我非常高兴知道这种技术,所以:非常感谢!
您可以中止合并步骤:
git merge --abort
否则你可以保留你的更改(你在哪个分支上)
git checkout --ours file1 file2 ...
否则您可以保留其他分支更改
git checkout --theirs file1 file2 ...
评论表明 git reset --merge
是 git merge --abort
的别名。值得注意的是,在存在 MERGE_HEAD
的情况下,git merge --abort
仅等同于 git reset --merge
。这可以在 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
有帮助。
stash pop
而发生合并时,MERGE_HEAD 不存在; reset --merge
将删除您未跟踪的文件。请参阅stackoverflow.com/a/67099267/1623757
如果您最终遇到合并冲突并且没有任何要提交的内容,但仍然显示合并错误。应用所有下面提到的命令后,
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
希望有帮助!!!
另一种保留工作副本状态的方法是:
git stash
git merge --abort
git stash pop
我通常不建议这样做,因为它实际上就像在 Subversion 中合并,因为它在以下提交中丢弃了分支关系。
可能不是 OP 想要的,但对我来说,我试图将一个稳定的分支合并到一个特性分支,并且有太多的冲突。我没有设法重置更改,因为 HEAD 被许多提交更改,所以简单的解决方案是强制签出到一个稳定的分支。然后您可以结帐到另一个分支,它将与合并前一样。
git checkout -f master
git checkout side-branch
为了避免陷入这种麻烦,可以扩展 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。最后删除测试和主测试。
涉及?是的,但在我做好准备之前,它不会影响我的主题或主分支。
我发现以下内容对我有用(将单个文件恢复为预合并状态):
git reset *currentBranchIntoWhichYouMerged* -- *fileToBeReset*
源树
因为您没有提交合并,所以只需双击另一个分支(这意味着签出它),当 sourcetree 询问您是否丢弃所有更改时,请同意。
笔记
这个答案是针对那些使用 SourceTree 作为 git 客户端的人。
不定期副业成功案例分享
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
更可取。