【问题标题】:git pull --rebase explanationgit pull --rebase 解释
【发布时间】:2018-08-02 07:02:53
【问题描述】:

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

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

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

我对@9​​87654328@ 的理解是它就像我上面描述的那样。我的问题是(假设是正确的)git pull --rebase 如何知道我基于哪个分支?

在上面的步骤中,我重新基于masterHEAD,而大多数git pull --rebase 的解释似乎侧重于基于对 same 分支的提交(不是原来的@ 987654333@).

我的典型步骤,明确地:

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**

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

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 -vv 以查看您在本地拥有的每个分支的跟踪上游分支
  • 请注意,git pull --all 只是将--all 传递给git fetch。这是一个无用的选项;不要使用它。

标签: git rebase git-pull


【解决方案1】:

在您当前的程序中,您将master 留在origin/master(因为您正在处理一个分支)。然后,当您拉动时,生成的合并是一个快进,然后您可以将您的分支 rebasemaster 以保持线性历史记录(如果您喜欢这种事情)。

您可以执行--rebase 拉动,它的工作原理完全相同,因为您不在--rebase 有意义的情况下。当拉动master 时,--rebase 会改变拉动对提交的作用master 但不是在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,那么 pull 会将本地 master 重新设置为新获取的 origin/master,因此您会得到

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

这与您通过在分支上执行 D..F 并在 pulling X..Y 之后将自己重新定位到 master 之后获得的线性历史相同。

【讨论】:

  • 你的意思是,如果我在一个跟踪它的远程版本的分支上工作,那么“git pull -r”就没有用了。我想了解是否可以使用“git pull -r”将我的分支重新定位到 master 的 HEAD,而不跟踪 master。答案似乎是否定的。您上面描述的内容似乎需要对 master 提交权限,而我没有,因此需要创建一个分支。
  • @MattW : (1) 不,我没有说当您的分支跟踪其远程版本时-r 没有用。事实上,我确切地展示了这种用途是什么。 (2)您所描述的(拉除上游以外的分支并重新建立基础)实际上是可能的,与您接受的答案相反;只是不清楚这就是你要问的。为此,git pull -r origin master
【解决方案2】:

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

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

【讨论】:

  • 谢谢。可能我不清楚“跟踪上游”。如果我执行“git branch -vv”,我会得到一个分支列表,这些分支都跟踪同名的远程分支。我的理解是,如果我将本地分支设置为跟踪我在创建分支时所在的分支,我会无意中将提交推送到该源分支。我已经更新了我的问题。
  • 其实就是“什么时候应该使用git pull --rebase?”这个问题的答案。似乎会回答这个问题:“当您的更改不需要单独的分支时。” stackoverflow.com/a/2472606/71376 我的。哦,好吧。
猜你喜欢
  • 1970-01-01
  • 2018-05-16
  • 2021-11-17
  • 1970-01-01
  • 2017-12-07
  • 2021-08-16
  • 2013-03-14
  • 2014-02-17
  • 2012-06-10
相关资源
最近更新 更多