在使用Git和命令行合并期间如何保留本地文件或远程文件?


193

我知道如何使用vimdiff合并修改,但是,假设我只知道整个文件可以保留或丢弃,那该怎么办?

我不想为它们中的每一个打开vimdiff,而是更改为想要一个说“保持本地”或“保持远程”的命令。

EG:我合并了带有标记为已更改的文件,因为有人在Windows下打开了它,更改了EOL,然后提交了。合并时,我只想保留自己的版本并丢弃他的版本。

我也有相反的兴趣:我浪费了很多时间,想接受远程文件,放弃所做的更改。

Answers:


308

您也可以这样做:

git checkout --theirs /path/to/file

保留远程文件,以及:

git checkout --ours /path/to/file

保留本地文件。

然后git add他们就完成了。

版本:请记住,这是针对一种merge情况。在a期间,rebase --theirs指的是您工作过的分支。


4
我这样做了..但是什么也没有发生..我怎么知道它正在使用正确的文件?我正在使用,git version 1.8.4如果那很重要。
Rosdi Kasim 2014年

3
为什么使用反词?我假设“他们”将是远程文件,“我们”将是我的文件
phuclv

1
因此,它是,@LưuVĩnhPhúc
等待开发......

7
不,它们的含义颠倒了stackoverflow.com/q/2959443/995714 stackoverflow.com/q/29324812/995714他们的文件是我的文件,而我们的文件是远程分支中的文件
phuclv

6
“简单”,是的。直观吗?号
Wilbur Whateley

107

这种方法看起来更简单,避免了需要单独选择每个文件的情况:

# keep remote files
git merge --strategy-option theirs
# keep local files
git merge --strategy-option ours

要么

# keep remote files
git pull -Xtheirs
# keep local files
git pull -Xours

直接复制自: 解决Git合并冲突,以支持拉动期间的更改


3
爱这个。特别是如果有多个文件。
Tek

问题是针对两个不同的命令,但没有关于这两个命令的描述。每行做什么?
Alex

在找到这个之前,我经历了至少五个stackoverflow答案,这就是我想要的。谢谢。
博尔顿·贝利

14

git checkout {branch-name} -- {file-name}

这将使用所选分支中的文件。

我喜欢这个,因为posh-git自动完成功能可以很好地解决这个问题。它还消除了关于哪个分支是远程分支和哪个分支是本地分支的任何歧义。并--theirs没有为我反正工作。


毫不含糊,适用于{mine}和{theirs},并支持添加整个目录。这应该是公认的答案。
dotancohen

9

有关行端东西,请参阅man git-merge

--ignore-space-change 
--ignore-all-space 
--ignore-space-at-eol

确保添加autocrlf = false和/或添加safecrlf = false到Windows克隆(.git / config)

使用git mergetool

如果您像这样配置mergetool:

git config mergetool.cp.cmd '/bin/cp -v "$REMOTE" "$MERGED"'
git config mergetool.cp.trustExitCode true

然后一个简单的

git mergetool --tool=cp
git mergetool --tool=cp -- paths/to/files.txt
git mergetool --tool=cp -y -- paths/to/files.txt # without prompting

会做的工作

使用简单的git命令

在其他情况下,我假设

git checkout HEAD -- path/to/myfile.txt

应该可以

编辑以进行相反操作(因为您搞砸了):

git checkout remote/branch_to_merge -- path/to/myfile.txt

+1提示,但没有被接受,因为这不是我要的。我希望在所有情况下都能工作,而不仅仅是示例情况。如果您已经开始合并,则“ git checkout remote / branch_to_merge-path / to / myfile.txt”将不起作用:它将表示您正在合并中,并且将阻止您这样做。
e-satis

1
@ e-satis:令人惊讶。我认为这是一个错误,因为带有路径的签出不是常规的签出(并且不会影响HEAD)。我现在要尝试一下,因为我
简直

1
@ e-satis:太...我是对的;git checkout remote/branch_to_merge -- path/to/myfile.txt解决合并冲突时,它就像一个超级按钮。(git 1.7.1)
sehe 2011年

1
现在添加了一个基于git mergetool的解决方案
2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.