git 变基 origin/develop 对比 git 变基开发

git rebase origin/develop vs git rebase develop

假设当前分支是 MyFeatureX。并且本地 develop 分支是最新的。下面的两个陈述是等价的吗? 推荐的语法是什么?

git rebase origin/develop 
git rebase develop 

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

相同的问题

如果 develop 指向与 origin/develop 相同的提交,那么这两个命令完全相同。我倾向于使用 origin/develop 以防我忘记更新我的本地 develop(假设这个分支最终将被推送到 origin/develop)。

正如我在对您之前的问题 的另一个(长)回答中所写,这两个命令都关闭了 --fork-point 模式,因此,前提是 developorigin/develop 解析为相同的提交哈希,就像它们在您的问题前提中所做的那样——这两个命令将做同样的事情。

省略 <upstream> 参数会默认打开 --fork-point,并且分支配置的上游的 reflog 中可能有很多数据。在这种情况下,他们的行为可能完全不同。通过添加显式 --no-fork-point,您可以防止 git merge-base --fork-point 丢弃上游删除的提交。

你的本地分支 develop tracks origin/develop 并且它们可能并不总是有相同的提交。

$ cat ~/.git/config

[remote "origin"]
    url = git@something.com/repo.git
    fetch = +refs/heads/*:refs/remotes/origin/*

这意味着我们有一个 "remote"(位于其他地方的存储库)任意命名为 "origin"。

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

$ git status
    on branch develop
$ git pull
    ...pulls latest changes from origin

然而,git pull 实际上做了两个步骤,一个 fetch 和一个 merge。它在幕后所做的第一步是从 origin 获取所有最新的提交,您可以使用

git fetch origin

这将更新分支 origin/develop,但不会更新您的本地分支 develop

最新提交隐藏在您的本地 .git 目录中 "behind the scenes",您可以从名为 "origin/develop".

的分支中引用该目录

获取后,要实际创建本地分支 origin,您必须执行 git merge origin/develop。这在技术上不是合并,它将是一个 "fast forward," 意味着 git 足够聪明,可以使您的本地 origin 分支匹配 origin/develop 而无需实际合并任何东西。出于这个原因和其他原因,git.

中的合并让我大吃一惊

因此,如果您从 develop 变基,它有可能比 origin/develop.

过时(更旧)

我个人在变基之前执行此工作流程:

git fetch --all
git rebase origin/branchname

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