Git强制推送语法,"-f"与"+分支"的区别

47
这两个Git命令在强制推送更改时有何区别? git push -f origin branchgit push origin +branch的区别是什么?
1个回答

74

简述

如果你只推送一个分支,那么没有区别。

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的确切等价物。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接