Git如何从另一个分支部分合并文件

时间:2014-02-07 14:55:16

标签: git merge

分支brA:
topfolder /
- fileA
- folderA /
....
- folderZ /

分支brB:
topfolder /
- fileA
- folderA /
....
- folderZ /

假设我在brA上,我想合并除了fileA之外的brB中的所有文件,并创建一个新的brB提交。 也就是说,新提交应该包含原始的brA / fileA,以及除brB / fileA之外的所有brB文件。
我怎么能这样做呢?

3 个答案:

答案 0 :(得分:0)

也许你可以使用git合并策略。 我没有亲自使用它,但听起来是正确的。

http://git-scm.com/book/ch7-2.html#Merge-Strategies

希望它有所帮助。

安德烈

答案 1 :(得分:0)

所以你想要合并除了一个文件中的内容之外的所有内容。这有点乏味但应该有效:

$ git checkout -b brB-wo-fileA brB
$ git checkout <commit before changes to fileA> -- fileA
$ git commit -m 'brB-w-fileA-reverted' -- fileA
$ git checkout brA
$ git merge brB-wo-fileA

然后你可以用

完成它
$ git branch -d brB-wo-fileA

关于<commit before changes to fileA>,您可能会发现(没有承诺):

$ git merge-base brA brB

答案 2 :(得分:0)

可能会更好地满足您的需求
git checkout brA -- fileA
git commit -m "copy fileA from brA@$(git rev-parse --short brA)"

产生

  

原始brA / fileA,以及brB / fileA

以外的所有brB文件

关于你所得到的结果的所有内容,而不是将其作为合并广告。

如果由于某种原因在那里进行记录合并很重要,那么最简单的方法是

git checkout brB
git merge -s ours --no-commit brA
git checkout brA -- fileA

git commit -m 'just fileA from brA'

将会这样做,但重要的是要强调,进行合并会将brA的整个历史标记为迄今为止的合并,因此未来的合并将不会包含从brA到该点的任何内容,即

...X---B---M     brB
          /
  ...Y---A       brA

合并提交M显示正确合并的A和B的整个历史记录。如果你以后想要从A的历史中得到任何其他改变,那么你必须自己去追捕它们并挑选它们。


现在:在保存历史记录方面非常准确,您可以通过执行

将历史记录中的更改隔离开来。
git checkout $(git merge-base brA brB)
git checkout brA -- fileA
git commit -m "brA changes to fileA as of brA@$(git rev-parse brA --short)"
git tag wip

git checkout brB
git merge wip -m "brA:fileA"
git checkout brA
git merge wip -m "Identical to previous, recording separately-merged fileA"
git tag -d wip

将产生

Z---o...X---B---B+fAA     brB   # merge of fileA as of commit A
|\             /
| \-----------(fAA)             # fileA as of commit A
|              \
 \---...Y---A---A'        brA   # A' identical to A, recording separate fileA merges

任何阅读该内容的人(包括git merge)都能够准确无误地确定发生了什么。但这样做很不寻常(而且非常有用)以这种方式这样做可能会使那些并不真正了解历史图表的人感到困惑,因此任何下游冲突,即使是不涉及fileA的冲突,也可能引起不必要的惊慌。