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

Posted

技术标签:

【中文标题】如何在使用 Git 和命令行进行合并时保留本地文件或远程文件?【英文标题】:How to keep the local file or the remote file during merge using Git and the command line? 【发布时间】:2011-10-02 18:35:04 【问题描述】:

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

我不想为每个人打开 vimdiff,我想要一个显示“保持本地”或“保持远程”的命令。

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

相反,我也很感兴趣:我搞砸了,想接受远程文件,放弃我的更改。

【问题讨论】:

【参考方案1】:

line-end的东西,参考man git-merge:

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

请务必将 autocrlf = false 和/或 safecrlf = false 添加到 windows 克隆 (.git/config)

使用 git 合并工具

如果你像这样配置一个合并工具:

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:这很令人惊讶。我认为这是一个错误,因为带有路径的结帐不是常规结帐(并且它不会影响 HEAD)。我现在要试一试,因为我不敢相信 @e-satis: 太好了……我是对的; git checkout remote/branch_to_merge -- path/to/myfile.txt 在解决合并冲突时就像一个魅力。 (git 1.7.1) 现在添加了基于git mergetool的解决方案【参考方案2】:

你也可以这样做:

git checkout --theirs /path/to/file

保留远程文件,并且:

git checkout --ours /path/to/file

保留本地文件。

然后git add他们,一切都完成了。

版本: 请记住,这是针对merge 场景的。在rebase --theirs 指的是你一直工作的分支。

【讨论】:

我这样做了.. 但什么也没发生.. 我怎么知道它正在使用正确的文件?如果这很重要,我正在使用git version 1.8.4 为什么使用反义词?我假设“他们的”是远程文件,“我们的”是我的文件 原来如此,@LưuVĩnhPhúc 不,它们的意思是颠倒的***.com/q/2959443/995714***.com/q/29324812/995714他们是我的文件,我们的是远程分支中的文件 “简单”,是的。直觉的?没有。【参考方案3】:

这种方法似乎更直接,无需单独选择每个文件:

# 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

直接复制自: Resolve Git merge conflicts in favor of their changes during a pull

【讨论】:

喜欢这个。特别是如果有多个文件。 问题是针对两个不同的命令,但没有说明这两个命令的作用。每条线的作用是什么? 在找到这个之前,我至少经历了五个 *** 答案,这就是我想要的。谢谢。 嗨@keflavich,如果我正在从一个分支到另一个分支进行rebase,并且我想使用这个git merge --strategy-option theirs 策略,我应该在什么时候输入这个命令?它只是暂时的吗?我希望它只在这个变基中有效,而不是在未来的变基中。 找到了答案,抱歉没有意识到这个帖子只是合并,我以为是合并冲突。 ***.com/a/4273436/4582240【参考方案4】:

git checkout branch-name -- file-name

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

我喜欢这个,因为 posh-git 自动完成非常适合这个。它还消除了关于哪个分支是远程分支和哪个分支是本地的任何歧义。 无论如何,--theirs 对我不起作用。

【讨论】:

没有歧义,适用于 mine 和 theirs,支持添加整个目录。 这应该是公认的答案。【参考方案5】:

我一天前问的问题,这个问题非常相似,但我的问题略有不同,因为它与数据库 sqlite3 有关。

但是这个网站的一位经理要求我删除这个问题,所以我确实删除了它,但他最终阻止了我。

无论如何,我的问题的答案是“git checkout --their db.sqlite3”

与数据库相关的东西,那么只需简单地“git checkout --their db.sqlite3”就不需要放路径了。

我把这个答案留给和我有同样问题的人。

【讨论】:

这与接受的答案有何不同?考虑改进它以使其与更广泛的受众相关或将其删除。

以上是关于如何在使用 Git 和命令行进行合并时保留本地文件或远程文件?的主要内容,如果未能解决你的问题,请参考以下文章

git(五 合并提交命令)

windows中使用Git如何解决文件冲突?

git 命令行提交代码冲突时解决办法

git merge原理(递归三路合并算法)

如何解决Git代码冲突问题?-Git实战-黑马程序员

如何使用--theirs或--ours合并大多数冲突?