将 Git 工作流程从合并切换到变基:如何清理合并提交历史记录?
Switching Git workflow from merge to rebase: how to clean up a merge commit history?
我正在努力建立一个良好的 Git 工作流程来为一个开源项目 (Endless Sky) 做贡献,但是在我开始学习的过程中,我并没有得到一个干净的历史。我现在的工作流程是:
upstream/master
是 here.
- 我的叉子是here。我开始使用 GitHub Desktop,但我开始切换到命令行。
- 我的 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。
我已经阅读了其他各种问题,但不太清楚我是否是最佳人选:
- deleting/remaking
master
— 这样安全吗,尤其是 GitHub?
- 尝试
git rebase -i [which commit?]
回到某个点 — 似乎没有用。尝试回到 0facf00
,一些提交 long 在我分叉之前,我的合并提交哈希(例如 3be4d97
在 GitHub 上看到)不t 出现在要删除的文本文件中。最终结果不变。
- 做一些我还没有想到的事情?我首先要做的是 '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
,可能是最简单的。清理方法如下:
如果你还没有,切换到master
:
git checkout master
创建备份分支,以防万一:
git branch backup
重置 master
以匹配 upstream
。这实际上与删除和重新创建分支相同,您的选项 1,但只需要一个命令:
git reset --hard upstream/master
强制推动:
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
.
推送
我正在努力建立一个良好的 Git 工作流程来为一个开源项目 (Endless Sky) 做贡献,但是在我开始学习的过程中,我并没有得到一个干净的历史。我现在的工作流程是:
upstream/master
是 here.- 我的叉子是here。我开始使用 GitHub Desktop,但我开始切换到命令行。
- 我的 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。
我已经阅读了其他各种问题,但不太清楚我是否是最佳人选:
- deleting/remaking
master
— 这样安全吗,尤其是 GitHub? - 尝试
git rebase -i [which commit?]
回到某个点 — 似乎没有用。尝试回到0facf00
,一些提交 long 在我分叉之前,我的合并提交哈希(例如3be4d97
在 GitHub 上看到)不t 出现在要删除的文本文件中。最终结果不变。 - 做一些我还没有想到的事情?我首先要做的是 '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
,可能是最简单的。清理方法如下:
如果你还没有,切换到
master
:git checkout master
创建备份分支,以防万一:
git branch backup
重置
master
以匹配upstream
。这实际上与删除和重新创建分支相同,您的选项 1,但只需要一个命令:git reset --hard upstream/master
强制推动:
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
.