【问题标题】:How can I merge a specific file from one branch into another branch in Git如何将特定文件从一个分支合并到 Git 中的另一个分支
【发布时间】:2012-11-22 14:00:28
【问题描述】:

我在一个 git repo 中有 2 个分支,让我们调用它们,开发和测试。我在单个文件 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 覆盖我正在合并到的分支中的文件。

【问题讨论】:

标签: git


【解决方案1】:

我想你喜欢用

git checkout -p

你的情况

git checkout dev
git checkout -p test somecode.js

您可以交互式地应用差异。

【讨论】:

  • 但是你不允许 git 做任何合并。你手动完成所有的工作。
  • @the.malkolm 在第一个问题你回复a 就是这样。 (a - 在文件中应用这个大块和所有以后的大块)
  • 这只是意味着你应用“他们的”策略。
  • 嗯,似乎对我不起作用。 git checkout -p [other_branch] [path_to_file][filename] 之后的消息只是“没有变化”,它完美地总结了结果。也许我正在尝试拖入当前分支中不存在的目录/文件???
  • @ScottBiggs - 这可能是因为other_branch 已经合并到您当前的分支中。我还不确定如何解决这个问题。
【解决方案2】:
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 

这样,您将手动从测试分支上的 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-way”来做到这一点。如果我无法找到 git-way,我将等待更多答案并批准。
  • 这种“git 方式”是否足够? :)
  • 我希望有类似“git checkout -m test somecode.js”的东西
【解决方案3】:

我认为 git merge-file 是您正在寻找的。从手册页:

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.

【讨论】:

  • 我看不到从另一个分支指定文件的方法。这看起来可能是供内部使用的?可以显示使用情况吗?
  • git merge-file 只是文件的 3 路合并驱动程序。这种描述有点误导;它不会查看其间的所有提交,它只是进行经典的 3 路合并。
猜你喜欢
  • 2011-09-16
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多