如何将更改合并到单个文件,而不是合并提交?

时间:2012-05-28 12:15:13

标签: git merge git-branch

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

11 个答案:

答案 0 :(得分:522)

我遇到了同样的问题。确切地说,我有两个分支AB具有相同的文件,但在某些文件中有不同的编程接口。现在,文件f的方法独立于两个分支中的接口差异,在分支B中已更改,但更改对于两个分支都很重要。因此,我需要将分支f的文件B合并到分支f的文件A中。

如果我假设所有更改都在AB分支中提交,那么简单的命令就已经解决了我的问题:

git checkout A

git checkout --patch B f

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

社区编辑:如果HEADf上的文件B尚未存在,请忽略A选项。否则,你将获得“无变化”。消息。

答案 1 :(得分:13)

这是我在这些情况下所做的事情。这是一个kludge但它对我来说很好。

  1. 根据您的工作分支创建另一个分支。
  2. git pull / git合并包含要复制的文件的修订版(SHA1)。因此,这将合并您的所有更改,但我们只使用此分支来获取一个文件。
  3. 修复任何冲突等调查您的文件。
  4. 结帐您的工作分支
  5. 查看从合并中提交的文件。
  6. 承诺。
  7. 我尝试修补,我的情况太难看了。简而言之,它看起来像这样:

    工作科: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
    

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

答案 2 :(得分:8)

答案 3 :(得分:8)

这使用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.

答案 4 :(得分:2)

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

git checkout --patch master

答案 5 :(得分:1)

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

  

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

     

git checkout source_branch <paths>...

     

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

请阅读全文以获取更多了解

答案 6 :(得分: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.

答案 7 :(得分:0)

假设B是当前分支:

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

请注意,这仅对本地文件应用更改。你之后需要提交。

答案 8 :(得分:0)

我将照做

git format-patch branch_old..branch_new文件

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

在目标branch_old上应用补丁

git am blahblah.patch

答案 9 :(得分:0)

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

例如

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

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

答案 10 :(得分:-2)

git checkout <target_branch>
git checkout <source_branch> <file_path>