git pull --rebase 解释

Mat*_*t W 4 git rebase git-pull

起点:我已经创建了一个分支master并在本地进行了提交。在我的分支工作期间,其他提交已被公关到master......

然后我在本地要做的是git checkout mastergit pull然后检查我的分支机构并git rebase master

我的理解是 - 此时 - 我在分支上工作时所做的所有提交都将在这些master提交“之后”应用。

我的理解git pull --rebase是它的作用正如我上面所描述的那样。我的问题是(假设这是正确的)如何知道git pull --rebase正在基于哪个分支?

在上面的步骤中,我已经重新建立了HEADof 的基础master,而大多数git pull --rebase解释似乎都集中在对同一分支(而不是原始的master)的提交进行重新建立基础。

我的典型步骤明确:

git clone <path>
cd <dir>
git checkout -b feature/my-branch
<make changes>
git add .
git commit -m "some message"
git checkout master
git pull --all
git checkout feature/my-branch
git rebase master
**git push --set-upstream origin feature/my-branch**
Run Code Online (Sandbox Code Playgroud)

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

git clone <path>
cd <dir>
git checkout -b feature/my-branch
**git push --set-upstream origin feature/my-branch**
<make changes>
git add .
git commit -m "some message"
git pull -r
Run Code Online (Sandbox Code Playgroud)

Mar*_*ger 6

在当前的程序中,您离开masterorigin/master(因为您在分支机构工作)。然后,当您拉动时,生成的合并是快进的,然后您可以rebase分支master以保持线性历史记录(如果您喜欢这类事情)。

你可以做一个--rebase拉动,它的工作原理完全相同,因为你没有处于--rebase有意义的情况。当 pull 时master,更改拉取--rebase提交的操作,但不提交- 在您的场景中没有提交。masterorigin/master

--rebase你做的不是首先创建分支,但仍然以线性历史结束(如果你喜欢那样的事情)。让我们说而不是

A -- B -- C <--(master)(origin/master)
           \
            D -- E -- F <--(branch)
Run Code Online (Sandbox Code Playgroud)

相反,你有

A -- B -- C <--(origin/master)
           \
            D -- E -- F <--(master)
Run Code Online (Sandbox Code Playgroud)

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

A -- B -- C ---- X ---- Y <--(origin/master)
           \             \
            D -- E -- F -- M <--(master)
Run Code Online (Sandbox Code Playgroud)

但如果你使用的git pull --rebase话,拉取会将本地重新设置master为新获取的origin/master基础,所以你会得到

A -- B -- C -- X -- Y <--(origin/master)
                     \
                      D -- E -- F <--(master)
Run Code Online (Sandbox Code Playgroud)

D..F这与您在分支上执行并在pulling X..Yinto后自行重新设置基数所获得的线性历史相同master

  • @MattW:(1)不,我并没有说当你的分支跟踪其远程版本时,“-r”没有用处。事实上,我准确地展示了它的用途。(2)你所描述的(拉出上游以外的分支并重新建立基础)实际上是可能的,与你接受的答案相反;只是不清楚你问的是什么。为此,“git pull -r origin master” (2认同)