如何在Git中将一个特定文件从一个分支合并到另一个分支

40

我在一个Git仓库中有两个分支,称为dev和test。我在一个文件中有更改,名为somecode.js。两个分支都对somecode.js进行了更改。这两个分支已经明显(但可管理)地分叉,因此直接的“合并”是不够的。

我尝试过http://jasonrudolph.com/blog/2009/02/25/git-tip-how-to-merge-specific-files-from-another-branch/,但它不会合并两个文件的内容。你基本上只是覆盖文件,而不是真正地合并文件的内容。

我还尝试过:

git checkout -b newbranch
git checkout test somecode.js
git commit -m "somecode changes from newbranch"
git checkout dev
git merge newbranch

并且

git checkout -m test somecode.js

我对-m合并命令很有期望,但它似乎对我不起作用...

我以为我离所需的东西很近了,但后来我意识到它只是快速转发提交,也就是说它没有合并,它覆盖了测试中原始文件。

因此,重新强调一下,如何在不仅仅是使用git将文件写入合并到的分支的情况下,将一个特定的文件从一个分支合并到另一个分支。


可能是重复问题:https://dev59.com/9nRB5IYBdhLWcg3w-789 - rlegendi
Cherry-pick并不能解决问题,因为它会合并完整的提交记录。这样会带来多个文件,我必须查看所有提交记录以确定哪些是相关的。 - jeremy
可能是重复的问题:如何合并单个文件的更改,而不是合并提交? - Ciro Santilli OurBigBook.com
3个回答

42

我想你喜欢使用

git checkout -p

根据您的情况

git checkout dev
git checkout -p test somecode.js

你可以交互地应用差异。


1
但是你不允许Git进行任何合并...你需要手动完成所有的工作。 - the.malkolm
1
@the.malkolm 在第一个问题中,您回答a就可以了。(a-应用此块和文件中的所有后续块) - Peter van der Does
这只是意味着你应用了“他们”的策略。 - the.malkolm
嗯,对我来说似乎不起作用。在执行“git checkout -p [other_branch] [path_to_file][filename]”之后的消息只是“没有更改”,这完美地总结了结果。也许我正在尝试拉取当前分支中不存在的目录/文件??? - SMBiggs
@ScottBiggs - 这可能是因为 other_branch 已经合并到您当前的分支中了。我还不确定如何解决这个问题。 - JBCP
git merge -p 看起来不再是一个有效的 git 选项了!有人能确认一下吗?我使用的是 git 版本 2.7.4。 - Alexander Mills

5
git checkout dev
git show test:somecode.js > somecode.js.theirs
git show $(git merge-base dev test):somecode.js > somecode.js.base
git merge-file somecode.js somecode.js.base somecode.js.theirs 

您可以手动进行三路合并,将test分支上的somecode.js与dev分支上的somecode.js合并。

或者...您可以创建一个包含所需更改的临时分支,并从该分支进行合并。这符合git的使用方式吗? :)

git checkout -b test/filtered $(git merge-base dev test)
git diff ..test -- somecode.js | git apply
git add -- somecode.js
git commit -m "Updated somecode.js"
git checkout dev
git merge --squash test/filtered
git branch -D test/filtered

我想那样做也可以,但我希望有一种“git方式”来完成它。如果我找不到git的方法,我会等待几个答案并批准这个方案。 - jeremy
这个是不是足够“git”的方式了? :) - the.malkolm
4
希望得到类似这样的东西:“git checkout -m test somecode.js”。 - jeremy

1

我认为git merge-file是你要找的。来自man页面:

git merge-file incorporates all changes that lead from the <base-file> to
<other-file> into <current-file>. The result ordinarily goes into <current-file>.
git merge-file is useful for combining separate changes to an original. Suppose
<base-file> is the original, and both <current-file> and <other-file> are
modifications of <base-file>, then git merge-file combines both changes.

我没有看到指定来自另一个分支的文件的方法。这似乎是用于内部使用的,可以展示一下用法吗? - jeremy
git merge-file 只是针对文件的 3-way 合并驱动程序。这个描述有点误导人,它并没有查看所有中间提交,而只是做了一个经典的3-way合并。 - Lily Ballard

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