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

问题描述

我正在单独处理项目(尽管其他一些人可能会使用此存储库)并且有一段时间,我将所有提交都提交到 master 分支(提交被推送到 GitHub)。

在这一点上,我认为 master 分支因小提交而变得过于混乱,为了使事情看起来更漂亮,我想将所有提交历史移至 wip 分支,然后仅在新版本中与 master 合并。

最终结果应该是一个 wip 分支,其内容和提交历史与当前的 master 分支相同,以及一个 master 分支,其单个提交的内容与当前 wip 分支相同{1}} 个分支。

最安全的方法是什么?

解决方法

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

git switch -c wip master

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

我也想清除master上的历史

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

,

一种方法是将当前的 master 分支重命名为 wip,然后创建一个新的空 master 分支。然后可以将提交组从 master 复制到新的 wip 分支,并在新的 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