Git 谜题 - 解决“拒绝非快进”问题
Posted
技术标签:
【中文标题】Git 谜题 - 解决“拒绝非快进”问题【英文标题】:Git puzzler - Working around `denying non-fast-forward` 【发布时间】:2014-03-28 09:38:22 【问题描述】:在我的本地 git 存储库中,我基本上有:
* commit A
|
* commit B (master) (origin/master)
我做了一些改变,现在是这样:
* commit A
|\
| * commit B (develop) (origin/master)
|
* commit C (master)
我希望更新 Git 存储库(托管在 beanstalkapp.com 上)以反映这一点,并且看起来像:
* commit A
|\
| * commit B (develop) (origin/develop)
|
* commit C (master) (origin/master)
我该怎么做? git push
以 denying non-fast-forward refs/head/master
失败。我有哪些解决方法?
我的 repo 不是很有条理,我想一劳永逸地重构它。
【问题讨论】:
【参考方案1】:你可以强制推送吗?
否则你可以删除一个分支吗?在这种情况下,您只需删除旧分支并推送新分支,这与强制推送基本相同。
【讨论】:
Beanstalk 不允许强制推送,也无法删除未合并的分支。我认为,我需要做的是将origin/master
合并到新的master
中,但要保持新的master
不变(即删除提交A 和B 之间的所有更改——一种假合并)。
似乎beantalk 真的想让你远离这样的任务。 (毕竟你真的想改变发布的历史......)如果你确定要这样做,你可能会删除整个存储库并使用新内容重新创建它。 - 或者,只需使用git revert
来“撤消”您的更改。这确实会留下一些多余的提交,但您至少可以在不更改历史记录的情况下创建正确的分支内容。【参考方案2】:
git checkout master
git merge origin/master strategy=ours
git push origin master
“我们的”策略忽略在提交 A
和 B
之间所做的所有更改,并进行“假”合并(仅名称合并)。 git push
然后愉快地在旧的origin/master
和新的master
之间进行快进提交。
结果:
* commit A
|\
| * commit B (develop)
| |
* | commit C
| /
* commit D, but identical to C (master) (origin/master)
【讨论】:
我们也可以将它应用到分支上吗?在结帐和合并之间,您似乎也做了更改? @pal4life 是的。 master 是一个普通的分支,就像任何其他分支一样。不确定你的第二个问题。以上是关于Git 谜题 - 解决“拒绝非快进”问题的主要内容,如果未能解决你的问题,请参考以下文章