分支brA:
topfolder /
- fileA
- folderA /
....
- folderZ /
分支brB:
topfolder /
- fileA
- folderA /
....
- folderZ /
假设我在brA上,我想合并除了fileA之外的brB中的所有文件,并创建一个新的brB提交。
也就是说,新提交应该包含原始的brA / fileA,以及除brB / fileA之外的所有brB文件。
我怎么能这样做呢?
答案 0 :(得分:0)
答案 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的冲突,也可能引起不必要的惊慌。