457

我有两个分支(A 和 B),我想将来自分支 A 的单个文件与来自分支 B 的相应单个文件合并。

4

11 回答 11

754

我遇到了同样的问题。准确地说,我有两个分支AB文件相同,但某些文件中的编程接口不同。f现在,与两个分支的接口差异无关的file 方法在 branch 中进行B了更改,但更改对两个分支都很重要。因此,我需要将分支文件合并f到分支B文件fA

如果我假设所有更改都在两个分支中提交,那么一个简单的命令已经为我解决了这个A问题B

git checkout A

git checkout --patch B f

第一个命令切换到分支A,进入我想要合并B文件版本的位置f。第二个命令ffof修补文件HEADB您甚至可以接受/丢弃补丁的单个部分。B您可以在此处指定任何提交,而不必是HEAD.

社区编辑:如果文件fB尚不存在A,则省略该--patch选项。否则,您将得到“无变化”。信息。

于 2012-07-21T15:11:42.987 回答
23

这使用了 git 的内部 difftool。也许有一点工作要做,但直截了当。

#First checkout the branch you want to merge into
git checkout <branch_to_merge_into>
    
#Then checkout the file from the branch you want to merge from
git checkout <branch_to_merge_from> -- <file> 
    
#Then you have to unstage that file to be able to use difftool
git reset HEAD <file> 

#Now use difftool to chose which lines to keep. Click on the mergebutton in difftool
git difftool

#Save the file in difftool and you should be done.
于 2014-06-26T12:33:29.613 回答
19

这是我在这些情况下所做的。这是一个杂物,但对我来说效果很好。

  1. 根据您的工作分支创建另一个分支。
  2. git pull/git merge 包含您要复制的文件的修订版 (SHA1)。所以这将合并你所有的更改,但我们只使用这个分支来获取一个文件。
  3. 修复任何冲突等。调查您的文件。
  4. 检查你的工作分支
  5. 签出从合并中提交的文件。
  6. 提交它。

我尝试打补丁,但我的情况太丑陋了。所以简而言之,它看起来像这样:

工作分支:A 实验分支:B(包含 file.txt,其中包含我想要折叠的更改。)

git checkout A

基于A创建新分支:

git checkout -b tempAB

将 B 合并到 tempAB

git merge B

复制合并的 sha1 哈希:

git log

commit 8dad944210dfb901695975886737dc35614fa94e
Merge: ea3aec1 0f76e61
Author: matthewe <matthewe@matthewe.com>
Date:   Wed Oct 3 15:13:24 2012 -0700

Merge branch 'B' into tempAB

检查您的工作分支:

git checkout A

签出您的固定文件:

git checkout 7e65b5a52e5f8b1979d75dffbbe4f7ee7dad5017 file.txt

你应该有它。提交你的结果。

于 2012-10-03T22:18:02.733 回答
11

我发现这种方法简单而有用:How to "merge" specific files from another branch

事实证明,我们太努力了。我们的好朋友 git checkout 是完成这项工作的正确工具。

git checkout source_branch <paths>...

我们可以简单地为 git checkout 提供功能分支 A 的名称以及我们要添加到主分支的特定文件的路径。

请阅读整篇文章以获得更多理解

于 2019-03-28T16:58:58.183 回答
9

你可以使用:

    git merge-file

提示:https ://www.kernel.org/pub/software/scm/git/docs/git-merge-file.html

于 2013-07-03T18:49:33.943 回答
5

以下命令将 (1) 比较正确分支的文件,以便掌握 (2) 交互式询问您要应用哪些修改。

git checkout --patch master

于 2017-02-23T09:13:16.687 回答
1

您可以签出要合并的文件的旧版本,将其保存为不同的名称,然后在这两个文件上运行您的合并工具。

例如。

git show B:src/common/store.ts > /tmp/store.ts(其中 B 是分支名称/提交/标签)

meld src/common/store.ts /tmp/store.ts

于 2019-02-14T04:42:51.857 回答
0

我的编辑被拒绝了,所以我在此处附上了如何处理来自远程分支的合并更改。

如果您必须在错误合并后执行此操作,您可以执行以下操作:

# If you did a git pull and it broke something, do this first
# Find the one before the merge, copy the SHA1
git reflog
git reset --hard <sha1>

# Get remote updates but DONT auto merge it
git fetch github 

# Checkout to your mainline so your branch is correct.
git checkout develop 

# Make a new branch where you'll be applying matches
git checkout -b manual-merge-github-develop

# Apply your patches
git checkout --patch github/develop path/to/file
...

# Merge changes back in
git checkout develop
git merge manual-merge-github-develop # optionally add --no-ff

# You'll probably have to
git push -f # make sure you know what you're doing.
于 2012-11-21T02:50:19.503 回答
0

假设 B 是当前分支:

$ git diff A <file-path> > patch.tmp
$ git apply patch.tmp -R

请注意,这只会将更改应用于本地文件。之后你需要提交。

于 2016-01-22T15:29:57.497 回答
0

我会这样做

git format-patch branch_old..branch_new file

这将为该文件生成一个补丁。

在目标 branch_old 应用补丁

git am blahblah.patch

于 2019-01-12T16:35:45.913 回答
-2
git checkout <target_branch>
git checkout <source_branch> <file_path>
于 2020-12-09T05:29:42.857 回答