Git Force推送语法," - f"与"+ branch"

Ty.*_*Ty. 28 git

当强制推动变化时,这两个git命令有什么区别?

git push -f origin branchgit push origin +branch

jub*_*0bs 49

TL; DR

如果你只是推动一个分支,那就没有区别了.

git push -f origin branch
Run Code Online (Sandbox Code Playgroud)

git push origin +branch
Run Code Online (Sandbox Code Playgroud)

是确切的等价物.当您用一个分支推送多个分支时会出现差异git push.

简而言之,可选+为您提供了更精细的控制比-f:如果你在同一时间推出一个以上的裁判,将+允许你指定其推裁判的获取力推动,而--force(或-f)适用于所有裁判正在被推动.

更多细节

什么git-push男人页面告诉你

最基本的形式git push涉及一个或多个refspec(s)

git push <repository> <refspec>...
Run Code Online (Sandbox Code Playgroud)

<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>`.
Run Code Online (Sandbox Code Playgroud)

所以,只是要清楚,语法<refspec>

[+]<src>[:<dest>]
Run Code Online (Sandbox Code Playgroud)

如果:<dst>省略,则相同的ref <src>将被更新...除非remote.<repository>.pushGit配置中的条目(如果有)另有说明.

git-push你会发现在手册页的下方

通过具有可选的领导+,你可以让Git更新<dst> ,即使它是默认不允许的REF(例如,它不是一个快进.)这并不试图合并<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将强行推动两个分支.它完全等同于git push -f origin master develop.

  • 非常具有描述性的答案,谢谢! (4认同)