Git:修复带有分支的回购协议及其在不同分支上的远程
我不知道这是怎么发生的,但我有一个git回购协议,其状态如下:Git:修复带有分支的回购协议及其在不同分支上的远程,git,branch,Git,Branch,我不知道这是怎么发生的,但我有一个git回购协议,其状态如下: A--B--C--D master \ E--F origin/master 提交的E和F此时已过时;他们在B上所做的更改没有相关性,必要时可以删除这些更改 我只保留源代码作为我代码的远程备份,没有其他人克隆过它,所以我可以使用我需要的任何暴力 最干净的清理方法是什么 我只把origin远程保存作为代码的备份,没有其他人克隆它,所以我可以使用任何我需要的暴力 在这种情况下,git push--force o
A--B--C--D master
\
E--F origin/master
提交的E
和F
此时已过时;他们在B
上所做的更改没有相关性,必要时可以删除这些更改
我只保留源代码
作为我代码的远程备份,没有其他人克隆过它,所以我可以使用我需要的任何暴力
最干净的清理方法是什么
我只把origin远程保存作为代码的备份,没有其他人克隆它,所以我可以使用任何我需要的暴力
在这种情况下,git push--force origin master
就足够了。请确保您对存储库中的origin/master
和origin
上的(单独的)Git存储库中的master
没有问题,因为您不再能够找到commitF
(您自己的存储库将在一段时间内记住reflog nameorigin/master@{number}下提交的E
和F
,因此,只要您保持自己的存储库完好无损,如果它们最终不是过时的,您仍然可以将它们取回。但是,在某个时候,它们确实会被删除。服务器可能根本没有重登录,其提交的副本E
和F
可能会在几秒钟、几小时或几分钟内消失得比较快例如,几天。)
如何以及为什么这样做
每个Git存储库都有自己的分支名称,这些名称对于特定的Git存储库是半私有的。您正在调用的机器上有一个存储库origin
,它有一个分支名master
您的远程跟踪名称,例如origin/master
,是您的Git记住其他Git分支名称的方法。在这种情况下,origin/master
是Git的origin
的master
内存
当你让你的Git通过Git fetch
或Git push
调用他们的Git时,两个Git会进行一次启动对话。fetch和push略有不同,但您可以使用gitlsremote
观察git fetch本身将观察到什么。只需运行git ls remote origin
(或者保留origin
,因为默认值通常是origin
):您的git将溢出它列出的其他git的分支、标记和其他名称。这是git fetch的第一部分:你的git打电话给他们的git并获取这个列表
当您使用git fetch
时,您的git使用此列表向其git请求任何提交和其他git希望拥有的内部git对象,而您没有。例如,如果您还没有commitF
,而您的origin/master
记住了commitB
或E
,而他们将commitF
作为他们的master
,您的Git会说:我希望commitF
请,他们会将其添加到要发送的提交列表中。然后他们会提供提交E
——Git必须提供每次提交的父项,您的Git要么说不谢谢,我已经有了,要么说是(在这种情况下,他们会提供B
,E
的父项,等等)
然后,他们的获取过程将所有需要的东西捆绑起来,以便将这些提交提交到Git。在这里,您将看到计算对象
和压缩对象
——并将其发送过来。您的Git会扩展这些内容,以便您拥有一组适当的提交及其数据,然后根据存储在其主文件中的哈希ID创建或更新您的源文件/master
:现在您肯定有了提交F
,Git可以让您的源文件/master
指向它
因此,如果您运行:
git fetch origin
在任何时候,这是命令的“GetMeEverything”形式,您的Git将调用他们的Git并获得初步的“everything”列表。这两个Git将从中找出Git需要得到什么,并将其交给Git。然后,Git将基于所有远程跟踪名称的分支名称创建或更新所有远程跟踪名称
当您使用git push
,这与git与fetch
的相反位置非常接近-由于历史上的错误,这两个过程是push
和fetch
,而不是push
和pull
,出现了类似的过程,但有两个关键区别:
- 您的Git发送,而不是接收。(您的Git仍然选择发送什么,并且“如果发送提交,则必须提供父项”仍然有效,以此类推,但是使用
Git fetch
,他们的Git已发送,您的Git已接收。)
- 最后,Git不再更新某种“远程跟踪名称”,而是(礼貌地)要求或(强制地)命令Git设置它的一些分支名称
如果您要求或命令他们设置其主机
,并且他们服从,您的Git现在知道他们的主机
已设置为您提供的哈希ID,因此您的Git现在会更新您的源站/主机
远程跟踪名称
当你使用一个温和的ask类型git-push-origin-master
,你的git会发送你没有的提交,比如C
和D
,然后礼貌地问他们:如果可以,请将你的master
设置为指向commitD
?他们会说不!如果我那样做,我会忘记提交F
!这个错误会以Git行话拒绝和非快进的形式出现,但这只是意味着他们说不,因为这会丢失commitF
,因此也会丢失E
但这正是你想要他们做的。因此,您只需要向他们发送一个强有力的命令:设置您的主控
!他们公司