【问题标题】:Git: Discard all changes on remote branch and push local changes without force pushGit:丢弃远程分支上的所有更改并推送本地更改而无需强制推送
【发布时间】:2017-02-08 15:35:27
【问题描述】:

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

区别:

  • 我想丢弃已推送到远程的更改 存储库,
  • git push origin foo:foo --force 被拒绝(原 不允许强制推送)。

给定提交图:

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

我该怎么做?

SOLUTIONMohan 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

【问题讨论】:

    标签: git git-merge git-remote


    【解决方案1】:

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

    【讨论】:

    • 我会检查一下,如果可行,我会接受您的解决方案。否则我会用更多细节更新问题。
    • 从谷歌来到这里,下面的答案是完美的:git merge -s ours upstream/production
    【解决方案2】:

    -s ours 策略确实有效。这是-X ours“战略论点”不起作用(因为你给出的原因)。

    我认为将这两个都称为ours,然后将一个称为“策略”,另一个称为“策略论证”,充其量是糟糕的规划,因为它至少可以说是令人困惑的。 (它的出现是因为 -X 值是传递给由 -s 参数选择的驱动程序的参数 - 但这种解释只会让它变得更糟:“-s 参数是策略,-X 参数是第一个参数的策略参数。” “什么,所以它们是参数参数!?...等等,我们又在争论什么?”)

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

    git merge -s ours origin/foo
    

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

    【讨论】:

      猜你喜欢
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      • 2020-04-21
      • 1970-01-01
      • 2013-08-31
      • 1970-01-01
      • 2011-06-09
      相关资源
      最近更新 更多