我确定我做错了什么,但现在发生了什么。
我的团队有一个开发分支,我们从该分支机构创建功能分支。
我正在开发一项功能,每当我尝试从开发中提取--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,我会遇到很多冲突,包括一些我已经解决的问题(我确实已经解决了)。
我在这里乱搞什么?
答案 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
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
不会重写提交。它创造了新的,并假装一直这样。现在feature
和origin/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 develop
,develop
上没有新的提交,则不会发生任何事情。如果有新提交,您只需要处理这些提交。