13

尝试在个人项目中使用/学习 git。只有我和一个远程 git repo,一些提交,我陷入了失败的合并。我的很多文件现在也有 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!
4

2 回答 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

有一个混乱的替代方案可以破坏使用相同远程来源的其他所有人的 repo。仅当您是唯一使用它的人时才考虑它:

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

解释(现在我理解git得更好了)
发生这种情况的原因是因为修改提交更改了“历史”。在本地执行此操作是安全的,因为它不会影响其他任何人。但是,修改已经推送的提交确实会影响其他 repos,并且是不安全的。

于 2012-10-18T14:35:30.513 回答
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
于 2012-09-28T02:45:13.697 回答