Git:目前与私有远程仓库合并/冲突。如何告诉Git只使用我的本地文件?

13

尝试在个人项目中使用/学习git。只有我和一个远程git仓库,几次提交,但现在陷入了合并失败的困境。现在我的很多文件都有Git合并冲突标记。

我该如何告诉git只使用我的修改,抛弃其他的?

以下是我遇到问题的具体例子:

echo A new file > myFile.txt             # example file
git add myFile.txt                       # add file
git commit                               # commit changes
git push                                 # push changes to remote repo
echo A conflicting edit > myFile.txt     # oh, no, forgot some changes
git add myFile.txt                       # add again
git commit --amend                       # amend previous commit
git push                                 # fails. Git suggests to do a pull first
git pull origin HEAD                     # "Automatic merge failed" Now what?
                                         # Just use what I have locally!

是的。没有找到一个简单的“使用我的本地所有内容”的命令。 - Kache
Git合并冲突在这个超级线程中得到解决:https://dev59.com/J3VC5IYBdhLWcg3w21Iq - Jessedc
2
是的,找到了那个帖子。但它对我没有帮助。他们谈论使用我无法使用的工具(git mergetool),查看冗长的文档,一般性的建议如何避免合并等等。当我在谷歌上搜索“Git use local”时,我一直找到有关如何在没有远程源的情况下在计算机上使用git的文章。这真是令人恼火。你是说没有一个一行命令就可以告诉git“使用我的本地”吗? - Kache
1
这与“git合并大帖”完全不同,这是一个特定的合并场景,因此最好将其放在这里,而不是在有10个回复和100个评论的大帖中迷失在噪音中。 - Mark E. Haase
@mehaase 谢谢!这正是我所期望的。 - Kache
2个回答

17
git checkout --ours . # checkout our local version of all files
git add -u            # mark all conflicted files as merged/resolved
git commit            # commit the merge

有一种混乱的替代方法,可能会破坏所有其他使用相同远程源的人的仓库。只有在您是唯一使用它的人时才考虑使用:

git reset --hard HEAD # undo that failed merge
git push --force      # replace everything remote with local

解释(现在我更好地理解了git
这种情况发生的原因是修改提交会改变“历史”记录。本地进行这样的操作是安全的,因为它不会影响其他人。然而,修改已经推送过的提交就会影响其他仓库,并且不安全。


man git-merge 在“如何解决冲突”部分提供了一种替代方案。git merge --abort - ignis

6
你的GUI可能只是设置了--strategy=ours (git merge -s ours <branch>)。这将执行合并,引用两个提交作为父级,但保留整个目录状态。
你的另一个选择是使用git merge -s recursive -X ours <branch>,它将尝试从两个分支中获取文件,但每当出现冲突时都会优先选择你的版本。 文档 你可以使用以下演示shell脚本查看两种不同的风格。
#!/bin/sh

mkdir gittest
cd gittest
git init

git checkout master
echo "Line one" > bar
git add bar
git commit -m "Original commit"

git checkout -b fork1
echo "Line one and something" > bar
echo "Line two" > bam
git add bar bam
git commit -m "Fork1 commit."

git checkout master
git checkout -b fork2
echo "Line one and other stuff" > bar
echo "Line three" > baz
git add bar baz
git commit -m "Fork2 commit."

git checkout fork1
if [ "$1" = "ours" ]; then
  # `ls gittest` => bam bar
  # `cat gittest/bar` => Line one and something
  git merge -s ours fork2
else
  # `ls gittest` => bam bar baz
  # `cat gittest/bar` => Line one and something
  git merge -X ours fork2
fi

2
+1 合并策略。更多关于合并策略的好信息请参考 https://dev59.com/_XRC5IYBdhLWcg3wP-Zh - Jessedc
3
附注:也可以尝试使用 git merge -s recursive -X ours 命令来接受自动合并的更改,但如果出现冲突,则始终使用本地副本。 - Jeff Bowman
没有成功。我收到以下错误信息: 错误:由于您有未合并的文件,因此无法执行“merge”操作。 提示:在工作树中修复它们, 提示:然后使用“git add/rm <file>”来标记解决方案并进行提交, 提示:或使用“git commit -a”。 致命错误:由于存在未解决的冲突而退出。 - Kache
@Kache,看起来你还在合并过程中,此时你必须解决所有文件才能继续。要取消合并,请运行 git reset --hard HEAD,然后尝试我的步骤。你也可以尝试一个演示脚本,展示两种不同的“ours”策略,网址是http://pastebin.com/ScLzuHf7。 - Jeff Bowman
像那样重置只会把我带回到原来的状态,也就是我的本地仓库认为一切都很好并且已更新。无论如何,我找到了我需要的答案并将其编辑到了我的问题中。我想正式提交一个答案,但他们却关闭了我的问题。 =\ - Kache
啊,我现在明白你的方法是如何工作的了。它执行了一个从“工作目录干净”的状态合并。然而,这意味着为了达到我想要的效果,你必须将当前副本分支(branch)存储(stash)到某个地方,以便你可以干净地git merge两个干净的分支。 - Kache

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接