为何在GitHub中使用rebase会将他人提交加入我的PR?
Rebase后PR混入他人提交并被标记为合著者的原因分析
我曾搜索过类似问题,但现有答案仅提供移除PR中多余提交的方法,未明确问题发生的核心原因。以下是复现该问题的命令步骤:
>>> (main) git log --oneline --graph -5 * fa9a315 * e52240c * 25c40fb * 9ceb4b0 * ed40e2c >>> (main) git checkout ed40e2c >>> (@ed40e2c) git switch -c test-rebase >>> (test-rebase) echo "foo" >> ./test.txt >>> (test-rebase) git commit -am "test message" >>> (test-rebase) git push -u origin test-rebase >>> (test-rebase) git branch -vv | grep test-rebase * test-rebase 6c0f33e [origin/test-rebase] test message >>> (test-rebase) // 在GitHub创建PR >>> (test-rebase) git rebase main >>> (test-rebase ⇣1⇡5) git pull -r >>> (test-rebase ⇡4) git push >>> (test-rebase) // 此时PR中出现他人提交,且我被标记为这些提交的合著者 >>> (test-rebase) git log --oneline --graph test-rebase origin/test-rebase main origin/main * 8bd227f (HEAD -> test-rebase, origin/test-rebase) message-4 * 938935c message-3 * 4080d9d message-2 * 8dbd5cd message-1 * 6c0f33e test message | * fa9a315 (origin/main, origin/HEAD, main) message-4 | * e52240c message-3 | * 25c40fb message-2 | * 9ceb4b0 message-1 |/ * ed40e2c
问题核心原因
Rebase的提交复制特性
Git Rebase的本质是将指定分支的提交,以目标分支的最新提交为基准重新复制。你第一次执行git rebase main时,Git已经把你的test message提交,复制到本地main分支的四个提交之后,此时本地test-rebase的提交链是:main的四个提交→test message复制版。git pull -r触发的二次Rebase冲突
你紧接着执行的git pull -r(即带Rebase的拉取),会拉取远程origin/test-rebase分支的内容——而远程分支此时还是你最初推送的状态:ed40e2c→原始test message。Git会尝试将本地已Rebase的分支,以远程分支为基准再次执行Rebase操作。
此时Git会判定,本地main分支的四个提交在远程test-rebase分支中没有对应记录(因为远程分支基于更早的ed40e2c),于是将这四个提交重新复制一遍,追加到原始test message之后,形成了新的提交链:ed40e2c → 原始test message → 复制的四个main分支提交。
- GitHub的提交识别逻辑
复制后的提交与main分支的原始提交内容完全一致,但因为Rebase修改了提交的父节点信息,导致提交Hash完全不同。GitHub无法识别这些是重复提交,会将其视为你的新提交显示在PR中;同时,由于是你执行了Rebase复制操作,这些复制提交的提交者会被标记为你,进而显示为合著者。
内容的提问来源于stack exchange,提问作者Animeta
相关产品推荐
相关产品推荐

