问题描述
我正在单独处理项目(尽管其他一些人可能会使用此存储库)并且有一段时间,我将所有提交都提交到 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