我如何将所有提交移至另一个分支?
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 是的,但提问者似乎不想要一个共同的历史记录,而是有不同的、更大粒度的提交。不过,共同历史方法肯定有好处。 虽然我可能会误解。我会问的。以上是关于我如何将所有提交移至另一个分支?的主要内容,如果未能解决你的问题,请参考以下文章