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

时间:2017-01-02 21:11:02

标签: git github rebase git-rewrite-history

我试图为一个开源项目(无尽的天空)做一个好的Git工作流程,但是在我开始学习的时候我并没有找到一个干净的历史。我现在的工作流程是:

  1. upstream/masterhere
  2. 我的叉子是here。我开始使用GitHub Desktop,但我开始切换到命令行。
  3. 我的fork的主人应该镜像upstream/master。我开发的每个功能都有一个自己的分支,由我的主人创建,我使用自己的(本地)alpha和(推)beta分支将我的功能组合起来进行测试/播放。
  4. 我的问题出现在我的分叉主人身上:This branch is 15 commits ahead of endless-sky:master.没有文件发生变化;它合并提交消息。这对我来说似乎很难看,所以我做了一些阅读,特别是文章Stop using 'git pull': A better workflow,我已经改用了变基/快进。

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

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

    1. 删除/重新制作master - 是否安全,尤其是使用GitHub?
    2. 试图回到git rebase -i [which commit?]回到某一点 - 似乎无法奏效。尝试回到0facf00,有些提交 long 在我分叉之前,我的合并提交哈希值(例如在GitHub上看到的3be4d97)不会显示在文本中要丢弃的文件。最终结果没有改变。
    3. 做其他事情我还没有想过呢?我正在尝试做什么'良好做法'首先?

2 个答案:

答案 0 :(得分:2)

  

我的问题在于我的分叉大师:“这个分支是在无尽的天空之前提交的15个提交:大师。”没有文件改变;它是合并提交消息。

让我们从那里开始:

将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),并在主分支(现在也代表endless-sky/master)上对其进行重新定位

git checkout my_feature_branch
git rebase master
git push --force

答案 1 :(得分:1)

您的第一个选择,删除并重新创建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
    

    强制性警告:由于rebase会重写历史记录,因此对于在此分支上工作的其他人来说,这可能会造成危险/破坏。确保您清楚地告知您与您合作的任何人所做的事情。由于这是一个私人分支,我认为这不会成为你的问题。

  5. 您的master分支现在与upstream/master保持同步,因此在GitHub上您应该看到:

    This branch is even with endless-sky:master.
    

    如果您以后发现遗漏了任何内容,可以查看backup的历史记录以找到它。

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

    git checkout myfeature
    git rebase -i master
    

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