Git:拒绝通过push删除远程分支(类似于receive.denyDeletes),但仅当分支未完全合并时。

6
默认情况下,Git会拒绝删除未完全合并的本地分支(通过git branch -d mybranch)。但是,如果我通过git push origin --delete mybranch删除远程分支,则无论该分支是否已完全合并,都不会有任何警告。这似乎相当危险:自从我上次获取该分支以来,其他人可能已经向该分支推送了更新,因此在删除未合并的远程分支时,意外删除的可能性比本地分支更大。那么为什么Git在删除未合并的远程分支时不会发出警告?是否有办法使其发出警告或拒绝删除?注意:理想情况下,我应该在删除分支之前执行git pull,并确保它已完全合并。然而,每个人都会犯错,我希望有一个安全网。
2个回答

5
然而,如果我通过git push origin --delete mybranch删除远程分支,并且该分支没有完全合并,那么就会没有任何警告。我的回答是“与什么合并?”远程的HEAD?master分支?还是其他什么?Git的引用匹配可以无限配置。你可以配置多个远程仓库。上游跟踪分支不需要与其本地对应分支名称相同。甚至可以配置多个上游跟踪分支(如果您知道如何做到这一点(称为“章鱼”拉取),并且没有命令可以让您执行此操作)。git branch -d 检查分支是否已与其上游分支合并(在远程仓库中不存在),然后如果没有上游,则检查HEAD。对于远程仓库的对应检查则不太明显。根据kan的评论,还可以检查是否删除远程分支会生成悬空提交(因此更强大的git branch -d)。我认为也没有这种类型的保护措施,并且在具有数十个或数百个分支的远程仓库中验证这一点可能并不容易。你最好能做到的就是使用receive.denyDeletes完全防止删除。

据我理解,这是有意义的。要求可能是:如果分支删除会在仓库中产生悬挂提交,则不允许删除该分支。 - kan
@kan 是的,没错。我认为没有支持那种保护的方式。已经相应地编辑了答案。就它的价值而言,git branch -d 并不完全是这样做的。它只检查它是否与其上游分支或 HEAD(如果没有配置上游)完全合并。 - Christopher

0

Christopher回答(已赞)说明了本地(下游)仓库和远程(上游)仓库之间的区别。
请参见“downstream和upstream的定义

上游仓库不知道任何下游仓库,例如您的本地仓库。
它(上游仓库)可以代表任何东西(由许多人使用的远程仓库或仅用于编译和测试的临时仓库)。
要求远程仓库删除分支不应受任何本地仓库特性的限制(如果是这样,您只需要拥有另一个本地仓库来遵循您想要强制执行的任何约束:即使您的第一个本地仓库仍处于不正确的状态,它也可以删除远程分支)。

但是,在您的本地仓库中删除本地分支可能与您想要遵循的本地策略相关联。


“要求远程仓库删除分支不应受任何本地仓库特性的限制。”:抱歉,我无法理解。我不希望远程仓库“遵循任何本地特性”。如果警告推送此分支删除将导致悬空提交,我会非常满意。这与“git branch -d”的警告类似,但遵循略有不同的规则。 - sleske
在这种情况下,我确认当前没有这样的警告:要么您完全阻止任何删除,要么该分支将在远程存储库中被静默删除。 - VonC

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