假设当前分支是MyFeatureX。本地develop
分支是最新的来源。以下两个陈述是否相同?
推荐的语法是什么?
git rebase origin/develop
git rebase develop
相同的问题
答案 0 :(得分:17)
您的本地分支develop
跟踪 origin/develop
,但他们可能并不总是拥有相同的提交。
$ cat ~/.git/config
[remote "origin"]
url = git@something.com/repo.git
fetch = +refs/heads/*:refs/remotes/origin/*
这意味着我们有一个"遥控器" (生活在其他地方的知识库)任意命名"起源"。
您的本地develop
分支正在跟踪该远程存储库中的分支,并且对该数据的本地引用称为origin/develop
。在大多数情况下,我们认为这两件事总是包含相同的提交。但是,您需要显式更新本地develop
分支以从源获取最新数据。这通常通过拉动来完成:
$ git status
on branch develop
$ git pull
...pulls latest changes from origin
但是,git pull
实际上执行了两个步骤:fetch
和merge
。它在引擎盖下执行的第一步是从源获取所有最新的提交,您可以使用
git fetch origin
这会更新分支origin/develop
,但不会更新您当地的分支develop
。
最新的提交被隐藏在幕后"在您当地的.git目录中,您可以从名为" origin / develop"的分支中引用该目录。
获取后,要实际制作本地分支origin
,您必须执行git merge origin/develop
。这在技术上不是合并,它将是一个快速前进的"意思是git非常聪明,可以使你的本地origin
分支匹配origin/develop
而不实际合并任何东西。出于这个原因和其他人,合并让我在git中吓坏了。
因此,如果您退出develop
,那么它有可能会过时(较旧)而不是origin/develop
。
我个人在变基之前做了这个工作流程:
git fetch --all
git rebase origin/branchname
这意味着我可以将所有数据都删除,而不必过多考虑我所在的分支,并从远程存储库中删除最新的代码。稍后,在develop
分支上,一个简单的git pull
将确保您更新。
答案 1 :(得分:2)
如果develop
指向与origin/develop
相同的提交,则两个命令完全相同。我倾向于使用origin/develop
以防我忘记更新本地develop
(假设此分支最终将被推送到origin/develop
)。
答案 2 :(得分:1)
正如我在上一个问题Why is "rebase --onto ABC" different than "rebase ABC"?的其他(长篇)回答中写的那样,这两个命令都会关闭--fork-point
模式,因此提供develop
和{{1}解析为相同的提交哈希,就像它们在你的问题前提中所做的那样 - 两个命令将做同样的事情。
默认情况下,省略origin/develop
参数会打开<upstream>
,并且上游配置的分支的reflog可能包含大量数据。在这种情况下,他们的行为可能完全不同。通过添加显式--fork-point
,您可以阻止--no-fork-point
删除上游删除的提交。