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

myzjeezk  于 2022-12-21  发布在  Git
关注(0)|答案(6)|浏览(377)

我想推送我的本地文件,并将它们放到远程repo上,而不必处理合并冲突。我只想让我的本地版本优先于远程版本。
我怎样才能用Git做到这一点?

iszxjhcz

iszxjhcz1#

您应该能够通过使用以下命令将本地修订强制到远程存储库

git push -f <remote> <branch>

(e.g.关闭<remote><branch>将强制推送所有已设置--set-upstream的本地分支。
需要注意的是,如果其他人共享了这个仓库,他们的修订历史会与新版本冲突,而且如果他们在修改后有任何本地提交,它们将失效。

更新:我想我会添加一个旁注。如果你正在创建其他人会审查的变更,那么用这些变更创建一个分支并定期重新定基以保持它们与主开发分支同步是很常见的。只要让其他开发人员知道这会定期发生,这样他们就知道会发生什么。
更新2:由于观看者数量的增加,我想添加一些额外的信息,说明当您的upstream确实遇到推力时该怎么做。

假设我克隆了你的repo并添加了一些提交,如下所示:

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的更多详细信息:

g6ll5ycj

g6ll5ycj2#

你想用力推

你基本上要做的是强制推送你的本地分支,以覆盖远程分支。
如果你想更详细地了解下面的命令,请参阅下面的详细信息部分。Git中有4个不同的强制推送选项:

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会根据你的配置设置来计算。在Git 2.0之后的版本中,新的repo会使用默认设置来推送当前 checkout 的分支:

git push <remote> --force

在2.0之前,新的回购协议默认设置为推送多个本地分支,这里讨论的设置是remote.<remote>.pushpush.default设置(见下文)。

省略远程和分支

当remote和branch都被省略时,git push --force的行为取决于push.default Git配置设置:

git push --force
  • 从Git 2.0开始,默认设置simple基本上只会将当前分支推送到上游的远程分支,远程分支由分支的branch.<remote>.remote设置决定,否则默认为原始存储库。
  • 在Git 2.0版本之前,默认设置matching基本上只是将所有本地分支推送到远程节点上同名的分支(默认为origin)。

您可以通过读取git help configan online version of the git-config(1) Manual Page来读取更多push.default设置。

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

如果远程节点上有你不希望的新提交(从技术上讲,如果你还没有把它们提取到你的远程跟踪分支中),强制推送可以失败,如果你不想意外地覆盖别人的提交,而你甚至还不知道这些提交,这是很有用的,而你只想覆盖你自己的提交:

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

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

qyuhtwio

qyuhtwio3#

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

  • 把你的新提交放到一个专用的分支中
  • origin/master上重置您的master
  • 将你的专用分支合并到master,始终保留来自专用分支的提交(意味着在master之上创建新的修订版本,它将镜像你的专用分支)。

参见“git命令使一个分支与另一个分支相似”了解模拟git merge --strategy=theirs的策略。
这样,您就可以将主机推到远程,而无需强制执行任何操作。

ghhkc1vu

ghhkc1vu4#

对我有效:

git push --set-upstream <remote> <branch> -f
2wnc66cl

2wnc66cl5#

git push -f具有一定的破坏性,因为它会重置团队中任何其他人所做的任何远程更改。

git push --force-with-lease

--force-with-lease所做的是拒绝更新一个分支,除非它是我们所期望的状态;也就是说,没有人更新上游分支,实际上,这是通过检查上游引用是否是我们所期望的来实现的,因为引用是散列,并且隐式地将父级链编码到它们的值中。
你可以告诉--force-with-lease要检查什么,但是默认情况下会检查当前的远程引用,这意味着当Alice更新她的分支并将其推送到远程仓库时,分支的引用头也会被更新,现在,除非Bob从远程仓库进行拉操作,否则,他对遥控器的本地引用将过期。当他使用--force-with-lease进行推送时,git将检查本地引用和新的远程引用,并拒绝强制推送。--force-with-lease只允许您在没有的情况下强制推送-在此期间,还有一个人将更改推到了遥控器上。它是--force,系上了安全带。

vyu0f0g1

vyu0f0g16#

// 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

ps.接受的答案对我不起作用。我不确定是否是由于Git版本。

相关问题