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

时间:2016-02-04 17:13:29

标签: git

Combining multiple commits before pushing in Git

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

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

谢谢

4 个答案:

答案 0 :(得分:2)

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

无论如何,如果origin/master指向与master相同的提交(即您的master分支是最新的),那么如果你重新加入一个分支并不重要或者另一个。如果他们指向不同的提交,那么您将重新定位到您选择的分支所指向的任何提交。

答案 1 :(得分:2)

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

git rev-parse master

git rev-parse origin/master

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

如何使用<upstream>参数

<upstream>的{​​{1}}参数有两个目的:

  • 它选择哪些提交被重新定位,
  • 在没有git rebase参数的情况下,它选择了樱桃选择序列的起点。

(请注意,此处的语法为<onto>,因此示例中的git rebase [options] [<upstream> [<branch>]]master会提供origin/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将其视为单行说明。)

什么是rebase

log --oneline命令通过复制提交工作,然后将分支名称设置为指向新的最尖端副本。

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

在开始挑选序列之前,git rev-listrebase提交时分离HEAD。也就是说,<onto>提交是副本的起点。

然后,对于每个提交ID,<onto>基本上都会运行rebase(如果您正在使用交互式版本,那么就没有&#34;基本上是#34}关于它,它实际上使用git cherry-pick,并根据您的指令编辑进行一些修改。这会将原始提交复制到新分支上的新提交。在复制每个提交时,新分支将增长以包含所有提交。

最后,一旦复制了所有提交,git cherry-pick就会更改原始当前分支名称,使其指向新分支上新的最常提交。

请注意,此过程中没有任何地方可以关注git rebase中是否出现origin这个词。它只是将<upstream>参数解析为其SHA-1,然后运行它。

答案 2 :(得分:1)

表示如果您有V2和V3(分别是版本2和版本3),您可以修改V2,并使用rebase它将更改放入新版本(V4)但与V3合并(这不是一个更新版本的问题)这里是你可以看到更多解释的链接。

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

答案 3 :(得分:0)

使用rebase命令时,一旦将其重新建立基础,您将希望以任何一种方式将其推入原始位置(远程主机,例如GitHub或Bitbucket),但是<branch>前面的原始位置表示您正在引用分支因为它是远程的,而不是您的本地计算机。