将 Git 工作流程从合并切换到变基:如何清理合并提交历史记录?

Switching Git workflow from merge to rebase: how to clean up a merge commit history?

我正在努力建立一个良好的 Git 工作流程来为一个开源项目 (Endless Sky) 做贡献,但是在我开始学习的过程中,我并没有得到一个干净的历史。我现在的工作流程是:

  1. upstream/masterhere.
  2. 我的叉子是here。我开始使用 GitHub Desktop,但我开始切换到命令行。
  3. 我的 fork 的 master 应该镜像 upstream/master。我开发的每个功能都有一个分支,由我的主人创建,我使用我自己的(本地)alpha 和(推送)beta 分支将我的功能组合到 test/play。

我的问题出在我的分叉主机上:This branch is 15 commits ahead of endless-sky:master. 没有文件改变;它是合并提交消息。这对我来说似乎很难看,所以我读了一些书,尤其是文章 Stop using 'git pull': A better workflow,然后我切换到 rebasing/fast-forwarding。

但是在这种情况下清理现有合并提交历史的最佳方法是什么?它也触及了我的一些功能分支(参见:feature/JammingHaywire),我不想提交一个有意义的提交被无意义的合并提交淹没的 PR。

我已经阅读了其他各种问题,但不太清楚我是否是最佳人选:

  1. deleting/remaking master — 这样安全吗,尤其是 GitHub?
  2. 尝试 git rebase -i [which commit?] 回到某个点 — 似乎没有用。尝试回到 0facf00,一些提交 long 在我分叉之前,我的合并提交哈希(例如 3be4d97 在 GitHub 上看到)不t 出现在要删除的文本文件中。最终结果不变。
  3. 做一些我还没有想到的事情?我首先要做的是 'good practice' 吗?

My problem is on my forked master: "This branch is 15 commits ahead of endless-sky:master." No files changed; it's merge commit messages.

让我们从这里开始:

将您的 fork master 重置为 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),并将其重新定位到您的 master 分支(现在也代表 endless-sky/master

git checkout my_feature_branch
git rebase master
git push --force

您的第一个选项,删除并重新创建 master,可能是最简单的。清理方法如下:

  1. 如果你还没有,切换到master:

    git checkout master
    
  2. 创建备份分支,以防万一:

    git branch backup
    
  3. 重置 master 以匹配 upstream。这实际上与删除和重新创建分支相同,您的选项 1,但只需要一个命令:

    git reset --hard upstream/master
    
  4. 强制推动:

    git push --force-with-lease origin master
    

    强制性警告:由于变基重写历史,这对于在此分支上工作的任何其他人来说可能是危险的/破坏性的。确保你清楚地向任何与你合作的人传达你所做的事情。由于这是个人分支,我认为这对您来说不是问题。

您的 master 分支现在是 upstream/master 的最新版本,因此在 GitHub 您应该看到:

This branch is even with endless-sky:master.

如果您以后发现遗漏了什么,可以翻阅backup的历史记录来找。

要修复任何类似损坏的功能分支,请执行:

git checkout myfeature
git rebase -i master

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

推送