我正在使用 github 存储库,其中许多提交历史上都是“错误修复”、“这次真正的错误修复”、“确定最终错误修复”、“最终修复”。
这些都是直接提交给master的。我怎样才能压扁它们?
从他一年前的帖子开始——基本上听起来这很糟糕,想在 github 中压缩多个提交。过去一年有什么变化吗?
我正在使用 github 存储库,其中许多提交历史上都是“错误修复”、“这次真正的错误修复”、“确定最终错误修复”、“最终修复”。
这些都是直接提交给master的。我怎样才能压扁它们?
从他一年前的帖子开始——基本上听起来这很糟糕,想在 github 中压缩多个提交。过去一年有什么变化吗?
今天的答案基本上是一样的:压缩这些提交是可能的,但是在 Git 中要强烈避免重写共享历史。
想象一下,你和我每个人都有一个也存在于 GitHub 上的某个存储库的副本:
A---B---C
您注意到提交B
并且C
确实应该一起提交,因此您将这些提交压缩到本地副本中。你现在有
A---D
哪里D
是 and 的组合B
,C
而 GitHub 和我仍然有
A---B---C
此时,即使文件内容到处都是相同的,但我们的提交 ID 已经不同了。现在你不能在没有 的情况下推送到 GitHub --force
,因为 GitHub 的master
分支包含两个不再存在于你的历史记录中的提交。
如果您确实使用--force
,您可以让 GitHub 接受您的更改,但现在我的存储库包含上游不再存在的提交对象。--force
如果不使用(这将使您的更改无效)或不进行相对时髦的合并以引入您的更改,可能会重新调整我的工作等,我就无法推送到 GitHub 。只有当您在 Git 之外与我沟通告诉我你做了什么。
随着更多的开发人员(想象在 Linux 内核存储库上这样做!)以及同时完成更多工作,这变得更加混乱。
真的,任何时候你想git push --force
,坐下来想一想。您可能正在做一些应该只有非常充分的理由才能完成的事情。
我的建议是接受你的历史有点混乱,但要努力改进未来的事情。这些提交可以在本地清理,然后再推送到 GitHub(或与其他开发人员共享)。如有必要,在功能分支中工作,使用cherry-pick
,rebase
等清理提交历史记录,然后推送。
挤压是用于将大量提交合并为一个的东西。如果你想清理最后一个 serval 提交,检查你最后一个 git 日志,使用
git log
这看起来像这样
* df71a27 - (HEAD feature_x) Updated CSS for new elements (4 minutes ago)
* ba9dd9a - Added new elements to page design (15 minutes ago)
* f392171 - Added new feature X (1 day ago)
* d7322aa - (origin/feature_x) Proof of concept for feature X (3 days ago)
现在,如果您想压缩最后三个提交,那么
git rebase -i HEAD~3
通过这样做,您将进入这样的编辑器
pick f392171 Added new feature X
pick ba9dd9a Added new elements to page design
pick df71a27 Updated CSS for new elements
像这样编辑你想压扁的人
pick f392171 Added new feature X
squash ba9dd9a Added new elements to page design
squash df71a27 Updated CSS for new elements
完成后,保存并退出您的编辑器。Git 现在会将提交压缩为一个。全部做完!