我试图了解它们之间的区别
git push -f
Run Code Online (Sandbox Code Playgroud)
和
git push --force-with-lease
Run Code Online (Sandbox Code Playgroud)
我的猜测是,如果遥控器没有本地分支没有的提交,后者只会推送到遥控器?
如果有更好的方式来表达问题,lmk,但希望它很清楚.
che*_*bow 61
force
用本地分支覆盖远程分支.
--force-with-lease
如果将更多提交添加到远程分支(由另一个团队成员或同事或您有什么),则更安全的选项不会覆盖远程分支上的任何工作.它确保您不会通过强制推动覆盖某些人的工作.
我认为围绕命令的一般想法是正确的.如果远程分支具有与本地计算机上的远程分支相同的值,则将覆盖远程分支.如果它没有相同的值 - 它表示在您处理代码时其他人对远程分支所做的更改,因此不会覆盖任何代码.显然,如果远程中有其他提交,则值将不相同.
--force-with-lease
当我想确保不覆盖任何队友代码时,我只想到使用的选项.我公司的许多团队都使用--force-with-lease
故障安全的默认选项.在大多数情况下它是不必要的,但是如果你碰巧覆盖了另一个人为远程做出贡献的事情,那将会给你带来很多麻烦.
我确定你看过这些文档,但这里可能还有一些罗嗦的解释:
https://git-scm.com/docs/git-push
Sha*_*kil 19
git push --force具有破坏性,因为它无条件地使用本地存储库覆盖远程存储库。强烈建议不要使用git的push --force,因为它可以破坏已经推送到共享存储库的其他提交。强制推送最常见的原因之一是当我们被迫重新设置分支基础时。
例如。我们有一个带有功能分支的项目,爱丽丝和鲍勃都将从事这项工作。他们都克隆该存储库并开始工作。Alice最初完成了她的部分功能,并将其推入主存储库。这一切都很好。鲍勃也完成了他的工作,但是在推高工作之前,他发现一些更改已合并到母版中。为了保持一棵干净的树,他对master分支进行了rebase。当然,当他去推动这个重新组织的分支时,它将被拒绝。但是他没有意识到爱丽丝已经推动了她的工作,而是执行了推力。不幸的是,这将删除中央存储库中有关Alice更改的所有记录。
什么--force-与租赁确实是垃圾更新某个分支,除非它是我们所期望的状态; 即没有人更新上游分支。在实践中,这是通过检查上游ref是否符合我们的期望来实现的,因为ref是散列,并将父链隐式地编码为其值。
这是有关git push --force和git push --force-with-lease的好帖子。
Von*_*onC 16
寻找可信和/或官方来源的答案.
在评论和他的另一个答案中,torek提到的"比较和交换"被Git本身的来源进一步说明了.
如果远程没有本地分支没有的提交,后者只会推送到远程?
该功能在commit 28f5d17中引入(2013年12月,Git v1.8.5-rc0)
--force-with-lease
除非另有说明,否则将通过要求其当前值与某些合理的默认值相同来保护将要更新的所有远程引用;目前,"一些合理的默认值"暂时定义为" 我们对远程更新的ref的远程跟踪分支的值 ",如果我们没有这样的远程跟踪分支则是错误的.
所以"租约"意味着:
"
force-with-lease
":当你决定重新定义历史应该是什么时,你假设你在ref上接受了租约,并且只有在租约没有被破坏时你才可以退回.
消息来源仍然提到"cas":
- 这个选项最初被称为"
cas
"(用于"比较和交换"),这个名称没有人喜欢,因为它太技术性了.- 第二次尝试称它为"lockref"(因为它在概念上就像是在锁定后推动)但是"锁定"这个词是令人讨厌的,因为它暗示它可能拒绝别人的推动,这不是这个选项的工作方式.
- 这轮称它为"强制租赁".
你假设你在决定重新定义历史应该是什么时接受ref的租约,并且只有在租约没有被破坏时你才可以退回.
所以:" git push --force-with-lease
对战--force
"
正如我在" push --force-with-lease
默认情况下 "中提到的那样,正如Git 2.13(2017年第2季度)提到的那样,如果后台进程(比如你在带有Git插件的IDE中找到的进程)运行,则--force-with-lease
可以忽略该选项git fetch origin
.
在这种情况下,--force
占上风.
假设服务器上的任何预接收挂钩都接受推送,则此操作将始终成功:
git push --force
Run Code Online (Sandbox Code Playgroud)
鉴于此在继续之前运行特定的客户端检查:
git push --force-with-lease
Run Code Online (Sandbox Code Playgroud)
您可以自己手动运行特定检查。这是“租赁检查”算法:
找出您当前的分支。
运行git for-each-ref refs/remotes
。注意git客户端认为与当前分支的上游状态相对应的commit-id。
例如,如果您在分支“ foo”上,请注意与“ refs / remotes / origin / foo”关联的提交ID。
现在确定上游git服务器上远程分支的实际提交ID。
如果您从步骤2和步骤3中提取的提交ID一致,则仅让“ git push”继续进行。换句话说,仅当本地git克隆的上游概念与实际上游一致时,才继续操作。
这里有一个可悲的含义:由于将git fetch
“ refs / remotes / origin / *”下的所有ref更新为最新版本,因此这种命令组合基本上与git push --force
:
git fetch
# The command below behaves identically to "git push --force"
# if a "git fetch" just happened!
git push --force-with-lease
Run Code Online (Sandbox Code Playgroud)
为了解决这种固有的弱点,git push --force-with-lease
我尝试永远不要跑步git fetch
。取而代之的是,我总是git pull --rebase
在需要与上游同步时运行,因为它git pull
只会更新ref / remotes下的单个ref,从而保持--force-with-lease
有用的“租约” 。
归档时间: |
|
查看次数: |
19972 次 |
最近记录: |