假设当前的分支是MyFeatureX,本地的develop
分支与远程仓库同步。下面两条语句是否等价?
建议使用哪种语法?
git rebase origin/develop
git rebase develop
请注意:这个问题与git rebase origin vs.git rebase origin/master不是同一个问题。
假设当前的分支是MyFeatureX,本地的develop
分支与远程仓库同步。下面两条语句是否等价?
建议使用哪种语法?
git rebase origin/develop
git rebase develop
请注意:这个问题与git rebase origin vs.git rebase origin/master不是同一个问题。
你的本地分支 develop
追踪 origin/develop
,它们可能不总是包含相同的提交记录。
$ cat ~/.git/config
[remote "origin"]
url = git@something.com/repo.git
fetch = +refs/heads/*:refs/remotes/origin/*
这意味着我们有一个任意命名为“origin”的“远程”代码库(即存储在其他地方的代码库)。develop
分支正在跟踪该远程代码库中的分支,并且有一个称为origin/develop
的本地引用指向该数据。在大多数情况下,我们认为这两件事始终包含相同的提交记录。然而,您需要明确地更新本地的develop
分支以获取来自origin
的最新数据。这通常通过拉取操作完成:$ 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”的分支引用它。
在一次fetch之后,要想使本地分支origin
实际更新,需要执行git merge origin/develop
。技术上来说,这不是一次合并,而是一个“快进”,意味着git足够智能,可以使本地的origin
分支与origin/develop
相匹配,而不必合并任何内容。出于这个原因和其他原因,在git中进行合并时让我感到很紧张。
因此,如果你基于develop
进行rebase,有可能比origin/develop
还要过期(旧)。
在进行rebase之前,我个人会按照以下工作流程操作:
git fetch --all
git rebase origin/branchname
这意味着我可以在不考虑自己处于哪个分支的情况下,将所有数据下载,并基于远程仓库中最新的代码进行变基。稍后,在develop
分支上执行一个简单的git pull
就可以确保你的代码是最新的。
git rebase origin/develop
等价于 git rebase develop
。只要我注意保持它们同步即可。我会遵循你们的建议,使用 origin/develop
引用。也许这是显而易见的,所以 git rebase 没有提到如何处理“baseBranch”的细节。但对于一个 rebase 新手来说,这相当令人困惑。 - Polymerasedevelop
指向与origin/develop
相同的提交,则这两个命令完全相同。如果我忘记更新本地的develop
(假设此分支最终将被推送到origin/develop
),我倾向于使用origin/develop
。正如我在回答你之前的另一个问题为什么"rebase --onto ABC"和"rebase ABC"不同?中所写的那样,这两个命令都关闭了--fork-point
模式,因此——只要develop
和origin/develop
解析到相同的提交哈希值,就像你的问题前提中一样——这两个命令将执行相同的操作。
省略<upstream>
参数会默认打开--fork-point
,并且分支配置的上游的引用日志可能包含大量数据。在这种情况下,它们可能会有很大的区别。通过添加显式的--no-fork-point
,您可以防止git merge-base --fork-point
删除已删除的上游提交。
rebase --onto
问题的回答。请给我一些时间来理解那个--fork-point
的东西。 - Polymerase