我有一个包含项目foo的分支的git存储库:
origin/master
+src/
| +foo/
| +A/
| +B/
| +C/
+stuff/
我还有一个项目foo的镜像:
upstream/master
+foo/
+A/
+B/
+C/
我还没有git共同的祖先。我想建立一个共同的祖先,使未来的合并更容易,并合并自我分叉以来从上游foo的任何变化。
我试图将我对上游的更改重新定义为foo
:
C:\src>git rebase -s recursive -X subtree=foo/ --root upstream/master
但是,这并没有按照我想要的方式运作。我的origin/master
看起来与upstream/master
完全相同,但我的所有更改均未包含且完全缺少stuff
。
origin/master
+foo/
+A/
+B/
+C/
我需要做些什么才能将上游foo
与我的src/foo
合并?
我是否仅限于做这样的事情?
C:\src>git merge upstream/master -s recursive -X subtree=foo/
答案 0 :(得分:2)
我的建议是使用git filter-branch
重写upstream
,就像foo/
从一开始src/foo/
一样。基于https://stackoverflow.com/a/3212697/54249:
git filter-branch --commit-filter '
TREE="$1";
shift;
SUBTREE=`echo -e 040000 tree $TREE"\tsrc" | git mktree`
git commit-tree $SUBTREE "$@"' -- --all
那应该给我们:
upstream/master
+src/
+foo/
+A/
+B/
+C/
此时您应该能够将upstream/master
简单地合并到origin/master
中,并提供如下所示的git log --oneline --graph --decorate
:
* (HEAD, master) Merge branch 'master' of upstream
|\
| * (upstream/master) fourth upstream commit
| * third upstream commit
* | (origin/master) fourth origin commit
| * second upstream commit
* | third origin commit
| * first upstream commit
* second origin commit
* first origin commit
这是一对本地存储库的概念验证 - 请注意git pull
报告"警告:没有常见提交":