如何放弃远程更改并将文件标记为“已解决”?
我有一些本地文件,我从远程分支拉,有冲突。 我知道我想保留我的本地更改并忽略导致冲突的远程更改。 有没有一个命令我可以用来实际上说“标记所有的冲突解决,使用本地”?
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
有两种模式; 一个在其中切换分支,另一个在索引中检查文件到工作副本中(有时将其从另一个修订中首先拉到索引中)。 它的区别在于你是否通过了一个文件名; 如果你没有传入一个文件名,它会尝试切换分支(尽pipe如果你没有传入一个分支,它只会尝试再次检出当前分支),但是如果有修改过的文件,它会拒绝这么做那会影响。 所以,如果你想要一个覆盖现有文件的行为,你需要通过.
或一个文件名,以获得第二个行为从git checkout
。
当传入文件名时,还有一个好习惯,就是用--
git checkout --ours -- <filename>
它,例如git checkout --ours -- <filename>
。 如果你不这样做,并且文件名恰好匹配一个分支或标签的名字,那么Git会认为你想检查这个修订版本,而不是检查那个文件名,所以使用第一种checkout
forms命令。
我将扩展一下Git中的冲突和合并工作。 当你在其他人的代码中合并时(这种情况也发生在一个拉取过程中;一个拉取本质上是一个获取,然后是一个合并),可能出现的情况很less。
最简单的是你在同一个版本。 在这种情况下,你“已经是最新的”,没有任何反应。
另一种可能是他们的修改只是你的后代,在这种情况下,你将默认有一个“快进合并”, HEAD
只是更新到他们的提交,没有合并发生(这可以被禁用,如果你真的想要logging一个合并,使用--no-ff
)。
然后,你将进入实际需要合并两个修订版的情况。 在这种情况下,有两种可能的结果。 一个是合并发生干净, 所有的改变都在不同的文件中,或者在相同的文件中,但是相距甚远,这两组改变都可以毫无问题地应用。 默认情况下,当一个干净的合并发生时,它会自动提交,但是如果你需要预先编辑它,你可以用--no-commit
来禁用它(例如,如果你把foo
重命名为bar
,并且其他人添加了新的代码调用foo
,它会干净地合并,但会产生一个破碎的树,所以你可能想要清理它作为合并提交的一部分,以避免有任何破坏的提交)。
最后的可能是有一个真正的合并,有冲突。 在这种情况下,Git会尽可能多地进行合并,并生成带有冲突标记( <<<<<<<
, =======
和>>>>>>>
)的文件工作副本。 在索引(也称为“暂存区域”, git add
在提交它们之前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
在重新设置期间是如何交换的(因为上游分支已经被检出)。