如何清理Pull Request提交仅展示自有更改,并本地预览PR效果?
嘿,这两个问题都是Git协作中很常见的坑,我来给你一步步讲清楚怎么解决:
1. 清理Pull Request,只展示自己的更改
要清理掉那些无关的合并提交,核心是把你自己的提交从混乱的历史里抽出来,重新放到最新的master分支上,具体步骤如下:
第一步:找到分支创建时的master起点
你需要找到当初从master切出my_branch时,master的那个提交哈希。最省心的命令是:git merge-base --fork-point master my_branch这个命令会自动识别分支创建时的master快照,输出的一串字符就是我们要的
<initial-master-sha>。如果这个命令没返回结果,也可以用git reflog查看历史操作记录,找到你创建分支的那次操作对应的master提交。第二步:用交互式变基清理历史
- 先确保本地master是最新的:
git checkout master && git pull - 切回你的分支:
git checkout my_branch - 启动交互式变基,基于刚才找到的初始master提交:
git rebase -i <initial-master-sha> - 这时会弹出一个文本编辑器,里面列着从初始master到现在
my_branch的所有提交。你只需要保留你自己写的提交,把那些合并master的提交(比如开头是merge的行)删掉,或者把它们前面的pick改成drop。 - 保存退出后,Git会开始重新应用你的提交,过程中可能会遇到冲突,解决完冲突后执行:
重复这个过程直到变基完成。git add . && git rebase --continue
- 先确保本地master是最新的:
第三步:强制推送更新远程分支
因为变基改写了分支历史,所以需要用强制推送更新远程的my_branch:git push --force-with-lease my_branch这里用
--force-with-lease比直接--force更安全,它会检查远程分支有没有别人的新提交,避免误覆盖。如果你觉得交互式变基太麻烦,也可以直接创建一个新分支,把自己的提交cherry-pick过去:
git checkout master && git pull git checkout -b clean_my_branch git cherry-pick <你的第一个提交SHA> <第二个提交SHA> ... git push origin clean_my_branch:my_branch --force-with-lease
2. 本地查看评审者看到的Pull Request效果
没错!评审者看到的PR内容,本质上就是你创建my_branch时的master状态和当前my_branch最新代码的差异。你可以用下面的方法本地验证:
直接用diff命令查看:
git diff <initial-master-sha> my_branch这个命令输出的内容,就是PR里展示的所有更改。
如果你想更直观地看,也可以用Git GUI工具(比如SourceTree、GitKraken),把初始master提交和
my_branch分支做对比,它们会可视化展示文件的增删改。另外,如果你想完全复刻远程PR的效果,也可以拉取远程的PR分支(以GitHub为例):
git fetch origin pull/<你的PR编号>/head:temp_pr_branch git diff master temp_pr_branch不过只要你本地的
my_branch是最新的,这个结果和对比初始master的结果是一致的。
内容的提问来源于stack exchange,提问作者user362953

