当强制推送更改时,这两个git命令有什么区别?
git push -f origin branch
和git push origin +branch
答案 0 :(得分:46)
如果你只是推动一个分支,那就没有区别了。
git push -f origin branch
和
git push origin +branch
是完全等价的。当您使用单个git push
推送多个分支时会出现差异。
简而言之,可选+
为您提供比-f
更精细的控制:如果您一次推送多个参考,{{1允许您指定哪个推送的引用被强制推送,而+
(或--force
)适用于所有被推送的引用。
-f
手册页告诉你什么 git-push
涉及一个或多个refspec的最基本形式是
git push
git push <repository> <refspec>...
参数必须满足的格式在<refspec>...
手册页中描述:
git-push
<refspec>...
因此,为了清楚起见,Specify what destination ref to update with what source object. The
format of a `<refspec>` parameter is an optional plus `+`, followed by
the source object `<src>`, followed by a colon `:`, followed by the
destination ref `<dst>`.
的语法是
<refspec>
如果省略[+]<src>[:<dest>]
,则会更新与:<dst>
相同的引用...除非Git配置中的<src>
条目(如果有)另有说明。
在git-push
man page中进一步向下,找到
通过使用可选的前导
remote.<repository>.push
,您可以告诉Git更新+
即使默认情况下不允许,也请参考(例如,它不是 快进。)这不会尝试将<dst>
合并到<src>
。
还有更进一步:
请注意,
<dst>
适用于所有推送的引用,因此 在--force
设置为push.default
或多次推送时使用它 使用matching
配置的目标可能会覆盖其他参考号 比当前分支(包括严格落后的本地裁判) 他们的远程对手)。要强制推送到一个分支,请使用remote.*.push
在refspec面前推(例如+
强迫 推送到git push origin +master
分支。)
考虑一个带有两个分支master
和master
的本地仓库,您希望将其推送(使用单个develop
命令)到git push
远程。
origin
将推动两个分支,但两者都不会被强制推送。
git push origin master develop
将推送两个分支,但只有git push origin +master develop
才会被强制推送。
master
将推送两个分支,但只有git push origin master +develop
才会被强制推送。
develop
将强制推送两个分支。它完全等同于git push origin +master +develop
。