>在推送 Git 之前组合多个提交
根据我的理解,如果我使用 git rebase -i master
,那么稍后我仍然需要git push origin master
上传更改。
问题>rebase -i master
和rebase -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>]]
,因此示例中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
将它们视为单行说明。
变基有什么作用
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>
前面的原点意味着您指的是远程分支,而不是您本地拥有的机器。