“git rebase -i master”与“git rebase -i origin/master”之间的区别



>在推送 Git 之前组合多个提交

根据我的理解,如果我使用 git rebase -i master ,那么稍后我仍然需要git push origin master上传更改。

问题>rebase -i masterrebase -i origin/master有什么区别?

谢谢

请注意,如果您在分支 X 上并且您执行git rebase -i master,它会更改分支 X,而不是主分支,因此您必须推送分支 X。

无论如何,如果origin/master指向与master相同的提交(即您的master分支是最新的(,那么是否变基到其中一个并不重要。如果它们指向不同的提交,那么您将重新定位于您选择的分支指向的任何提交。

在我们继续之前,请运行:

git rev-parse master

和:

git rev-parse origin/master

你会看到两个SHA-1。 如果这两个 SHA-1 值相同,则两个变基命令将执行相同的操作。 如果没有,他们会做不同的事情

如何使用<upstream>参数

git rebase<upstream>参数有两个目的:

  • 它选择哪些提交被重定基址,并且
  • 在没有<onto>参数的情况下,它会选择樱桃采摘序列的起点。

(请记住,此处的语法git rebase [options] [<upstream> [<branch>]],因此示例中masterorigin/master提供了一个<upstream>。 您必须使用 --onto 选项来提供<onto> ,而您没有这样做,因此<upstream>会提供它。

要查看选择了哪些提交,您可以使用 git rev-list(或其更详细的等效项,git log (。 选择变基的实际提交是包含在当前分支中但不包含在<upstream>中的提交。 那是:

git rev-list master..HEAD

或:

git rev-list origin/master..HEAD

分别。 (将rev-list替换为log以详细查看它们,或log --oneline将它们视为单行说明。

变基有什么作用

rebase 命令的工作原理是复制提交,然后将分支名称设置为指向新的、最尖端的副本。

如果使用交互式版本,它会将提交 ID 和说明放入您可以编辑的文件中。 否则,它只是按顺序遍历上述git rev-list命令中的所有提交 ID。

在开始樱桃采摘序列之前,rebase在提交<onto>分离HEAD。 也就是说,<onto>提交是副本的起点。

然后,对于每个提交 ID,rebase基本上运行git cherry-pick(如果您使用的是交互式版本,则没有"本质上"关于它的内容,它实际上使用 git cherry-pick ,根据您的指令编辑进行一些修改(。 这会将原始提交复制到新分支提示处的新提交。 复制每个提交时,新分支会增长以包含所有提交。

最后,一旦复制了所有提交,git rebase更改原始当前分支名称,使其指向新分支上新的最尖端提交。

请注意,在此过程中,git 并不关心单词 origin 是否出现在<upstream>中。 它只是将<upstream>参数解析为其 SHA-1,然后使用它运行。

意味着如果您有 V2 和 V3(分别为版本 2 和版本 3(,您可以修改 V2,并使用 rebase 它将更改放入新版本 (V4( 但与 V3 合并(没关系它是它的较新版本(这里是您可以看到更多解释的链接。

https://git-scm.com/docs/git-rebase

当您使用 rebase 命令时,您将希望在重定基址后以任何一种方式推送到源(远程主机,即 GitHub 或 Bitbucket(,但<branch>前面的原点意味着您指的是远程分支,而不是您本地拥有的机器。

最新更新