rebase之后不能推到分支

我们使用git并拥有一个主分支和开发者分支。 我需要添加一个新function,然后重新提交到主,然后将主服务器推到CI服务器。

问题是,如果我在rebase期间发生冲突,在rebase完成后,我无法推送到我的远程开发者分支(在Github上),直到我拉到远程分支。 这会导致重复的提交。 没有冲突时,按预期工作。

问题:rebase和冲突解决之后,如何在不创build重复提交的情况下同步本地和远程开发者分支

build立:

// master branch is the main branch git checkout master git checkout -b myNewFeature // I will work on this at work and at home git push origin myNewFeature // work work work on myNewFeature // master branch has been updated and will conflict with myNewFeature git pull --rebase origin master // we have conflicts // solve conflict git rebase --continue //repeat until rebase is complete git push origin myNewFeature //ERROR error: failed to push some refs to 'git@github.com:ariklevy/dropLocker.git' hint: Updates were rejected because the tip of your current branch is behind hint: its remote counterpart. Merge the remote changes (eg 'git pull') hint: before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details. // do what git says and pull git pull origin myNewFeature git push origin myNewFeature // Now I have duplicate commits on the remote branch myNewFeature 

编辑

所以这听起来像会打破工作stream程:

在newNewFeature工作的myNewFeature developer2上的developer1都使用master作为主分支

developer2将myNewFeature合并到他的NewFeature中

开发人员1重设,解决冲突,然后强制推送到远程分支myNewFeature

几天后,developer2再次将myNewFeature合并到他的NewFeature中

这会导致其他开发者讨厌developer1吗?

首先,你和你一起工作的人需要同意一个主题/开发分支是共享开发,还是仅仅是你自己的。 其他开发人员不知道在我的开发分支上合并,因为他们随时都会重新组装。 通常的工作stream程如下:

 o-----o-----o-----o-----o-----o master \ o-----o-----o devel0 \ o-----o-----o devel1 

然后为了保持最新与远程我会做到以下几点:

  git fetch origin git checkout master git merge --ff origin/master 

我这样做有两个原因。 首先,因为它允许我查看是否有远程更改,无需从我的devel分支切换。 其次,这是一个安全机制,以确保我不会覆盖任何未经修改或已执行的更改。 另外,如果我不能快速合并到主分支,这意味着有人已经重新启动了远程主控(为此他们需要严重鞭打),或者我不小心承诺要掌握并需要清理我的结局。

然后,当遥控器发生变化,我已经快速转发到最新的我会rebase:

 git checkout devel0 git rebase master git push -f origin devel0 

其他开发人员则知道他们需要将我的最新的开发分支重新绑定:

 git fetch <remote> git checkout devel1 git rebase <remote>/devel0 

这导致更清洁的历史logging:

 o-----o master \ o-----o-----o devel0 \ o-----o-----o devel1 

不要合并来回提交你的心血来潮。 它不仅创build重复的提交,并使历史不可能遵循,从特定的变化find回归几乎是不可能的(这就是为什么你使用版本控制,对吗?)。 你遇到的问题是这样做的结果。

也听起来像其他开发人员可能会提交给你的开发分支。 你能证实吗?

合并的唯一时间是当你的主题分支准备好被接受进master

在旁边注意。 如果多个开发人员正在对同一个存储库进行操作,那么您应该都考虑使用命名分支来区分开发者开发分支。 例如:

 git branch 'my-name/devel-branch' 

所以所有的开发人员主题分支都驻留在自己的嵌套集合中。

你需要强制推动,因为你已经把提交进一步下行git期望你添加提交到分支的提示。 git push -f origin myNewFeature将解决你的问题。

提示:以上是强制推送的合法用法。 永远不要在公共可访问的资源库上重写历史logging,否则很多人会恨你。

这里要记住的最重要的事情就是在后台进行pull和rebase的操作。

拉将基本上做两件事:取和合并。 当你包括–rebase它会做一个rebase而不是合并。

rebase几乎就像存储分支后隐藏的所有本地更改,将分支快速转发到目标上的最新提交,并按顺序排列更改。

(这就解释了为什么在进行重新分配时可能会得到多个冲突解决scheme提示,而不是在合并时可能得到的冲突解决scheme。为了保留提交,您有机会解决正在重新分配的每个提交的冲突。 )

您不希望将重新发布的更改推送到远程分支,因为这是重写历史logging。 粗俗,从来没有强大,因为几乎总是有例外。 例如,您需要维护本地存储库的远程版本以在特定环境中工作。

这将需要你有时使用强制推送重新发布的更改:

 git push -f origin newfeature 

或者在某些情况下,您的pipe理员可能已经删除了强制的function,因此您必须删除并重新创build:

 git push origin :newfeature git push origin newfeature 

在任何一种情况下,如果其他人在您的远程分支上与您协作,则必须确保您知道自己在做什么。 这可能意味着你在开始合并之前一起工作,并且在掌握并移除你的工作分支之前将它们合并成更易于pipe理的提交格式。

请记住,你几乎总是可以通过利用以下优点来回退git的GC:

 git reflog 

这是一个巨大的生命保护,因为如果你在所有的重设/冲突pipe理中迷路,你可以重新回到更稳定的状态。

您需要执行强制推送,即git push -f origin myNewFeature

噢,你最好确定人们不要在你的开发分支上做任何事情 – 通常你不应该在你重写历史的时候发布分支(或者更确切地说,不要在发布后重写历史)。 一种方法是使用像wip/myNewFeature这样的分支名称,然后提到wip分支将不时重新设置为master。

已经给出的一般答案 – 使用git push -f origin myNewFeature当推动重新发布的变化 – 是一个很好的起点。 我正在写这个答案来解决是否会打破你的工作stream程的编辑。

如果我们假设你将要使用git pull --rebase ... (或者是其中的一些变体),然后强制推送到远程分支,那么在你的例子中,打破工作stream的东西是developer2将myNewFeature合并到他的hisNewFeature 。 只要没有其他人在分支上工作,就可以重新绑定自己的function分支,所以您需要规则来划分分支领域。

你可以通过以下方式来解决这个问题:a)build立一个规则,你只能和master合并,或者b)创build一个集体develop分支,在这个分支上build立自己的myNewFeature分支,并build立一个你只能从develop合并的规则。 那么master将仅保留里程碑或发布(或者其他你想要设置的),并且develop将会在你准备将其集成到其他function分支的时候推送每个function。

我相信这可以被认为是Gitflow工作stream程的简化版本。