0

我正在使用 github 存储库,其中许多提交历史上都是“错误修复”、“这次真正的错误修复”、“确定最终错误修复”、“最终修复”。

这些都是直接提交给master的。我怎样才能压扁它们?

从他一年前的帖子开始——基本上听起来这很糟糕,想在 github 中压缩多个提交。过去一年有什么变化吗?

4

2 回答 2

2

今天的答案基本上是一样的:压缩这些提交是可能的,但是在 Git 中要强烈避免重写共享历史。

想象一下,你和我每个人都有一个也存在于 GitHub 上的某个存储库的副本:

A---B---C

您注意到提交B并且C确实应该一起提交,因此您将这些提交压缩到本地副本中。你现在有

A---D

哪里D是 and 的组合BC而 GitHub 和我仍然有

A---B---C

此时,即使文件内容到处都是相同的,但我们的提交 ID 已经不同了。现在你不能在没有 的情况下推送到 GitHub --force,因为 GitHub 的master分支包含两个不再存在于你的历史记录中的提交。

如果您确实使用--force,您可以让 GitHub 接受您的更改,但现在我的存储库包含上游不再存在的提交对象。--force如果不使用(这将使您的更改无效)或不进行相对时髦的合并以引入您的更改,可能会重新调整我的工作等,我就无法推送到 GitHub 。只有当您在 Git 之外与我沟通告诉我你做了什么。

随着更多的开发人员(想象在 Linux 内核存储库上这样做!)以及同时完成更多工作,这变得更加混乱。

真的,任何时候你想git push --force,坐下来想一想。您可能正在做一些应该只有非常充分的理由才能完成的事情。

我的建议是接受你的历史有点混乱,但要努力改进未来的事情。这些提交可以在本地清理,然后再推送到 GitHub(或与其他开发人员共享)。如有必要,在功能分支中工作,使用cherry-pick,rebase等清理提交历史记录,然后推送。

于 2014-06-17T19:52:17.550 回答
1

挤压是用于将大量提交合并为一个的东西。如果你想清理最后一个 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 现在会将提交压缩为一个。全部做完!

于 2017-10-13T09:02:17.667 回答