如何将所有提交移动到另一个分支?

5
我正在独自进行这个项目(尽管其他人可能使用这个仓库),有一段时间,我把所有的提交都放在了“master”分支上(提交被推送到GitHub)。
但是现在,我决定“master”分支因为小的提交而变得杂乱不堪,为了让事情看起来更美观,我想把所有的提交历史都移到“wip”分支上,然后只在新版本上与“master”合并。
最终结果应该是一个“wip”分支,其内容和提交历史与当前的“master”分支完全相同,以及一个“master”分支,只有一个提交,其内容与当前的“wip”分支完全相同。
如何以最安全的方式实现这个目标?

当你“与新版本上的master合并”时,你希望master看起来像什么?它会与所有小的提交一样与wip相同吗?还是你打算为该版本创建一个单一的压缩提交? - M. Justin
第二个要求是,我希望 master 分支拥有一个与当前最新的 wip 分支相同的单一提交。 - Agr
我根据您的评论更新了您的问题,添加了您想要的最终结果。(如果我理解有误,请随时更正)。 - M. Justin
2个回答

3

你可以从当前的 master 历史记录创建 wip

git switch -c wip master

从那里,您可以在wip分支上工作,然后在准备好时合并到master

我还想清除主分支上的历史记录

然后,您可以将master重置为旧提交或所有一直返回到第一个提交,并强制推送它(假设您已经通知了其他用户该存储库)。


谢谢回答。我也想在主机上清除历史记录。 - Agr
@Agr 好的,我已经相应地编辑了我的答案。 - VonC
如果我进行硬重置并从我的WIP分支合并,是否会对其他人产生任何可能的副作用? - Agr
1
@Agr 请查看此答案以了解重写Git历史记录的实际后果是什么? - j6t
1
@j6t 是的:其他人需要获取并重置他们自己的主分支到你的分支。他们还需要在自己的分支中隔离他们的工作。 - VonC

1
一种方法是将当前的master分支重命名为wip,然后创建一个新的空的master分支。然后可以从wip中复制一组提交到新的master分支中,在新的master中将它们合并成单个提交。
# Rename the master branch to "wip" locally
git branch -m master wip

# Rename the remote master branch to "wip"
git push origin -d master
git push origin -u wip

# Check out a new, empty branch as master
git checkout --orphan master
git reset --hard

# Create a squashed commit matching the current state of wip
git checkout wip -- .
git add .
git commit

# Push the new master
git push origin -u master

详细解释

使用分支移动选项在本地重命名分支:

git branch -m master wip

使用push delete选项删除远程分支,然后使用push upstream选项添加与本地wip分支匹配的新的远程分支。
git push origin -d master
git push origin -u wip

创建一个没有提交历史记录的新空分支。这可以通过使用checkout orphan选项创建孤立分支(没有任何提交)来完成。现有文件将保留(未提交),因此请使用reset hard选项删除它们:
git checkout --orphan master
git reset --hard

将当前的 wip 分支状态复制到 master 分支。首先,使用 pathspec 检出 选项将 wip 分支中的所有文件复制到当前工作目录 pathspec (.),以递归方式包括当前工作目录中的所有文件。使用 pathspec 添加 选项将这些文件全部添加到索引中,使用当前工作目录 pathspec。最后,使用 提交 选项创建一个包含所有这些文件的单个提交:

git checkout wip -- .
git add .
git commit

最后,使用推送上游选项将新的master分支推送到源:
git push origin -u master

我曾考虑过孤立分支的做法,但最终决定不建议采取这种方法。这样,wip和master可以保留共同的历史记录(至少从第一次提交开始)。 - VonC
@VonC 确实如此,但是提问者似乎不想要一个共同的历史记录,而是希望有不同的、更大粒度的提交。然而,采用共同历史记录的方法确实有其优点。 - M. Justin
虽然我可能会误解,但我会问。 - M. Justin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接