Git 分支从主分支

Git branch diverged from master

我有 feature 个分支,然后是 branch 分支。

上周我在 feature 分支上工作,然后在功能分支上我昨天做了这个

git rebase master.

其他人今天也在 master 分支中提交了 osme 东西。

所以今天我做了这个

master# git pull
master# git rebase feature

现在我明白了

$ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 18 and 11 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)
nothing to commit, working directory clean

我该怎么办。我可以git push -f

不,如果您按 -f,您将抹掉其他开发人员提交给掌握的更改。

你有两个选择:

1) 与主人合并。

git merge master

2) 变基到 master

git rebase <sha1> onto --master

<sha1> 将是您从中分支出来的 master 上的原始提交。

这些选项彼此之间有很大的不同,您需要充分了解它们的作用。你需要做哪一个完全取决于你未来的意图。如果您准确解释了您要实现的目标,则可以提出一些进一步的建议。

尝试创建一些图表来准确解释您所做的事情会非常有用,所以让我们试一试。假设您从远程主服务器创建功能分支时,它只有 3 次提交。这意味着两个本地分支机构将开始如下所示:

A <- B <- C <strong>大师</strong>
A <- B <- C <strong>特征</strong>

我们还假设在上周,您对本地功能分支进行了一些提交,并且您团队中的其他开发人员也对远程主机进行了提交。通过 master# git pull 拉取主分支后,您的两个本地分支将如下所示:

A <- B <- C <- 1 <- 2 <- 3 <strong>大师</strong>
A <- B <- C <- D <- E <strong>特征</strong>

在这里,提交 1、2 和 3 来自其他开发人员,而提交 D 和 E 来自您。

接下来,如果您通过 master# git rebase feature 对该功能进行了 master 的本地变基,这两个分支将如下所示:

A <- B <- C <- D <- E <- 1' <- 2' <- 3' <strong>master</strong>
A <- B <- C <- D <- E <strong>特征</strong>

master 提交 1、2 和 3 现在变成了 1'、2' 和 3',因为它们实际上是在您的 master 分支上重播该功能后做出的不同提交。

最后,让我们将本地主分支与远程主分支进行比较:

A <- B <- C <- D <- E <- 1' <- 2' <- 3' <strong>本地主机</strong>
A <- B <- C <- 1 <- 2 <- 3 <strong>远程主机</strong>

当你执行那个 git status 调用时,Git 告诉你你的本地主机已经从远程分支。这意味着本地和远程主机共享一个共同的祖先提交,但每个人都有不同的提交。这也意味着您不能快进远程主机。此时你唯一的选择是通过 git push -fgit merge 强制推送。正如 Oliver Charleworth 指出的那样,将本地分支强制到远程通常不是一个好主意,因为它可以覆盖其他开发人员使用 master 所做的所有更改。您剩下的选择是将您的本地主控与远程合并。

继续前进的更简单(和更清晰)的方法是在功能分支中完成所有工作,然后在需要时将其合并到 master 中。通常,您应该只在 master 上重新设置一个功能(或将一个功能合并到),而不是相反。