You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何在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

问题核心原因

  1. Rebase的提交复制特性
    Git Rebase的本质是将指定分支的提交,以目标分支的最新提交为基准重新复制。你第一次执行git rebase main时,Git已经把你的test message提交,复制到本地main分支的四个提交之后,此时本地test-rebase的提交链是:main的四个提交 → test message复制版。

  2. 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分支提交。

  1. GitHub的提交识别逻辑
    复制后的提交与main分支的原始提交内容完全一致,但因为Rebase修改了提交的父节点信息,导致提交Hash完全不同。GitHub无法识别这些是重复提交,会将其视为你的新提交显示在PR中;同时,由于是你执行了Rebase复制操作,这些复制提交的提交者会被标记为你,进而显示为合著者。

内容的提问来源于stack exchange,提问作者Animeta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 05:30:49