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而不是提交,最后提交历史看起来会更好:
// 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
6条答案
按热度按时间iszxjhcz1#
您应该能够通过使用以下命令将本地修订强制到远程存储库
(e.g.关闭
<remote>
和<branch>
将强制推送所有已设置--set-upstream
的本地分支。需要注意的是,如果其他人共享了这个仓库,他们的修订历史会与新版本冲突,而且如果他们在修改后有任何本地提交,它们将失效。
更新:我想我会添加一个旁注。如果你正在创建其他人会审查的变更,那么用这些变更创建一个分支并定期重新定基以保持它们与主开发分支同步是很常见的。只要让其他开发人员知道这会定期发生,这样他们就知道会发生什么。
更新2:由于观看者数量的增加,我想添加一些额外的信息,说明当您的
upstream
确实遇到推力时该怎么做。假设我克隆了你的repo并添加了一些提交,如下所示:
但是后来
development
分支被rebase
命中,这将导致我在运行git pull
时收到如下错误:这里我可以修复冲突和
commit
,但这会给我留下一个非常难看的提交历史:使用
git pull --force
可能看起来很诱人,但要小心,因为这会给您留下搁浅的提交:所以最好的选择可能是执行
git pull --rebase
,这需要我像以前一样解决任何冲突,但是对于每一步,我都使用git rebase --continue
而不是提交,最后提交历史看起来会更好:**更新3:**您还可以使用
--force-with-lease
选项作为“更安全”的强制推送as mentioned by Cupcake in his answer:如果远程节点上有你不希望的新提交(从技术上讲,如果你还没有把它们提取到你的远程跟踪分支中),强制推送可以失败,如果你不想意外地覆盖别人的提交,而你甚至还不知道这些提交,这是很有用的,而你只想覆盖你自己的提交:
您可以通过阅读以下任意内容了解有关如何使用
--force-with-lease
的更多详细信息:git push
documentationg6ll5ycj2#
你想用力推
你基本上要做的是强制推送你的本地分支,以覆盖远程分支。
如果你想更详细地了解下面的命令,请参阅下面的详细信息部分。Git中有4个不同的强制推送选项:
如果你想要每个命令更详细的解释,那么请看下面我的长答案部分。
推力详情
指定远程和分支
您完全可以指定特定的分支和远程。
-f
标志是--force
的缩写忽略分支
当忽略要推送的分支时,Git会根据你的配置设置来计算。在Git 2.0之后的版本中,新的repo会使用默认设置来推送当前 checkout 的分支:
在2.0之前,新的回购协议默认设置为推送多个本地分支,这里讨论的设置是
remote.<remote>.push
和push.default
设置(见下文)。省略远程和分支
当remote和branch都被省略时,
git push --force
的行为取决于push.default
Git配置设置:simple
基本上只会将当前分支推送到上游的远程分支,远程分支由分支的branch.<remote>.remote
设置决定,否则默认为原始存储库。matching
基本上只是将所有本地分支推送到远程节点上同名的分支(默认为origin)。您可以通过读取
git help config
或an online version of the git-config(1) Manual Page来读取更多push.default
设置。使用
--force-with-lease
更安全地用力推动如果远程节点上有你不希望的新提交(从技术上讲,如果你还没有把它们提取到你的远程跟踪分支中),强制推送可以失败,如果你不想意外地覆盖别人的提交,而你甚至还不知道这些提交,这是很有用的,而你只想覆盖你自己的提交:
您可以通过阅读以下任意内容了解有关如何使用
--force-with-lease
的更多详细信息:git push
documentationqyuhtwio3#
另一个选项(为了避免可能对其他贡献者造成问题的任何强制推送)是:
origin/master
上重置您的master
master
,始终保留来自专用分支的提交(意味着在master
之上创建新的修订版本,它将镜像你的专用分支)。参见“git命令使一个分支与另一个分支相似”了解模拟
git merge --strategy=theirs
的策略。这样,您就可以将主机推到远程,而无需强制执行任何操作。
ghhkc1vu4#
对我有效:
2wnc66cl5#
git push -f
具有一定的破坏性,因为它会重置团队中任何其他人所做的任何远程更改。--force-with-lease
所做的是拒绝更新一个分支,除非它是我们所期望的状态;也就是说,没有人更新上游分支,实际上,这是通过检查上游引用是否是我们所期望的来实现的,因为引用是散列,并且隐式地将父级链编码到它们的值中。你可以告诉
--force-with-lease
要检查什么,但是默认情况下会检查当前的远程引用,这意味着当Alice更新她的分支并将其推送到远程仓库时,分支的引用头也会被更新,现在,除非Bob从远程仓库进行拉操作,否则,他对遥控器的本地引用将过期。当他使用--force-with-lease
进行推送时,git将检查本地引用和新的远程引用,并拒绝强制推送。--force-with-lease
只允许您在没有的情况下强制推送-在此期间,还有一个人将更改推到了遥控器上。它是--force
,系上了安全带。vyu0f0g16#
ps.接受的答案对我不起作用。我不确定是否是由于Git版本。