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

我想推送我的本地文件,并让他们在远程回购,而不必处理合并冲突。 我只想让我的本地版本优先于远程版本。

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

你应该可以使用强制你的本地修订到远程的repo

 git push -f <remote> <branch> 

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

只是要警告,如果其他人共享这个存储库,他们的修订历史将与新的版本冲突。 如果在改变之后他们有任何地方的承诺,他们将会失效。

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

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

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

             D ---- E主题
            /
 A ---- B ---- C发展

但后来development分支被打了一个rebase ,这将导致我收到一个错误,所以当我运行git pull

开箱对象:100%(3/3),完成。
从<repo-location>
  *分支开发 - > FETCH_HEAD
自动合并<文件>
 CONFLICT(内容):合并<位置>中的冲突
自动合并失败; 修复冲突,然后提交结果。

在这里,我可以解决冲突和commit ,但这会给我一个非常丑陋的提交历史记录:

        C ---- D ---- E ---- F话题
       / /
 A ---- B -------------- C'发展

它可能看起来诱人的使用git pull --force但要小心,因为这会留下你搁浅的提交:

             D ---- E主题

 A ---- B ---- C“的发展

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

             D'--- E'的话题
            /
 A ---- B ---- C“的发展

更新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 

省略分支

当分支push分支被省略时,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设置,否则默认为原点回购。

  • 在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:如何忽略快进和恢复原点[分支]提前提交?

另一个选择是:

  • 把你的新提交放在一个专门的分支
  • origin/master上重置您的origin/master
  • 将您的专用分支合并到master ,始终保留专用分支的提交(意味着在master上创建新的修订版本,以反映您的专用分支)。
    请参阅“ 让一个分支像另一个git命令 ”来模拟git merge --strategy=theirs

这样,你可以推动大师远程,而不必强迫任何东西。

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

{–force-with-lease}做的是拒绝更新一个分支,除非它是我们期望的状态; 即没有人更新上游分支。 在实践中,这通过检查上游ref是否是我们所期望的,因为refs是哈希值,并且隐式地将父项链编码为它们的值。 您可以告诉{–force-with-lease}到底要检查什么,但默认情况下会检查当前的远程参考。 这实际上意味着,当Alice更新她的分支并将其推送到远程存储库时,分支的参考指针头将被更新。 现在,除非鲍勃从遥控器拉出来,否则他对遥控器的本地引用将会过时。 当他使用{–force-with-lease}来推送时,git将会检查本地ref,并拒绝强制推送。 {–force-with-lease}有效地只允许你强制推送,如果没有其他人在这个过渡期间把变化推送到远程。 这是安全带上{–force}。