从合并到变基:如何清理合并提交历史记录?

4

我正在尝试建立一个良好的Git工作流,以便为开源项目(Endless Sky)做出贡献,但在开始学习时,我没有得到一个干净的历史记录。我的工作流程现在是:

  1. upstream/master这里
  2. 我的分支在 这里。我开始使用GitHub桌面应用程序,但现在正在逐渐转向命令行。
  3. 我的分支的主分支应该与 upstream/master 保持一致。每个我开发的功能都有一个自己的分支,从我的主分支创建,我使用自己的(本地)alpha 和(推送的)beta 分支来将我的功能组合起来进行测试/玩耍。
我的问题出现在我的fork主干上:This branch is 15 commits ahead of endless-sky:master.没有文件发生变化,只是合并的提交消息。这看起来对我来说很丑陋,所以我阅读了一些文章,特别是停止使用“git pull”:更好的工作流程,并切换到了rebase / fast-forwarding模式。
但在这种情况下,清理现有的合并提交历史记录的最佳方法是什么?它还涉及到我的一些特性分支(参见:feature/JammingHaywire),我不想提交一个PR,在这个PR中,有意义的提交被毫无意义的合并提交淹没。
我已经阅读了各种其他问题,并不十分清楚我是否最好:
  1. 删除/重建master — 在GitHub上这样做是否安全?
  2. 尝试从某个点开始执行git rebase -i [哪个提交?],似乎不起作用。我试过从之前fork的某个提交0facf00开始,但我的合并提交哈希(例如在GitHub上看到的3be4d97)在文本文件中没有显示出来需要删除。最终结果没有改变。
  3. 还有其他我没想到的方法吗?我正在尝试的做法本身是否是“好的实践”?

1
我已经通过编辑你的帖子,添加了你提到文章的链接。如果那不是正确的链接,随时可以更新或删除它。 - Scott Weldon
1
完美,谢谢。当时我无法添加第三个链接(初始用户限制),所以这真是一个很好的帮助。 - Elyssaen
2个回答

2
我的问题出现在我的派生主分支上:“此分支领先于endless-sky:master 15个提交。 ”没有更改文件;这是合并提交消息。
让我们从那里开始:
将您的派生主分支重置为endless-sky/master 假设您已经克隆了您的派生版本库:
cd /path/to/fork/clone
git checkout master
git remote add-url endless-sky /url/of/endless-sky
git fetch endless-sky
git reset --hard endless-sky/master
git push --force

现在,检出你打算从中发起PR的任何功能分支,并将其基于你的主分支重新定位(这也代表现在的endless-sky/master)。
git checkout my_feature_branch
git rebase master
git push --force

1

你的第一个选择,删除并重新创建 master,可能是最简单的。这里是如何清理这些东西:

  1. If you haven't already, switch to master:

    git checkout master
    
  2. Create a backup branch, just in case:

    git branch backup
    
  3. Reset master to match that of upstream. This is effectively the same as deleting and recreating the branch, your option 1, but only requires one command:

    git reset --hard upstream/master
    
  4. Force-push:

    git push --force-with-lease origin master
    

    Obligatory warning: Since a rebase rewrites history, this can be dangerous / disruptive for anyone else working on this branch. Be sure you clearly communicate what you have done with anyone you are collaborating with. Since this is a personal fork, I assume this won't be an issue for you.

您的 master 分支现在已经与 upstream/master 同步,因此在 GitHub 上您应该看到:

This branch is even with endless-sky:master.

如果您后来发现缺少任何东西,可以查看备份的历史记录以找到它。
要修复任何类似被破坏的功能分支,请执行以下操作:
git checkout myfeature
git rebase -i master

您的编辑器将打开,您将看到提交列表。删除任何包含额外合并的行,然后保存并退出。再次使用 --force-with-lease 推送。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接