2012-05-28 45 views
270

我有两个分支(A和B),我想合并分支A中的单个文件和分支B中相应的单个文件。如何合并对单个文件的更改,而不是合并提交?

+2

已经在这里讨论http://stackoverflow.com/questions/449541/how-do-you-merge-selective-files-with-git-merge – positron

+19

大多数的答复到那个职位是关于如何有选择地合并*提交*,而不是*文件*。这使选定的答案不正确。这个问题仍然没有答案。 – 2012-07-12 16:40:02

+0

可能的重复[你如何合并选择性文件与git合并?](http://stackoverflow.com/questions/449541/how-do-you-merge-selective-files-with-git-merge) –

回答

446

我遇到了同样的问题。准确地说,我有两个分支AB具有相同的文件,但在一些文件中有不同的编程接口。现在,分支B中文件f的方法与两个分支中的接口差异无关,但分支对这两个分支都是重要的。因此,我只需要将分支B的文件f合并到分支A的文件f中。

一个简单的命令已经解决了这个问题对我来说,如果我认为所有的变化都致力于在两个分支AB

git checkout A 

git checkout --patch B f 

第一个命令切换到分行A,到了我要合并B该文件的版本为f。第二个命令将f的文件f修改为HEADB。您甚至可以接受/丢弃该补丁的单个部分。而不是B您可以在此指定任何提交,它不必是HEAD

社区编辑:如果B文件f上不存在A然而,则省略--patch选项。否则,你会得到一个“没有改变”。信息。

+7

工程简单而有效。谢谢! – bcr

+0

非常有帮助。我添加了一些关于远程合并的信息,他们与分支一样工作,但并不是每个人都知道这一点。 – Soup

+9

这只适用于需要更新文件的情况。如果我想从分支B向分支A添加新文件,该怎么办? – Neutralizer

13

这是我在这些情况下所做的。这是一个混乱,但它对我来说工作得很好。

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

我试过打补丁,我的情况太难看了。总之,它看起来像这样:

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

git checkout A 

创建基于新的分支:

git checkout -b tempAB 

合并B插入tempAB

git merge B 

复制合并的SHA1哈希:

git log 

commit 8dad944210dfb901695975886737dc35614fa94e 
Merge: ea3aec1 0f76e61 
Author: matthewe <[email protected]> 
Date: Wed Oct 3 15:13:24 2012 -0700 

Merge branch 'B' into tempAB 

结帐的工作分部:

git checkout A 

Checkout的固定更新文件:

git checkout 7e65b5a52e5f8b1979d75dffbbe4f7ee7dad5017 file.txt 

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

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

此用途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. 
0

假设B是当前分支:

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

注意,这仅适用更改本地文件。你需要事后提交。

+0

对我来说,这产生了一个'错误::已经存在于工作目录中' – kontur

2

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

git的结帐--patch主