这两个Git命令在强制推送更改时有何区别?
git push -f origin branch
和 git push origin +branch
的区别是什么?git push -f origin branch
和 git push origin +branch
的区别是什么?如果你只推送一个分支,那么没有区别。
git push -f origin branch
和
git push origin +branch
是精确等价的。区别在于,当您使用单个git push
推送多个分支时,会出现差异。
简而言之,可选的+
比-f
提供了更精细的控制:如果您一次推送多个引用,则+
允许您指定要强制推送的引用,而--force
(或-f
)适用于正在被推送的所有引用。
git-push
手册告诉您什么涉及一个或多个refspec的git push
的最基本形式是:
git push <repository> <refspec>...
在git-push
手册中,描述了<refspec>...
参数必须满足的形式:
<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>
,则将更新与<src>
相同的引用...除非您的Git配置文件中的remote.<repository>.push
条目(如果有)另有规定。
在git-push
手册页的更深处,您会找到:
通过使用可选的前导+
,您可以告诉Git更新<dst>
引用,即使默认情况下不允许(例如,它不是快进)。这不会尝试合并<src>
到<dst>
中。
还要注意:
--force适用于所有被推送的引用,因此,将其与push.default设置为matching或使用多个push目标配置的remote.*.push一起使用可能会覆盖除当前分支以外的其他引用(包括严格落后于其远程对应项的本地引用)。要强制推送到一个分支,请在要推送的refspec前面使用+
(例如,git push origin +master强制推送到master分支)。
例如:
假设本地repo有两个分支,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将强制推送两个分支。这是git push -f origin master develop的确切等价物。