Git pull --rebase生成冲突循环

时间:2018-05-04 04:04:16

标签: git

我确定我做错了什么,但现在发生了什么。

我的团队有一个开发分支,我们从该分支机构创建功能分支。

我正在开发一项功能,每当我尝试从开发中提取--rebase时,我遇到了很多冲突。

我解决所有冲突并尝试推动功能。一条消息说我的分支的尖端是功能的背后,我应该从中拉出来。

  hint: Updates were rejected because the tip of your current branch is behind
    hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
    hint: before pushing again.

我从中拉出来(没有重新定位),我遇到了更多的冲突,我解决了。

现在我可以推送功能了。

此时它已全部同步且正常工作。但是,如果我从事一些本地工作并尝试从开发中拉动--rebase,我会遇到很多冲突,包括一些我已经解决的问题(我确实已经解决了)。

我在这里乱搞什么?

2 个答案:

答案 0 :(得分:6)

当您在另一个分支上重新分支分支时,通常重写该分支的历史记录。因此,正常推送将失败,因为Git会认为您的分支已经偏离了遥控器上的分支。而不是这样做:

git push origin feature

你应该这样做:

git push --force origin feature

强制推送可能会产生不良副作用,但是如果你是唯一一个在这个功能分支上工作的人,那就没关系了。

就图表而言,为了更好地了解这里发生的事情,请考虑以下事项:

develop: ... A -- B
              \
feature:        C

由于您从feature分支develop,因此您添加了新的C提交。此外,其他人(也许您也是)已向B添加了develop次提交。现在,您在feature上重新develop

develop: ... A -- B
                   \
feature              C'

将新feature与您重新定位之前的C'进行比较。您的新B提交现在位于新基础A提交之上,当您进行推送时,Git会拒绝它。 Git会看到常见的class CommentList extends React.Component { render() { const CommentNodes = this.props.data.map((comment)=>{ return ( <Comment author={comment.author} key={comment.id}>{comment.txt} </Comment> ); }); return ( <div className='commentList'> <h2>Comments:</h2> {CommentNodes} </div> ); } } 提交祖先,但它不知道如何应用新提交,而不是没有合并,这会破坏重组的点。

答案 1 :(得分:1)

我会尝试拼凑命令。

  • git checkout feature
  • git pull --rebase origin develop
  • 修复冲突,完成rebase
  • git push

此时你会得到类似的东西。

To github.com:org/repo.git
 ! [rejected]        feature -> feature (non-fast-forward)
error: failed to push some refs to 'git@github.com:org/repo.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

提示错误 git pull这是错误的。 相反,您应该git push --force 用自己的内容覆盖上游feature。这是因为您已经重写了feature分支,并且与上游分支

以下是更详细的内容。一开始事情看起来像这样。请注意,上游origin/feature和您的本地feature处于同一提交状态。

                      [origin/develop]
A - B - C - D - E - F [develop]
            \
             G - H - I [feature]
                       [origin/feature]

git pull --rebase origin develop之后并解决了所有冲突后,您的存储库看起来像这样。

                    [origin/develop]
                    [develop]
A - B - C - D - E - F - G1 - H1 - I1 [feature]
            \
             G - H - I [origin/feature]

rebase不会重写提交。它创造了新的,并假装一直这样。现在featureorigin/feature 分歧意味着一个人不是另一个人的祖先。

当您尝试git push时,您的feature Git拒绝了。将origin/feature移动到一些提交中并不是一件简单的事情,称为“快进”。需要合并,git push出于安全原因不会这样做。您的工作似乎与其他人的分歧push风险会影响其他人在同一分支机构的工作。

这就是git push --force是必要的原因。它告诉Git无论如何都要这样做,把origin/feature放在提交I1。在git push --force之后你会有这个。

                    [origin/develop]
                    [develop]
A - B - C - D - E - F - G1 - H1 - I1 [feature]
            \                        [origin/feature]
             G - H - I

现在一切都很好。您的feature工作就好像它始终位于develop之上。

如果再次git pull --rebase origin developdevelop上没有新的提交,则不会发生任何事情。如果有新提交,您只需要处理这些提交。