Combining multiple commits before pushing in Git
根据我的理解,如果我使用git rebase -i master
,那么稍后我仍然需要git push origin master
上传更改。
问题> rebase -i master
与rebase -i origin/master
之间有什么区别?
谢谢
答案 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
将其视为单行说明。)
log --oneline
命令通过复制提交工作,然后将分支名称设置为指向新的最尖端副本。
如果您使用交互式版本,它会将提交ID和说明放入您可以编辑的文件中。否则,它只是按顺序遍历上述rebase
命令中的所有提交ID。
在开始挑选序列之前,git rev-list
在rebase
提交时分离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合并(这不是一个更新版本的问题)这里是你可以看到更多解释的链接。
答案 3 :(得分:0)
使用rebase命令时,一旦将其重新建立基础,您将希望以任何一种方式将其推入原始位置(远程主机,例如GitHub或Bitbucket),但是<branch>
前面的原始位置表示您正在引用分支因为它是远程的,而不是您的本地计算机。