我如何放弃远程更改并将文件标记为“已解决”?

我有一些本地文件,我从远程分支拉,有冲突。 我知道我想保留本地更改并忽略导致冲突的远程更改。 有没有一个命令可以用来实现“将所有冲突标记为已解决,使用本地”?


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 --oursgit checkout --theirs合并的一个或另一个版本的版本。 一旦你把文件放到你想要的状态,你表示你已经完成了合并文件,并且已经准备好使用git add进行提交,然后你可以用git commit提交合并。


确保冲突起源:如果它是git merge的结果,请参阅Brian Campbell的答案。

但如果是git rebase的结果,为了放弃远程(他们)的更改并使用本地更改,您必须执行以下操作:

git checkout --theirs -- .

请参阅“为什么ours ”和“ theirs ”的含义颠倒了“”以查看ourstheirs在重新贷款期间如何交换(因为上游分支已退出)。

链接地址: http://www.djcxy.com/p/41681.html

上一篇: How can I discard remote changes and mark a file as "resolved"?

下一篇: How do you get git to always pull from a specific branch?