我如何放弃远程更改并将文件标记为“已解决”?
我有一些本地文件,我从远程分支拉,有冲突。 我知道我想保留本地更改并忽略导致冲突的远程更改。 有没有一个命令可以用来实现“将所有冲突标记为已解决,使用本地”?
git checkout
有--ours
选项来检出你在本地的文件版本(而不是--theirs
,这是你拉入的版本)。 你可以通过.
让git checkout
告诉它检查树中的所有内容。 然后,您需要将冲突标记为已解决,您可以使用git add
,并在完成后提交工作:
git checkout --ours . # checkout our local version of all files
git add -u # mark all conflicted files as merged
git commit # commit the merge
注意.
在git checkout
命令中。 这非常重要,而且很容易错过。 git checkout
有两种模式; 一个用于切换分支,另一个用于将文件从索引中检入到工作副本中(有时将其从另一个修订中首先拉入索引)。 它的区别在于你是否通过了一个文件名; 如果你没有传入文件名,它会尝试切换分支(尽管如果你没有传入分支,它只会尝试再次检出当前分支),但是如果有修改过的文件,它会拒绝这么做那会影响。 因此,如果您想要覆盖现有文件的行为,则需要传入.
或一个文件名,以便从git checkout
获得第二个行为。
当传入文件名时,还有一个好习惯,用--
来抵消它,比如git checkout --ours -- <filename>
。 如果你不这样做,并且文件名恰好匹配分支或标签的名称,Git会认为你想检查该修订版,而不是检查该文件名,所以使用第一种checkout
形式命令。
我将扩展一下Git中的冲突和合并工作。 当你在别人的代码中合并时(这也发生在拉取过程中;拉取本质上是一个获取,然后是合并),但是有几种可能的情况。
最简单的是你在同一个版本。 在这种情况下,你“已经是最新的”,没有任何反应。
另一种可能性是,他们的版本简直就是你的后代,在这种情况下,你将默认有一个“快进合并”,在你的HEAD
是刚刚更新了自己的承诺,没有合并发生的事情(这可如果被禁用你真的想记录一个合并,使用--no-ff
)。
然后,您将进入实际需要合并两个修订版的情况。 在这种情况下,有两种可能的结果。 一个是合并发生干净; 所有更改都在不同的文件中,或者位于相同的文件中,但分开的距离足够远,以便两组更改都可以毫无问题地应用。 默认情况下,当干净的合并发生时,它会自动提交,但是如果需要事先编辑它,可以使用--no-commit
禁用它(例如,如果您将foo
重命名为bar
,并且其他人添加了新代码这会调用foo
,它会干净地合并,但会产生一棵破碎的树,所以你可能想把它作为合并提交的一部分进行清理,以避免任何中断提交)。
最后的可能性是存在真正的合并,并且存在冲突。 在这种情况下,Git会尽可能多地进行合并,并在您的文件中生成带有冲突标记( <<<<<<<
, =======
和>>>>>>>
)的文件工作副本。 在索引(也称为“暂存区域”;在提交它们之前由git add
存储文件的位置)中,每个文件都有3个版本存在冲突; 从正在合并的两个分支的祖先, HEAD
的版本(合并的您的一侧)以及远程分支的版本中有文件的原始版本。
为了解决冲突,您可以编辑工作副本中的文件,删除冲突标记并修改代码以使其工作。 或者,您可以使用git checkout --ours
或git checkout --theirs
合并的一个或另一个版本的版本。 一旦你把文件放到你想要的状态,你表示你已经完成了合并文件,并且已经准备好使用git add
进行提交,然后你可以用git commit
提交合并。
确保冲突起源:如果它是git merge
的结果,请参阅Brian Campbell的答案。
但如果是git rebase
的结果,为了放弃远程(他们)的更改并使用本地更改,您必须执行以下操作:
git checkout --theirs -- .
请参阅“为什么ours
”和“ theirs
”的含义颠倒了“”以查看ours
和theirs
在重新贷款期间如何交换(因为上游分支已退出)。
上一篇: How can I discard remote changes and mark a file as "resolved"?
下一篇: How do you get git to always pull from a specific branch?