Git:修复带有分支的回购协议及其在不同分支上的远程

Git:修复带有分支的回购协议及其在不同分支上的远程,git,branch,Git,Branch,我不知道这是怎么发生的,但我有一个git回购协议,其状态如下: A--B--C--D master \ E--F origin/master 提交的E和F此时已过时;他们在B上所做的更改没有相关性,必要时可以删除这些更改 我只保留源代码作为我代码的远程备份,没有其他人克隆过它,所以我可以使用我需要的任何暴力 最干净的清理方法是什么 我只把origin远程保存作为代码的备份,没有其他人克隆它,所以我可以使用任何我需要的暴力 在这种情况下,git push--force o

我不知道这是怎么发生的,但我有一个git回购协议,其状态如下:

A--B--C--D  master
    \
     E--F   origin/master
提交的
E
F
此时已过时;他们在
B
上所做的更改没有相关性,必要时可以删除这些更改

我只保留
源代码
作为我代码的远程备份,没有其他人克隆过它,所以我可以使用我需要的任何暴力

最干净的清理方法是什么

我只把origin远程保存作为代码的备份,没有其他人克隆它,所以我可以使用任何我需要的暴力

在这种情况下,
git push--force origin master
就足够了。请确保您对存储库中的
origin/master
origin
上的(单独的)Git存储库中的
master
没有问题,因为您不再能够找到commit
F

(您自己的存储库将在一段时间内记住reflog name
origin/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对象,而您没有。例如,如果您还没有commit
F
,而您的
origin/master
记住了commit
B
E
,而他们将commit
F
作为他们的
master
,您的Git会说:我希望commit
F
请,他们会将其添加到要发送的提交列表中。然后他们会提供提交
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
设置为指向commit
D
?他们会说不!如果我那样做,我会忘记提交
F
!这个错误会以Git行话拒绝和非快进的形式出现,但这只是意味着他们说不,因为这会丢失commit
F
,因此也会丢失
E

但这正是你想要他们做的。因此,您只需要向他们发送一个强有力的命令:设置您的
主控
!他们公司