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 pushdenying 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

“我们的”策略忽略在提交 AB 之间所做的所有更改,并进行“假”合并(仅名称合并)。 git push 然后愉快地在旧的origin/master 和新的master 之间进行快进提交。

结果:

* commit A
|\
| * commit B (develop)
| |
* | commit C
| /
* commit D, but identical to C (master) (origin/master)

【讨论】:

我们也可以将它应用到分支上吗?在结帐和合并之间,您似乎也做了更改? @pal4life 是的。 master 是一个普通的分支,就像任何其他分支一样。不确定你的第二个问题。

以上是关于Git 谜题 - 解决“拒绝非快进”问题的主要内容,如果未能解决你的问题,请参考以下文章

Git - 无法提交从eclipse到GitHub的更改

使用 clpfd Prolog 库解决斑马谜题(又名爱因斯坦谜题)

编程谜题:提升你解决问题的训练场

解决 n-queen 谜题

建议网站练习 C/C++ 算法/谜题 [关闭]

谜题4:初级问题