我如何将所有提交移至另一个分支?

Posted

技术标签:

【中文标题】我如何将所有提交移至另一个分支?【英文标题】:How i move all commits to another branch? 【发布时间】:2021-09-09 21:08:37 【问题描述】:

我一个人在做项目(尽管其他人可能会使用这个 repo),并且有一段时间,我将所有提交都提交到 master 分支(提交被推送到 GitHub)。

但是在这一点上,我决定 master 分支因为小提交而变得过于混乱,为了让事情看起来更漂亮,我想将我所有的提交历史移动到 wip 分支,然后只与 @987654324 合并@新版本。

最终结果应该是一个 wip 分支,其内容和提交历史记录与当前 master 分支相同,并且一个 master 分支具有与当前 wip 分支相同的内容的单个提交。

最安全的方法是什么?

【问题讨论】:

当您“在新版本上与 master 合并”时,您希望 master 看起来像什么?它会与 wip 的所有小提交相同吗?还是您打算对该版本进行一次压缩提交? 第二个,我希望master 拥有与最新wip 阶段相同的单个提交。 我根据此评论更新了您的问题以添加您想要的最终结果。 (如果我解释错了,显然请随时修正)。 【参考方案1】:

您可以从当前的 master 历史记录创建 wip 开始:

git switch -c wip master

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

我也想清除master上的历史记录

然后你可以reset --hard你的master到一个较旧的提交,或者所有的way back to the first commit,并强制推送它(假设你已经通知了存储库的其他用户)。

【讨论】:

感谢您的回答。我也想清除master上的历史记录。 @Agr 好的,我已经相应地编辑了我的答案。 如果我硬重置然后从我的 wip 分支合并,是否对其他人有任何可能的副作用? @Agr 查看What are the practical consequences of rewriting Git history?的答案 @j6t 是的:其他需要获取并将他们自己的主分支重置为您的。他们还需要将自己的工作隔离在自己的分支中。【参考方案2】:

一种方法是将当前的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

详细解释

使用branch move 选项在本地重命名分支:

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 分支。首先,使用checkout with pathspec 选项和当前工作目录pathspec (.) 从wip 分支复制所有文件,以递归地包含当前工作目录中的所有文件。这些文件都使用带有当前工作目录路径规范的add with pathspec 选项添加到索引中。最后,使用 commit 选项创建包含所有这些文件的单个提交:

git checkout wip -- .
git add .
git commit

最后,使用push upstream 选项将新的master 分支推送到原点:

git push origin -u master

【讨论】:

我考虑过孤立分支,但决定不推荐这种方法。这样, wip 和 master 保持一个共同的历史(至少从第一次提交开始) @VonC 是的,但提问者似乎不想要一个共同的历史记录,而是有不同的、更大粒度的提交。不过,共同历史方法肯定有好处。 虽然我可能会误解。我会问的。

以上是关于我如何将所有提交移至另一个分支?的主要内容,如果未能解决你的问题,请参考以下文章

将方法移至另一个Java类,并从原始类中调用该方法

创建分支时如何获取提交[重复]

将一个分支与另一个首先提交的分支合并

使用 Git,我如何显示所有共享一个共同祖先的提交树?

如何恢复从一个分支合并的所有提交

如何将一个git的master分支提交添加到另一个git中?