我有一个本地的(从未推送到远程)功能分支F1,它是从master创建的,其中包含一些提交。我似乎不明白这两个操作之间的区别(F1是当前分支):
git fetch origin
git rebase master
和
git pull --rebase origin master
我原本期望它们应该是相等的,但实际上它们并不相等 - 产生了不同的结果。
我的想法错在哪里?
我有一个本地的(从未推送到远程)功能分支F1,它是从master创建的,其中包含一些提交。我似乎不明白这两个操作之间的区别(F1是当前分支):
git fetch origin
git rebase master
和
git pull --rebase origin master
我原本期望它们应该是相等的,但实际上它们并不相等 - 产生了不同的结果。
我的想法错在哪里?
1. git fetch origin
并git rebase master
将会把从远程仓库的F1
到本地master
分支的更改应用上。假设你的提交历史一开始像下面这样(远程master
分支已经有了远程提交J
):
A---B---C---D---E master
\
F---G---H F1
当您执行git fetch origin
和git 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
分支上进行变基)。
git fetch origin
只需将远程仓库中的远程文件下载到本地分支。
git rebase master
将整个分支(即您的分支中的提交)取出并放在本地存储库的顶部。这会更改您项目的历史记录。
git pull --rebase origin master
git pull --rebase --autostash origin master
- odigity