我知道“git rebase”放弃了一些提交。因此,如果开发人员这样做,并将更改推送到远程存储库,那么是否意味着这些提交也将从远程存储库中删除。
当另一个开发人员执行“git pull”时,这些提交也会从他/她的本地存储库中删除吗?
最佳答案
Rebase 不会放弃某些提交,除非您执行交互式 rebase 并显式删除某些提交。相反,使用 rebase 策略执行 git pull 会起到相反的作用;它会保留本地分支中的所有提交,同时使用远程分支中的更改进行更新。
这里一张图片胜过一千个文字。下图显示了本地分支在通过 rebase 进行 git pull 之前和之后的样子。
remote: ... A -- B -- C
\
local: D -- E
最初,最近的祖先是 A
,从那时起,您的本地分支和远程分支各有 2 个提交分歧。如果您要运行 git status,Git 会告诉您您的分支落后 2 次提交,领先其远程对应分支 2 次提交。现在通过 rebase 进行 pull :
git pull --rebase origin your_branch
pull 后,图如下所示:
remote: ... A -- B -- C
\
local: D' -- E'
请注意,本地分支上的前两个提交仍然按顺序是 D
和 E
。但现在您的工作位于分支的远程版本之上。这就是为什么该命令被称为“rebasing”,因为它在 pull 时为您的分支提供了一个新的基础。
通过 rebase 进行 pull 与通过 merge 进行普通的 git pull 是并列的。如果您将远程分支 merge 到本地分支,您最终会得到以下结果:
remote: ... A -- B -- C
\ \
local: D -- E -- M
现在,远程提交 B
和 C
不会直接出现在本地分支的历史记录中。相反,您会留下 merge 提交(上图中的M
)。换句话说,通过 merge pull 倾向于 merge 提交,而 rebase 倾向于保留历史记录。
关于git - 'git rebase' 和 'git pull' 如何协同工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48363938/