git pull --rebase 解释

git pull --rebase explanation

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

然后我会在本地做的是 git checkout mastergit pull,然后检查我的分支和 git rebase master

我的理解是 - 在这一点上 - 我在我的分支上工作时所做的所有提交都将被应用 "after" 那些 master 提交。

我对 git pull --rebase 的理解是它的作用与我上面描述的一样。我的问题是(假设这是正确的)git pull --rebase 怎么知道 我要重新定位哪个分支?

在上面的步骤中,我已经重新定位到 masterHEAD,而大多数 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**

问题:Can/Should我把上面的步骤改成:

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

可以设置一个分支来跟踪上游分支。

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。换句话说,创建的分支指向您已检出且未设置上游分支的提交。

在您当前的程序中,您将 master 留在 origin/master(因为您在分支机构工作)。然后,当您拉动时,生成的合并是 fast-forward,然后您可以 rebase 您的分支到 master 以保持线性历史(如果您喜欢那种事情)。

你可以做一个 --rebase pull,它的工作原理完全一样,因为你不在 --rebase 有意义的情况下。拉动 master 时,--rebase 会更改拉动对 master 中的提交所做的更改,但不会在 origin/master 中更改 - 在您的场景中是 none.

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

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

你反而有

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

因为您直接在 master 上完成了工作。现在如果你做了 "normal" pull 你会得到

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

但是如果你使用 git pull --rebase 那么 pull 会将本地 master rebase 到 newly-fetched origin/master 上,所以你得到

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

这与您通过在分支上执行 D..F 并在 pullX..Y 转换为 master 后自己重新设置基准得到的线性历史相同。