如何在Git中用fork建立一个共同的祖先?

时间:2015-02-06 17:17:02

标签: git

我有一个包含项目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/

1 个答案:

答案 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报告"警告:没有常见提交": Proof of Concept