我有一个功能分支和一个主分支。

Master 分支已经发展,我的意思是让这些更新尽可能少地与 master 分支分开。

所以我在两个分支中都是 git pullgit checkout feature/branch ,最后是 git rebase master

现在在这里,我要么希望一切顺利,要么在继续 rebase 之前需要解决冲突,直到所有主提交都成功地重新应用到功能分支上为止。

现在在我的情况下真正发生的是我不明白的事情:

$>git rebase master
First, rewinding head to replay your work on top of it...
Applying: myFirstCommitDoneOnTheBranch
Applying: myOtherCommitDoneOnTheBranch
$>git status
On branch feature/branch
Your branch and 'origin/feature/feature' have diverged,
and have 27 and 2 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)
nothing to commit, working tree clean
$>git pull
*load of conflicts*

现在,据我所知, pull 后他有很多冲突;我不明白需要 pull 。从逻辑上讲,它应该在分支时回滚到 master,保存在分支上所做的提交,转发到 master 上的最新提交,然后应用保存的提交。

我不明白 Applying 消息指的是什么:什么是在哪个版本上应用提交?

最佳答案

TL;博士你应该上的master上衍合feature之前更新git pullgit pull --rebasefeaturemaster 没有必要做一个 git pull 之后的分支 0x25181921134142 上的 0x25181921134142 之后的分支 0x25181921134142 上有你的 20134134134134134134134134414re243134414re2134142后

根据您当前的工作流程,feature 告诉您的原因是:



是因为你的重建基础master分公司目前拥有 25 新提交不是来自git status可达(因为它们从底垫来到feature)加 2 提交是从origin/feature到达,但有不同的提交的ID。这些提交包含相同的更改(即它们是补丁等效的),但它们具有不同的 SHA-1 哈希值,因为它们基于 master 中的不同提交,而不是您在本地存储库中重新基于它们的提交。

这是一个例子。让我们假设这是您在 origin/feature 上执行 origin/feature 之前的历史记录:

A - B - C (master)
         \
          D - E (feature)

git pull 之后, master 得到提交 git pull :
A - B - C - F (master, origin/master)
         \
          D - E (feature)

在这一点上,您将 master 重新设置在 F 之上,这适用于 featuremaster :
A - B - C - F (master, origin/master)
             \
              D - E (feature)

同时,远程分支 D 仍然基于提交 E :
A - B - C - F (master, origin/master)
         \   \
          \   D' - E' (feature)
           \
             D - E (origin/feature)

如果您在origin/featureC,Git会告诉你,你git status Twig 已从feature分歧分别 3 (featureorigin/featureF)和 2 (D'E')提交。



解决方案是在 0x2518122231343141 和 D 上执行 E,然后再将 git pull 重新设置为 0x251812223131331313131313133131313131313131313131313131313131331313131331313133131313313131331313131331313131之前。但是,由于您可能在 master 上提交了尚未推送到 feature 的提交,因此您需要执行以下操作:
git checkout feature && git pull --rebase

避免在 feature 和本地 master 之间创建 merge 提交。

更新重新定位的后果:

根据 this comment ,我扩展了发散的分支。之所以feature报道称,重订后originorigin/feature发散是由于重定基带来新提交到feature,再加上它改写了以前推到git status在提交的事实。

考虑 pull 之后但 rebase 之前的情况:
A - B - C - F (master)
         \
          D - E (feature, origin/feature)

此时,featureorigin/feature 指向同一个提交 feature——换句话说,它们处于“同步”状态。在 origin/feature 基础上重新设置 feature 之后,历史将如下所示:
A - B - C - F (master)
         \   \
          \   D' - E' (feature)
           \
             D - E (origin/feature)

如您所见, origin/featureE 已经发生分歧,它们的共同祖先是 commit feature 。这是因为现在master包含新提交featureorigin/featureCfeature(读作“d黄金”和“E黄金”),这是提交F和应用上的master顶部D'。即使它们包含相同的更改,Git 也会认为它们不同,因为它们具有不同的提交 ID。同时, E' 仍然引用 DE

在这一点上,您已经改写了历史:您通过重新设置现有提交修改了它们,有效地创建了"new"提交。

现在,如果您要在 F 上运行 origin/feature,将会发生以下情况:
A - B - C - F (master)
         \   \
          \   D' - E'- M (feature)
           \         /
             D - E - (origin/feature)

由于 D 执行 E + git pull ,这将导致创建 merge 提交 feature ,其父项是 0x2235143141 和 0x2235143143

相反,如果您运行 git pull(即 git fetch + git merge ),那么 Git 将:
  • M 移动到提交 E'(E 和 0x2518122313439 的共同祖先)23134914314314
  • 应用 git pull --rebasegit fetch 来自 git rebase
  • 应用 featureCfeature

  • 然而,注意到 origin/featureD 包含与 Eorigin/feature 相同的变化,Git 会像这样丢弃它们,导致历史看起来像这样:
    A - B - C - F (master)
             \
              D - E - F' (feature)
                  ^
                 (origin/feature)
    

    注意提交 F 之前是如何从 D' 到达的,它是如何应用到 E' 之上的,结果是 D' 。此时,E' 会告诉你:



    该提交当然是 D

    关于git pull *after* git rebase?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42861353/

    10-14 16:18