Git本地rebase与git pull --rebase origin的区别

11

我有一个本地的(从未推送到远程)功能分支F1,它是从master创建的,其中包含一些提交。我似乎不明白这两个操作之间的区别(F1是当前分支):

git fetch origin
git rebase master

git pull --rebase origin master

我原本期望它们应该是相等的,但实际上它们并不相等 - 产生了不同的结果。

我的想法错在哪里?

2个回答

18

1. git fetch origingit rebase master将会把从远程仓库的F1到本地master分支的更改应用上。假设你的提交历史一开始像下面这样(远程master分支已经有了远程提交J):

A---B---C---D---E    master
         \
          F---G---H  F1

当您执行git fetch origingit rebase master时,即使origin/master指向J,它也只会将本地master分支(图表中的提交E)的F1分支重新设置为最新的。

A---B---C---D---E(master)---J origin/master
                 \
                  F---G---H    F1

2. 命令 git pull --rebase origin master 会首先从远程的 master 分支拉取变更,然后将当前分支 F1 变基到它的顶部:

A---B---C---D---E---J      master,origin/master 
                     \
                      F---G---H  F1

总之,如果本地的master分支与远程的master分支同步,那么这两种方式产生的结果是相同的(在master分支上对F1分支进行变基)。如果远程的master分支有新的提交(在本地master分支上不存在的提交),则结果会有所不同(一种方法是在本地master分支上进行变基,另一种方法是在origin/master分支上进行变基)。


1
很棒的解释。我也建议添加--autostash,以在此过程中自动存储和弹出本地更改。总之:git pull --rebase --autostash origin master - odigity

-2
git fetch origin

只需将远程仓库中的远程文件下载到本地分支。

git rebase master

将整个分支(即您的分支中的提交)取出并放在本地存储库的顶部。这会更改您项目的历史记录。

git pull --rebase origin master

默认情况下,git pull 执行合并操作,但您可以使用变基选项强制执行。
请查看此link

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接