首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“`git rebase master`”和“`git rebase - is”之间有什么区别?

“`git rebase master`”和“`git rebase - is”之间有什么区别?
EN

Stack Overflow用户
提问于 2021-08-03 04:57:02
回答 1查看 914关注 0票数 0

就像标题说的,git rebase mastergit rebase --onto master有什么区别?

我运行了两个命令,希望看到完全相同的结果,但之后得到了两个截然不同的提交历史。

这有什么大不了的?他们之间有什么不同?

EN

回答 1

Stack Overflow用户

发布于 2021-08-03 12:45:36

不要接受这个答案。这只是对托瑞克的回答的一种评论。

在我看来,看待这个问题的方法是理解git rebase的全部形式是使用onto和三个参数:

代码语言:javascript
复制
git rebase --onto x y z

要阅读这一点,在您的脑海中将yz聚在一起,并将--onto x交换到末尾(因为这是直接宾语和介词短语的自然英语顺序),这样整件事就可以解析出这样的东西(伪代码):

代码语言:javascript
复制
rebase [y z] onto x

在这个伪代码中,表达式[y z]的意思是“从y开始,一直到z。”Git计算“在y之后开始”的意思是从z向后工作,而不是从y向后工作,但是效果一般是一样的。

所以git rebase --onto x y z的意思是:“抓取所有的提交,从y开始,一直持续到z,并将它们附加到x中。”

很好。这是git rebase的完整形式。当您省略任何参数时,Git将为您填充它们。这样做是令人惊讶的。这就是你看到的结果的原因。

让我们以一个真实的例子为例。以下是我们的出发点:

代码语言:javascript
复制
* f8696e6 (HEAD -> dev) z
* 103333e (origin/dev) y
* 559ad1f x
| * 8032a5d (origin/main, main) c
| * 2caa1e9 b
|/  
* 06c7439 a

仔细看图。我们在dev上。我们有一个远程origin,我们领先于我们的远程跟踪分支origin/dev.devmaina分手了,在那之后

代码语言:javascript
复制
x y z 

与此同时,main走了

代码语言:javascript
复制
a b c

现在让我们试试看

代码语言:javascript
复制
git rebase main

我们在dev上,所以这意味着

代码语言:javascript
复制
git rebase main main dev

这意味着“从main之后抓取提交并继续到dev --即x y z --并将它们附加到main。”开始吧..。我们得到的是:

代码语言:javascript
复制
* f6b903e (HEAD -> dev) z
* 4adb109 y
* e9cc7fd x
* 8032a5d (origin/main, main) c
* 2caa1e9 b
* 06c7439 a

是的,就像我说的。我认为,这是大多数人在使用单参数git rebase时所期望的。

好了,现在重新开始。这一次我们要说

代码语言:javascript
复制
git rebase --onto main

就像托瑞克的回答告诉你的,这意味着

代码语言:javascript
复制
git rebase --onto main origin/dev dev

所以这意味着“抓住从origin/devdev的所有东西--那就是z --并把它附加到main上。这是非常令人惊讶的!我们从来没有说过关于origin/dev的任何事情,但当我们重新建立基地时,Git将在那里切断我们的分支。下面是我们得到的:

代码语言:javascript
复制
* 0dccc25 (HEAD -> dev) z
* 8032a5d (origin/main, main) c
* 2caa1e9 b
| * 103333e (origin/dev) y
| * 559ad1f x
|/  
* 06c7439 a

这可能就是你身上发生的事情(行动)。很容易看出你为什么觉得这很令人惊讶!

因此,在我看来,主要的结论是,如果你忽略了这三个参数中的任何一个,你可能会对Git为它们选择什么感到惊讶。因此,在我看来,你也不应该遗漏其中任何一个!你只是不知道如果你这样做会发生什么。

最后注:好吧,我撒了点小谎。还记得第一个结果吗?

代码语言:javascript
复制
* f6b903e (HEAD -> dev) z
* 4adb109 y
* e9cc7fd x
* 8032a5d (origin/main, main) c
* 2caa1e9 b
* 06c7439 a

我忽略了那个图表中的origin/dev。实际上,这就是我们现在所拥有的:

代码语言:javascript
复制
* f6b903e (HEAD -> dev) z
* 4adb109 y
* e9cc7fd x
* 8032a5d (origin/main, main) c
* 2caa1e9 b
| * 103333e (origin/dev) y
| * 559ad1f x
|/  
* 06c7439 a

注意xy提交的复制。这就是git rebase所做的:它复制提交。如果我们打算推动dev,这是一种棘手的情况,因为我们将要求远程origin忘记origin/dev当前所指的yx,而且它不会对此感到高兴。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68630552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档