git - 'git rebase' 和 'git pull' 如何协同工作?

标签 git

我知道“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'

请注意,本地分支上的前两个提交仍然按顺序是 DE。但现在您的工作位于分支的远程版本之上。这就是为什么该命令被称为“rebasing”,因为它在 pull 时为您的分支提供了一个新的基础。

通过 rebase 进行 pull 与通过 merge 进行普通的 git pull 是并列的。如果您将远程分支 merge 到本地分支,您最终会得到以下结果:

remote: ... A -- B -- C
             \         \
local:        D -- E -- M

现在,远程提交 BC 不会直接出现在本地分支的历史记录中。相反,您会留下 merge 提交(上图中的M)。换句话说,通过 merge pull 倾向于 merge 提交,而 rebase 倾向于保留历史记录。

关于git - 'git rebase' 和 'git pull' 如何协同工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48363938/

相关文章:

Git-归档旧提交

svn - 永无止境的 GIT 故事——我在这里做错了什么?

ruby-on-rails - 如何防止 Git 在接收后 Hook 输出的每一行上打印 'remote:'?

git - 我可以看到 git-gui 正在执行什么命令吗?

git 撤消所有未提交或未保存的更改

Git: checkout 如何影响存储库?

git - 所有 svn 修订号的映射 <=> git SHA-1 提交哈希

node.js - 为什么需要在 git repo 中删除 node_modules 文件夹?

windows - Git 状态显示文件两次但大小写不同

git post-receive hook 无法跳回原来的cwd