如果我尝试重新建立已经推送到开发分支的提交,该怎么办

时间:2020-08-14 08:24:58

标签: git github rebasing

以下是用例

然后我从开发部门撤出 我进行了一些代码更改,然后按下

几天后,我又回到了git状态,这表明我比master分支提前1次提交,显然我已经好几天没有从master撤回了

现在,在进行更改之前,我决定使用rebase进行git pull,git pull --rebase原始主机

问题是:我在本地repo分支中提交的提交会在master之上,还是因为我已经推送了它,所以我只会到达全局master / remote分支的顶端?

我对重新定级的概念是陌生的,所以请帮忙解释一下。

2 个答案:

答案 0 :(得分:1)

让我们考虑以下问题。

          D---E---F origin/master
         /
A---B---C---X master
        ^
        origin/master in your repository

几天前,您的本地主服务器和原始服务器/主服务器都处于同步状态,并且分别具有提交ABC。在某个时候,您在本地主服务器中提交了X。同时,其他人将DEF的提交推送到源/主服务器。

在这一点上,如果您运行git pull --rebase origin master,将按原样从原始服务器/主机中提取所有提交,并且提交X将在F上方重放,并提供新的提交ID将生成X'

新的提交图将如下所示:

                     origin/master
                    /
A---B---C---D---E---F---X' master
                    ^
                    origin/master in your repository

所以,是的,旧的提交X将在本地主目录的顶部重新设置为提交X'

编辑:

在这个用例中的问题是,如果我先推X然后再做D,E,F,那现在我用rebase执行拉时,我的本地分支看起来又如何呢?

在这种情况下,在推送提交X之后,本地存储库和原始服务器/主服务器将保持同步。


             origin/master
            /
A---B---C---X master
            ^
            origin/master in your repository

几天后,其他人将提交DEF推送到原始主机。提交图将如下所示:

             D---E---F origin/master
            /
A---B---C---X master
            ^
            origin/master in your repository

现在,如果您运行git pull --rebase origin master,它将为git pull origin master命令提供相同的结果,因为没有任何可作为基础的内容。您在原始/母版之前没有任何提交。在此命令的结尾,您的图形将如下所示:

                          origin/master
                         /
A---B---C---X---D---E---F master
                        ^
                        origin/master in your repository

由于您的提交X已经在原始服务器/主服务器中,因此不会在DEF的顶部重放。

答案 1 :(得分:0)

问题是:我在本地repo分支中提交的提交会在master之上,还是因为我已经推送了它,所以我只会到达全局master / remote分支的顶端?

如果用“全局”表示“远程”,那么是的,您的本地分支将基于origin/master重新建立。请参阅下面的详细说明。


根据您的问题,您的存储库开始看起来像这样:

o---o--------------o
    ^              ^   
    master         development
    origin/master  origin/development
    

您的本地master分支与远程origin/master分支同步;另外,您有一个本地development分支,其中有1次提交,您将该分支推送到了远程存储库,从而创建了origin/development

现在,假设您当前的分支是development(如果您运行)

git pull --rebase origin master

Git将从origin远程获取任何新对象,并更新您的远程跟踪分支origin/master

                  origin/master
                  ⌄
          o---o---o
         /
    o---o--------------o
        ^              ^   
        master         development
                       origin/development

然后,它将在更新后的development分支之上重置您当前的分支(在这种情况下为origin/master):

                  origin/master  development
                  ⌄              ⌄
          o---o---o--------------o'
         /         
    o---o--------------o
        ^              ^   
        master         origin/development

请注意,您的本地master分支仍指向以前的提交,这是因为git pull的第二部分(合并或变基)始终在当前分支< / em>,对于您的情况是development

现在,如果在完成拉操作之后要推送本地development分支,则将更新origin/development远程跟踪分支以指向重新提交:

                                 origin/development
                  origin/master  development
                  ⌄              ⌄
          o---o---o--------------o'
         /         
    o---o
        ^                 
        master

同样,您的本地master会一直保持不变,直到您这样做:

git checkout master && git merge origin/master

git pull命令是一门复杂的野兽,因为它会根据调用时所处的分支以及传递给它的参数而做不同的事情。

文档the form with three arguments的内容如下:

将远程分支合并到当前分支中:

$ git pull origin next

这会在FETCH_HEAD中暂时保留next的副本,并更新远程跟踪分支origin/next

我还建议阅读this answer,以详细了解git pull在不同情况下的行为。