繁体   English   中英

如何将部分 git 分支移动到不同的仓库?

[英]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

那么你也能:

  1. F创建一个新分支:

    $ git checkout -b newbranch f78ffc7

  2. newbranch所有提交压缩为一个(感谢这个答案的提示):

    $ git reset $(git commit-tree HEAD^{tree} -m "F - add stuff")

  3. Cherry-pick 从master提交GH

    $ 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM