强制“git push”覆盖远程文件

我想推送我的本地文件,并将它们放在远程仓库中,而不必处理合并冲突。 我只想让我的本地版本优先于远程版本。

我怎样才能用Git做到这一点?


您应该能够通过使用强制您的本地修订到远程回购

git push -f <remote> <branch>

(比如git push -f origin master )。 离开<remote><branch>将强制推送所有设置了--set-upstream本地分支。

请注意,如果其他人共享此存储库,其修订历史记录将与新存储库发生冲突。 如果他们在改变之后有任何地方提交,他们将会失效。

更新 :以为我会添加一个旁注。 如果您正在创建其他人将要审查的更改,那么创建一个具有这些更改的分支并定期进行重新布局以使其与主要开发分支保持同步并不罕见。 让其他开发人员知道这将会定期发生,以便他们知道应该期待什么。

更新2 :由于观众人数不断增加,我想添加一些其他信息,说明当您的upstream确实遇到推动力时应该怎么做。

假设我已经克隆了您的回购并添加了如下几个提交:

            D----E  topic
           /
A----B----C         development

但是后来development分支碰到了rebase ,这会导致我在运行git pull时收到类似的错误:

Unpacking objects: 100% (3/3), done.
From <repo-location>
 * branch            development     -> FETCH_HEAD
Auto-merging <files>
CONFLICT (content): Merge conflict in <locations>
Automatic merge failed; fix conflicts and then commit the result.

在这里,我可以解决冲突和commit ,但这会让我留下一个非常难看的提交历史记录:

       C----D----E----F    topic
      /              /
A----B--------------C'  development

它可能看起来很诱人使用git pull --force但要小心,因为这会让你停滞不前:

            D----E   topic

A----B----C'         development

所以最好的选择是做一个git pull --rebase 。 这将需要我像以前一样解决任何冲突,但是对于每一步而不是提交,我将使用git rebase --continue 。 最后,提交历史看起来会好得多:

            D'---E'  topic
           /
A----B----C'         development

更新3:您也可以使用--force-with-lease选项作为“安全”推力,正如Cupcake在他的回答中所提到的:

如果在远程机器上有新的提交(你没有预料到(技术上,如果你还没有将它们提取到远程跟踪分支中),使用“租赁”进行强制推送可以使推送失败,这对于你不想意外覆盖别人的提交,你甚至还不知道,而你只是想覆盖自己的提交:

git push <remote> <branch> --force-with-lease

您可以通过阅读以下任何内容来了解​​有关如何使用--force-with-lease的更多详细信息:

  • git push文档
  • Git:如何忽略快进和恢复原点[分支]提前提交?

  • 你想强制推送

    你基本上想要做的是强制推送你的本地分支,以覆盖远程分支。

    如果您想要更详细地解释以下每条命令,请参阅下面的详细信息部分。 基本上有4个不同的选项可以用Git强制推送:

    git push <remote> <branch> -f
    git push origin master -f # Example
    
    git push <remote> -f
    git push origin -f # Example
    
    git push -f
    
    git push <remote> <branch> --force-with-lease
    

    如果你想要更详细地解释每条命令,请参阅下面我的长答案部分。

    警告:强制推送将使用您推送的分支的状态覆盖远程分支。 在使用它之前,确保这是你真正想做的事情,否则你可能会覆盖你实际想要保留的提交。

    推动细节

    指定远程和分支

    您可以完全指定特定分支和远程。 -f标志是--force的简短版本

    git push <remote> <branch> --force
    git push <remote> <branch> -f
    

    省略分支

    当分支推送分支被省略时,Git会根据您的配置设置来计算出来。 在2.0之后的Git版本中,新的回购将具有默认设置来推送当前签出的分支:

    git push <remote> --force
    

    而在2.0之前,新的回购将具有默认设置以推送多个本地分支。 有问题的设置是remote.<remote>.pushpush.default设置(见下文)。

    省略遥控器和分支

    当远程和分支都省略时,只是git push --force的行为是由你的push.default Git配置设置决定的:

    git push --force
    
  • 从Git 2.0开始,默认设置simple ,基本上只会将当前分支推送到其上游远程计数器部分。 遥控器由分支的branch.<remote>.remote决定branch.<remote>.remote设置,否则默认为原点回购。

  • 在Git版本2.0之前,默认设置( matching )基本上只是将所有本地分支推送到远程(默认为原始)具有相同名称的分支。

  • 您可以通过阅读git help config或在线版本的git-config(1)手册页阅读更多push.default设置。

    使用--force-with-lease强制推进更安全

    如果在远程机器上有新的提交(你没有预料到(技术上,如果你还没有将它们提取到远程跟踪分支中),使用“租赁”进行强制推送可以使推送失败,这对于你不想意外覆盖别人的提交,你甚至还不知道,而你只是想覆盖自己的提交:

    git push <remote> <branch> --force-with-lease
    

    您可以通过阅读以下任何内容来了解​​有关如何使用--force-with-lease的更多详细信息:

  • git push文档
  • Git:如何忽略快进和恢复原点[分支]提前提交?

  • 另一种选择(避免任何可能对其他贡献者造成问题的强制推送)是:

  • 把你的新提交放在一个专门的分支
  • 重置masterorigin/master
  • 将您的专用分支合并到master ,始终保留专用分支的提交(意味着在master上创建新的修订以反映您的专用分支)。
    请参阅“git命令使一个分支像另一个”模拟git merge --strategy=theirs
  • 这样,你可以将主人推到远程而不必强迫任何东西。

    链接地址: http://www.djcxy.com/p/49019.html

    上一篇: Force "git push" to overwrite remote files

    下一篇: What does git "updating currently checked out branch" warning mean?