[英]How to move part of git branch to different repo?
假设我有一个带有提交的 git repo:
H - add stuff
G - add stuff
F - add stuff
E - remove big files
D - add stuff
C - add big files
B - add stuff
A - initial commit
我想将这个 master 分支从提交 F 移动到不同的 repo 到 H,而没有从 A 到 E 的东西。基本上,新的 repo 将包含从 A 到 E 的压缩提交以及提交 F、G 和 H。
更新:根据评论,我尝试了以下方法,但最终导致合并冲突:
git checkout A
git checkout -b cleanup
git checkout master
git rebase -i cleanup
pick A
squash B
squash C
squash D
squash E
pick F
pick G
pick H
Git 在内部只是一个文件夹,其中包含代表文件状态快照的对象。
所以这个过程的第一步是复制你的整个项目,包括.git
文件夹(这很重要,如果它隐藏,你可能看不到它,但如果你只复制所有项目文件夹就可以了)。
下一步是在复制的文件夹中操作git rebase
命令,如下所示:
git rebase -i <A hash in this exmple ce0e2fd>
您将看到一个像这样的交互式窗口:
ce0e2fd pick A initial commit
72ab3c4 pick B add stuff
8150939 pick C add big files
301c1e1 pick D add stuff
ab123c4 pick E remove big files
342d191 pick F add stuff
12ce3d7 pick G add stuff
23fd457 pick H add stuff
...
如果您使用的是默认的 vim 编辑器,您可能还需要学习如何使用它。
我的建议是使用 vscode ,使用本教程将其更改为您的默认编辑器。
交互式变基为您的场景提供说明,因此您应该将 A 的"pick"
更改为"squash"
,直到 E:
ce0e2fd squash A initial commit
72ab3c4 squash B add stuff
8150939 squash C add big files
301c1e1 squash D add stuff
ab123c4 squash E remove big files
342d191 pick F add stuff
12ce3d7 pick G add stuff
23fd457 pick H add stuff
这会将 A 到 E 压缩为一个提交,允许您更改提交消息。
如果您乐于使用 A 的提交消息,则可以使用"fixup"
而不是"squash"
,并且不会提示您更新提交消息。
如果您想确保 A 到 E 的提交被完全删除并且不再可访问,请查看这个关于如何修剪悬空提交的答案。
根据评论和我们的讨论,您可能会面临一些冲突。
正如@mat所说:
“但它以合并冲突告终” 为什么它结束了? 合并冲突只有在你得到它们时停止才会结束。 不。 对合并冲突的正确反应是解决它们。 请记住,合并冲突还不错。 它们不是错误条件。 他们不是问题。 它们只是表明发生的事情超出了 Git 执行自动合并的能力。 合并冲突是一件好事:它们大大降低了 Git 在为您合并时出错的可能性。
这很简单。 假设以下历史:
4103511 (HEAD -> master) H - add stuff
7946283 G - add stuff
f78ffc7 F - add stuff
ced1bdc E - remove big files
1234ee9 D - add stuff
b9fd6c6 C - add big files
af5a768 B - add stuff
a1436d0 A - Initial commit
那么你也能:
从F
创建一个新分支:
$ git checkout -b newbranch f78ffc7
在newbranch
所有提交压缩为一个(感谢这个答案的提示):
$ git reset $(git commit-tree HEAD^{tree} -m "F - add stuff")
Cherry-pick 从master
提交G
和H
:
$ git cherry-pick 7946283
$ git cherry-pick 4103511
您最终会得到一个包含所需历史记录的新分支newbranch
:
1fafbe7 (HEAD -> newbranch) H - add stuff
4e9d879 G - add stuff
7bc7b56 F - add stuff
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.