强制"git push"覆盖远程文件

ope*_*sas 702 git git-push

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

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

Tre*_*ris 997

您应该能够使用强制对远程仓库进行本地修订

git push -f <remote> <branch>
Run Code Online (Sandbox Code Playgroud)

(例如git push -f origin master).娅<remote><branch>将力推已设定的所有地方分公司--set-upstream.

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

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

更新2:由于观众人数不断增加,我想添加一些额外的信息,告诉他们在您upstream遇到强制推动时该怎么做.

假设我已经克隆了您的仓库,并添加了一些提交,如下所示:

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

但后来development分支被a命中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
Run Code Online (Sandbox Code Playgroud)

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

  • 由于这是选定的答案,我将在此发表评论.在自己工作时使用武力不是问题.例如,我的云主机以它自己的git开头.如果我在本地工作并构建一个项目,并且我想将它放在我的云主机(OpenShift)上,我有两个单独的git项目.我的本地和我的OpenShift.我喜欢我的本地,但现在想在我的OpenShift上预览它.然后使用`-f`标志首次推送到OpenShift.基本上把你的本地git放到OpenShift上. (4认同)

小智 122

你想强迫推

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

如果您想要对以下每个命令进行更详细的说明,请参阅下面的详细信息部分.你基本上有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
Run Code Online (Sandbox Code Playgroud)

如果您想要更详细地解释每个命令,请参阅下面的长答案部分.

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

强行推送细节

指定远程和分支

您可以完全指定特定分支和远程.该-f标志是短版--force

git push <remote> <branch> --force
git push <remote> <branch> -f
Run Code Online (Sandbox Code Playgroud)

省略分支

当省略分支推送分支时,Git将根据您的配置设置找出它.在2.0之后的Git版本中,新的repo将具有默认设置来推送当前签出的分支:

git push <remote> --force
Run Code Online (Sandbox Code Playgroud)

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

省略遥控器和分支

当省略remote和branch时,just的行为git push --force由你的push.defaultGit配置设置决定:

git push --force
Run Code Online (Sandbox Code Playgroud)
  • 从Git 2.0开始,默认设置simple基本上只是将当前分支推送到其上游远程对应部分.遥控器由分支的branch.<remote>.remote设置决定,否则默认为原始仓库.

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

你可以阅读更多push.default的阅读设置git help configgit的-配置(1)手册的在线版本.

用力推动更安全 --force-with-lease

使用"租约"强制推送允许强制推送失败如果遥控器上有新的提交你没想到(技术上,如果你还没有将它们提取到你的远程跟踪分支中),这很有用你不想意外地覆盖别人甚至还不知道的提交,你只想覆盖自己的:

git push <remote> <branch> --force-with-lease
Run Code Online (Sandbox Code Playgroud)

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

  • 你是对的,但这实际上应该只在**特殊**情况下使用。 (2认同)

Von*_*onC 29

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

  • 将您的新提交放在专门的分支中
  • 重置你masterorigin/master
  • 竭诚为您的分支合并master,始终保持提交从专用分支(意为创造之上的新修订master,这将反映竭诚为您分支).
    有关策略模拟a的策略,请参阅" git命令将一个分支设置为另一个分支 " git merge --strategy=theirs.

这样,你可以将master推送到远程,而不必强迫任何东西.

  • @alexkovelsky任何强制推送都会重写历史记录,迫使repo的其他用户重置他们自己的本地仓库以匹配新推送的提交.此方法仅创建新提交,不需要强制推送. (5认同)

Jit*_*P N 23

对我有用:

git push --set-upstream <remote> <branch> -f
Run Code Online (Sandbox Code Playgroud)


小智 13

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

git push --force-with-lease
Run Code Online (Sandbox Code Playgroud)

所做--force-with-lease的就是拒绝更新分支,除非它是我们期望的状态;即没有人更新上游分支。在实践中,这是通过检查上游引用是否是我们所期望的来实现的,因为引用是哈希值,并且将父链隐式编码为其值。

您可以--force-with-lease确切地知道要检查什么,但默认情况下将检查当前的远程引用。这在实践中意味着,当 Alice 更新她的分支并将其推送到远程存储库时,分支的 ref 指向头将被更新。现在,除非 Bob 从远程进行拉取,否则他对远程的本地引用将过时。当他使用 进行推送时--force-with-lease,git 会根据新的遥控器检查本地引用并拒绝强制推送。--force-with-lease实际上,只有在没有其他人在此期间将更改推送到远程时,才允许您强制推送。这是--force系好安全带的情况下


Xia*_*com 5

// make sure your local branch is up to date
git checkout fix-build
git pull origin fix-build

// push your local branch to overwrite remote branch 'main'
git push -f origin fix-build:main
Run Code Online (Sandbox Code Playgroud)

附:接受的答案对我不起作用。不知道是不是Git版本的问题。