重新合并后的 Git push

30

我知道这个问题以前已经被问过了,但是我好像无法理解这件事情...

git checkout master
git pull
git checkout feature
git rebase origin/master

then resolve all the problems....
Try to push - not gonna happen...

在进行一次变基(处理n个冲突)之后,Git 确实告诉我有两个选择:

使用 --force,但这似乎很危险和愚蠢。

或者再次 pull 并再次处理合并冲突… 最终还是会面临同样的情况吗?

error: failed to push some refs to 'ssh://git@git.zzz.com/yyy/xxx.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就是这样呢...

我已经阅读了很多关于这个问题的帖子,唯一的解决方案似乎是使用--force

对我来说,这根本不算是解决方案,毕竟这是一个如此常用的工具...


你在尝试推送之前解决了所有冲突吗? - U. Windl
1
可能是Git合并功能分支后推送被拒绝的重复问题。 - kowsky
1
感谢您正确地提出问题!非常有用!:D - Sreekiran A R
1个回答

44

git push --force 原则上没有任何问题。

它所做的是用本地分支替换远程分支的 head。

有两种情况,一种情况下可以强制推送,另一种情况则根本不行:

如果你进行了 rebase 操作(因此为你的分支创建了一个新的提交链),你的分支和远程分支就会分叉,这是可以预料的结果。而且你是故意让它们分叉的。例如,你的分支与 master 不同步,因此你将其 rebase 到 master 之上(从技术上讲,提交是从新基础,即 master 重新创建的,但实际上看起来就像是移动了)。所以你知道它们已经分叉,并且你的本地版本是正确的。在这种情况下,告诉 git:“采用这个版本,放弃你持有的版本”是可行的。

然而,如果您与其他人在同一分支上工作,其中一人在您做出更改时推送了新变更的分支,则当您想要推送时,Git 还会告诉您本地分支及其上游分支已经分叉,因此您应该先拉取等。在这种情况下,很重要的一点是不要使用push --force,否则您的同事的工作将被覆盖,他/她可能会非常生气。所以在这种情况下,您确实需要先pull(我建议使用pull --rebase,以避免创建合并提交,并保持您的历史记录更清晰,但这是非常主观的),然后再push(在拉取后,不需要使用--force)。
总之,了解git push --force的含义,知道何时可以用本地分支覆盖上游分支(您可以使用push --force),以及何时不可以(您需要拉取)。
回到您最初的情况,您已经变基了自己的分支,所以它已经分叉(根据定义),如果您独自在分支上工作,或者如果您确保没有人在此期间推送任何内容,则git push --force是您需要的。

3
谢谢,我仍然认为这太复杂了。所以,既然我要强制替换当前的featureBranch,那么如果有其他人正在积极地使用featureBranch,并且有尚未推送到远程的更改,所有这些“尚未推送”的更改将会永久丢失,因为没有featureBranch了?我想做的就是让我的分支与主分支保持最新状态,天哪。 - Clomez
1
是的,回答你上一个问题。 - padawin
2
如果你和别人在一个分支上工作(这是一个有争议的事情,但这是一个工作流程问题),我建议你先确保你的分支与远程同步(也就是说,你拥有远程所有的东西),然后再进行变基以完成你需要的操作(重构它,将其放在主分支之上...),最后强制推送回去。并且要让你的同事知道。 - padawin
1
“所以,既然我要强制替换当前分支,那么如果其他人正在使用该分支并且有未推送的更改,所有这些“尚未推送”的更改将会丢失,因为没有分支了?不一定,他们可以使用合并或变基拉取,从而保留其更改。我只想让我的分支与主分支保持最新状态。” 这就是问题所在。为了避免刚才描述的情况,您必须永远不要编辑(修改、变基、过滤分支)已推送的提交或移动分支指针(重置)。考虑已推送的提交/分支是铭刻在石头上的。” - phd
2
我稍微不同意你的最后一条评论@phd,并且会说任何共享分支或基础/父分支(例如master)一旦推送就应该保持不变。当你感到足够自在时,个人特性分支并不重要,我鼓励尽快将它们推送到远程仓库,但仍然不要犹豫重新修改它们(只要它们是个人特性分支,一旦合并,它们应该被视为固定的)。 - padawin
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接