Git:放弃远程分支上的所有更改并在不强制推送的情况下推送本地更改

标签 git git-merge git-remote

案例类似于: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/

相关文章:

github - 如何自动合并github上的拉取请求?

git - 如何连接未连接的 git 历史记录?

Git:三路 merge 后,提交在 git 日志中显示的顺序是什么?

git - 'git remote show'详解

git - 使用 git-svn 创建一个新的 svn 分支

git - 远程 : Repository not found

git - 获取自分离父分支以来的提交日志,包括父分支的最新提交

git - 在 Git 中,如何创建最旧提交之前的提交?

git - 为什么不应该将 ssh 和智能 http 访问与 git 混合使用?

git - 设置Git来管理远程网站