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

时间:2012-05-09 05:45:39

标签: git git-push

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

我怎么能用Git做到这一点?

6 个答案:

答案 0 :(得分:901)

您应该可以使用

强制对远程仓库进行本地修订
git push -f <remote> <branch>

(例如git push -f origin master)。退出<remote><branch>将强制推送已设置--set-upstream的所有本地分支。

请注意,如果其他人共享此存储库,则其修订历史记录将与新版本冲突。如果他们在变更点之后有任何本地提交,他们将无效。

更新:我想我会添加旁注。如果您要创建其他人将要审核的更改,那么创建具有这些更改的分支并定期进行rebase以使其与主开发分支保持同步并不罕见。只是让其他开发者知道这会定期发生,这样他们就会知道会发生什么。

更新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选项作为“更安全”的力量 推,as mentioned by Cupcake in his answer

  

强制推动“租约”允许强制推动失败   是远程的新提交,你没想到(技术上,如果   你还没有把它们带到你的远程跟踪分支中)   如果你不想意外覆盖别人的话,那就很有用了   承诺,你甚至还不知道,你只是想   覆盖你自己:

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

您可以详细了解如何使用--force-with-lease   阅读以下任何内容:

     

答案 1 :(得分:111)

您想强行推送

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

如果您想要了解以下每个命令的更详细说明,请参阅下面的详细信息部分。你基本上有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版本中,新的repo将具有默认设置来推送当前签出的分支:

git push <remote> --force

在2.0之前,新的repos将具有推送多个本地分支的默认设置。相关设置包括remote.<remote>.pushpush.default设置(见下文)。

省略遥控器和分支

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

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

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

    < / LI>

您可以阅读push.defaultan online version of the git-config(1) Manual Page来阅读更多git help config设置。

使用--force-with-lease

强制推动更安全

强制推送“租约”允许强制推送失败如果遥控器上有新的提交你没想到(技术上,如果你还没有将它们提取到你的远程跟踪分支中),如果您不想意外覆盖其他人甚至还不知道的提交,并且您只想覆盖自己的提交,则非常有用:

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

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

答案 2 :(得分:28)

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

  • 将您的新提交放入专门的分支
  • 重置master
  • 上的origin/master
  • 将您的专用分支合并到master,始终保持专用分支的提交(意味着在master之上创建新修订,这将修改您的专用分支。)
    有关模拟git merge --strategy=theirs
  • 的策略,请参阅“git command for making one branch like another

这样,您可以将主人推送到远程,而不必强迫任何东西。

答案 3 :(得分:3)

git push -f有点破坏性,因为它会重置团队中任何其他人所做的任何远程更改。更安全的选择是{git push --force-with-lease}。

{--force-with-lease}做的是拒绝更新分支,除非它是我们期望的状态;即没有人更新上游分支。在实践中,这通过检查上游引用是我们期望的来工作,因为引用是哈希,并且隐式地将父代链编码为它们的值。 您可以准确地告诉{--force-with-lease}要检查的内容,但默认情况下会检查当前的远程引用。这在实践中意味着当Alice更新她的分支并将其推送到远程存储库时,分支的ref指向头将被更新。现在,除非Bob从遥控器拉出,否则他对遥控器的本地引用将会过时。当他使用{--force-with-lease}进行推送时,git将检查本地引用新远程并拒绝强制推送。 {--force-with-lease}有效地仅允许您强制推送,如果没有其他人在过渡期间将更改推送到远程。安全带上的{--force}。

答案 4 :(得分:2)

为我工作git push --set-upstream原始主站-f

答案 5 :(得分:0)

使用tortoisegit的简单步骤

GIT提交本地文件并推送到git存储库中。

步骤:

1)隐藏更改               藏匿名

2)

3)隐藏流行

4)提交            1个或多个文件,并提供提交更改描述集作者和日期

5)