git rebase origin / develop vs git rebase develop

时间:2017-03-06 04:43:51

标签: git git-rebase

假设当前分支是MyFeatureX。本地develop分支是最新的来源。以下两个陈述是否相同? 推荐的语法是什么?

git rebase origin/develop 
git rebase develop 

请注意:此不是git rebase origin vs.git rebase origin/master

相同的问题

3 个答案:

答案 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实际上执行了两个步骤:fetchmerge。它在引擎盖下执行的第一步是从源获取所有最新的提交,您可以使用

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删除上游删除的提交。