git pull --rebase解释

时间:2018-02-22 12:18:27

标签: git rebase git-pull

起点:我已经从master和本地提交创建了一个分支。在我的分支工作期间,其他提交已经PR [{1}} ...

我在本地做的是mastergit checkout master,然后结帐我的分支和git pull

我的理解是 - 在这一点上 - 我在分支上工作时所做的所有提交都将在“{1}}提交之后”应用。

我对git rebase master的理解是它如上所述。我的问题是(假设这是正确的)master如何知道我正在重新定位哪个分支?

在上面的步骤中,我已经重新定位到git pull --rebase的{​​{1}},而大多数git pull --rebase解释似乎都集中在对相同的提交时的重新定位上分支(不是原始HEAD)。

我的典型步骤,明确:

master

问题:可以/应该将上述步骤更改为:

git pull --rebase

2 个答案:

答案 0 :(得分:1)

可以设置分支以跟踪上游分支。

git branch --set-upstream my_branch origin/master

如果在创建分支时执行此操作,则不需要这样做:

git checkout -b my_branch origin/master

设置上游分支后,您可以查看my_branch并执行git pull -r。对于上述两种情况,它将在origin/master上重新定位。

您可以将分支与其跟踪的上游分支一起列出:

git branch -vv

如果您希望feature/my-branch跟踪origin/feature/my-branch,我建议您按照典型步骤进行更改:

git checkout -b feature/my-branch

为:

git checkout -b feature/my-branch origin/feature/my-branch

请注意git checkout -b feature/my-branch等于git checkout -b feature/my-branch HEAD。换句话说,创建分支以指向您已签出的提交且没有上游分支集。

答案 1 :(得分:1)

在您当前的程序中,您将master留在origin/master(因为您正在分支机构工作)。然后,当您拉动时,生成的合并是快进的,然后您可以rebase将您的分支master保存到--rebase以保持线性历史(如果您涉及到这种情况)。

你可以进行--rebase拉动,它会完全相同,因为你不会处于master有意义的情况。在提取--rebase时,master会更改提取<{1}}中提交而不是origin/master 中提取的内容 - 并且在您的方案中没有。

--rebase让你做的不是首先创建分支,而是以线性历史结束(如果你是那种东西)。让我们说而不是

A -- B -- C <--(master)(origin/master)
           \
            D -- E -- F <--(branch)

你改为

A -- B -- C <--(origin/master)
           \
            D -- E -- F <--(master)

因为你直接在master上完成了你的工作。现在,如果你做了“正常”pull,你就会得到

A -- B -- C ---- X ---- Y <--(origin/master)
           \             \
            D -- E -- F -- M <--(master)

但是如果您使用git pull --rebase,那么拉动会将本地master重新定位到新提取的origin/master上,所以你得到了

A -- B -- C -- X -- Y <--(origin/master)
                     \
                      D -- E -- F <--(master)

这与您在分支上执行D..F时获得的线性历史记录相同,并且在pull X..Y master {{1}}之后自行重新定位。