我已经开始在我的项目中使用Git,其中前两个提交只是一些初始设置(.gitignore和.gitattributes),第三个提交M2添加了SVN主干的内容:
I1 -- I2 -- M2 -- N -- .. -- Z
Run Code Online (Sandbox Code Playgroud)
我已经在名为svn的分支中导入了SVN历史记录,其中M1是SVN中继(内容与M2相同,除了.gitignore和.gitattributes):
A -- B -- ... -- K -- L -- M1
Run Code Online (Sandbox Code Playgroud)
问:合并两个分支的最佳方法是什么?
我可以将M1和M2合并到M3中,然后重新绑定,但我不知道如何删除I1和I2提交,如果我可以安全地删除M3提交(我已经找到一些建议来保留合并提交,但是这种情况M3不再需要了).
A -- B -- ... -- K -- L -- M1
\
M3 -- N' -- .. -- Z'
/
I1 -- I2 -- M2 -- N -- .. -- Z …Run Code Online (Sandbox Code Playgroud) 我有两个不相关的(不共享任何祖先签入)Git存储库,一个是超级存储库,它包含许多较小的项目(让我们称之为存储库A).另一个只是一个小型项目的临时本地Git存储库(让我们称之为存储库B).从图形上看,它看起来像这样
A0-B0-C0-D0-E0-F0-G0-HEAD (repo A)
A0-B0-C0-D0-E0-F0-G0-HEAD (remote/master bare repo pulled & pushed from repo A)
A1-B1-C1-D1-E1-HEAD (repo B)
Run Code Online (Sandbox Code Playgroud)
理想情况下,我真的想将回购B合并到一个历史时间轴的回购A. 所以看起来我最初是在repo A中开始投影.从图形上看,这将是理想的最终结果
A0-A1-B1-B0-D1-C0-D0-E0-F0-G0-E1-H(from repo B)-HEAD (new repo A)
A0-A1-B1-B0-D1-C0-D0-E0-F0-G0-E1-H(from repo B)-HEAD (remote/master bare repo pulled & pushed from repo A)
Run Code Online (Sandbox Code Playgroud)
我一直在用子模块和子树进行一些阅读(顺便说一句,Pro Git是一本非常好的书),但它们似乎都能解决维护两个独立分支的问题,子模块能够从上游和子树略微拉动少头痛.这两种解决方案都需要额外的专用git命令来处理主检查和主树和模块分支之间的同步和同步.这两种解决方案也会产生多个时间轴(使用子树时,使用--squash时,您甚至可以获得3个单独的时间轴).
来自SO的最接近的解决方案似乎是在谈论" 移植 ",但真的是吗?我的目标是拥有一个统一的存储库,我可以在其中拉/推入签到,这样就没有更多的回购B,最后只需回购A.
我有一个旧的Git回购,打电话给它app.然后,一年后,我想从头开始重建应用程序,所以我做了一个新的回购,打电话给它app-2.
现在,我意识到我应该刚刚作出了一个新的分支或东西,而不是一个新的回购,因为我想移动的历史app-2之上app,然后摆脱app-2使app目前拥有的所有的历史app+ app-2.
这可能吗?
更新:
我尝试app通过删除app(.git目录除外)中的所有文件并进行提交来"重置" repo .然后:
cd ~/Projects/app-2
git format-patch --stdout --root master > ../app/app-2-patches.txt
cd ../app
git am app-2-patches.txt
Run Code Online (Sandbox Code Playgroud)
但是,我在有分支机构的地方遇到了冲突app-2.
是否可以app-2在保留历史分支结构的同时应用提交app-2?