2

用例如下

我从开发分支中提取,然后进行一些代码更改,然后推送

几天后我回来做一个 git status,这表明我领先于 master 分支 1 次提交,显然我已经有几天没有从 master 中拉取了

现在,在我进行更改之前,我决定使用 rebase 进行 git pull , git pull --rebase origin master

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

我是变基概念的新手,所以请帮忙解释一下。

4

2 回答 2

1

让我们考虑以下内容。

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

几天前,您的本地 master 和 origin/master 都同步并且每个都有提交AB并且C. 在某个时候,您承诺X在当地的主人那里。同时其他人推送提交DE并推F送到源/主。

此时,如果您运行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将在本地主节点的顶部重新设置为 commit X'

编辑:

这个用例中的问题是,如果我推了 X,然后创建了 D、E、F,那么当我现在使用 rebase 执行拉取之后,我的本地分支会如何?

在这种情况下,在推送您的提交 X 后,您的本地存储库和源/主存储将同步。


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

几天后,提交DE并被F其他人推送到源/主。提交图将如下所示:

             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 之前没有任何提交。在此命令结束时,您的图表将如下所示:

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

由于您的提交X已经在 origin/master 中,因此不会在D,EF.

于 2020-08-14T09:35:32.140 回答
0

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

如果“全局”是指“远程”,那么是的,您的本地分支将基于origin/master. 请参阅下面的详细说明。


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

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

您的本地master分支与远程origin/master分支同步;此外,您有一个带有 1 个提交的本地development分支,您将其推送到远程存储库,从而创建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(合并或变基)的第二部分始终在当前分支上运行,在您的情况下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命令是一个复杂的野兽,因为它会根据您在调用它时所处的分支以及传递给它的参数来执行完全不同的事情。

以下是文档对带有三个参数的表单的说明:

接下来将远程分支合并到当前分支:

$ git pull origin next

这会暂时保留 next 的副本FETCH_HEAD,并更新 remote-tracking 分支origin/next

我还建议阅读此答案,以更详细地解释git pull在不同情况下的行为方式。

于 2020-08-14T10:52:23.433 回答