Git: 丢弃远程分支上的所有更改并推送本地更改而不强制推送

Git: Discard all changes on remote branch and push local changes without force push

案例类似于:Git: Discard all changes on a diverged local branch.

差异:

给定的提交图:

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

我该怎么做?

(by 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 "strategy argument" 不起作用(因为你给出的原因)。

我认为将它们都称为 ours,然后将其中一个称为 "strategy",将另一个称为 "strategy argument" 充其量是糟糕的计划,因为它令人困惑,至少可以说. (它的出现是因为 -X 值是传递给由 -s 参数选择的驱动程序的参数——但这种解释只会让它变得更糟:"The -s argument is the strategy and the -X arguments are the arguments to the strategy from the first argument." "What, so they're argument arguments!? ... Wait, what are we arguing about again?")

尽管如此,-s ours 策略确实完全符合您的要求:它假装合并,甚至没有查看其他分支。因此,如果您在上游为 origin/foo 的分支 foo 上,并且您将绘制的图形作为起始位置,则:

git merge -s ours origin/foo

(也许还有明确的 -m 消息,或者您可以在运行时使用编辑器来解释合并)将为您提供最终绘制的图形。

您可以简单地删除远程分支,然后推送您的本地分支。我认为它不受限制。