案例类似于:Git: Discard all changes on a diverged local branch .
区别:
- 我想放弃已经推送到远程的更改 存储库,
git push origin foo:foo --force
被拒绝(来源 不允许强制 push )。
给定的提交图:
A--B--C--O1--O2--O3 (foo)
\
L1--L2--L3 (origin/foo)
如果可能我想实现这个:
A--B--C--O1--O2--O3 (foo origin/foo)
如果以上不可能,那么以下对我来说就可以了:
A--B--C--O1--O2--O3--M1 (foo)
\ /
L1--L2--L3 (origin/foo)
但我希望 git diff M1..03
为空,即丢弃 origin/foo
中引入的所有更改。 -s ours
策略无济于事,因为这仅适用于冲突,非冲突更改仍将添加到 M1
。
我该怎么做?
SOLUTION (作者 Mohan Kumar P)
删除远程分支并推送。如果被跟踪,git
应该自动创建远程分支(检查 git branch -vv
)。
要实现这一点:
A--B--C--O1--O2--O3 (foo origin/foo)
\
L1--L2--L3
类型:
git push origin --delete foo
git checkout foo # Git ≥ 1.6.6.
git push origin foo
最佳答案
-s ours
策略确实有效。 -X ours
“策略参数”不起作用(出于您给出的原因)。
我认为将这两者称为我们的
,然后进一步将其中一个称为“战略”,将另一个称为“战略论点”充其量是糟糕的计划,至少可以说是令人困惑。 (它的出现是因为 -X
值是传递给由 -s
参数选择的驱动程序的参数——但这种解释只会让它变得更糟:“-s
参数是策略,-X
参数是从第一个参数到策略的参数。” “什么,所以它们是参数参数!? ...等等,我们又在争论什么?”)
尽管如此,-s ours
策略确实完全符合您的要求:它假装 merge ,甚至没有查看其他分支。因此,如果您在上游为 origin/foo
的分支 foo
上,并且您将绘制的图形作为起始位置,则:
git merge -s ours origin/foo
(也许还带有明确的 -m
消息,或者您可以在编辑器运行时使用它来解释 merge )将为您提供您绘制的最终图形。
关于Git:放弃远程分支上的所有更改并在不强制推送的情况下推送本地更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39785043/