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 -f
或 git merge
强制推送。正如 Oliver Charleworth 指出的那样,将本地分支强制到远程通常不是一个好主意,因为它可以覆盖其他开发人员使用 master 所做的所有更改。您剩下的选择是将您的本地主控与远程合并。
继续前进的更简单(和更清晰)的方法是在功能分支中完成所有工作,然后在需要时将其合并到 master 中。通常,您应该只在 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 -f
或 git merge
强制推送。正如 Oliver Charleworth 指出的那样,将本地分支强制到远程通常不是一个好主意,因为它可以覆盖其他开发人员使用 master 所做的所有更改。您剩下的选择是将您的本地主控与远程合并。
继续前进的更简单(和更清晰)的方法是在功能分支中完成所有工作,然后在需要时将其合并到 master 中。通常,您应该只在 master 上重新设置一个功能(或将一个功能合并到),而不是相反。