git rebase origin/develop vs git rebase develop

Pol*_*ase 16 git git-rebase

我们假设当前分支是MyFeatureX.当地develop分支机构与原产地保持同步.以下两个陈述是否相同?推荐的语法是什么?

git rebase origin/develop 
git rebase develop 
Run Code Online (Sandbox Code Playgroud)

请注意:这不是同一个问题的git的变基原产vs.git重订产地/主

And*_*Ray 20

您的本地分支develop 跟踪 origin/develop,它们可能并不总是具有相同的提交.

$ cat ~/.git/config

[remote "origin"]
    url = git@something.com/repo.git
    fetch = +refs/heads/*:refs/remotes/origin/*
Run Code Online (Sandbox Code Playgroud)

这意味着我们有一个"远程"(一个生活在其他地方的存储库)任意命名为"origin".

您的本地develop分支正在跟踪该远程存储库中的分支,并且对该数据进行了本地引用origin/develop.在大多数情况下,我们认为这两件事总是包含相同的提交.但是,您需要显式更新本地develop分支以从源获取最新数据.这通常通过拉动来完成:

$ git status
    on branch develop
$ git pull
    ...pulls latest changes from origin
Run Code Online (Sandbox Code Playgroud)

然而,git pull实际上做了两个步骤,a fetch和a merge.它在引擎盖下执行的第一步是从源中获取所有最新的提交,您可以使用它

git fetch origin
Run Code Online (Sandbox Code Playgroud)

这将更新分支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
Run Code Online (Sandbox Code Playgroud)

这意味着我可以将所有数据都拉下来,而不必过多考虑我所使用的分支,并从远程存储库中删除最新的代码.稍后,在develop分支上,一个简单的git pull将确保您是最新的.