如何撤消'git fetch'

sre*_*moh 17 git git-fetch git-remote

我刚添加remote A了我的另外repo B,然后运行git fetch A 如何撤消提取?如果我只是删除remote A:git remote remove A1它会撤消提取吗?

更新:

repo B

repo A

以上是我运行的命令,结果我将所有分支都提取到了我repo B但是我只需要一个特定的分支remote A,我需要它进入特定文件夹repo B但是这是另一个故事两个不同的git存储库之间的合并代码

qzb*_*qzb 23

您只需删除此遥控器即可从远程撤消所有提取A:

git remote remove A
Run Code Online (Sandbox Code Playgroud)

现在只需再次添加它并仅获取单个分支:

git remote add A <path/to/repository>
git fetch A <name of branch>
Run Code Online (Sandbox Code Playgroud)


tor*_*rek 12

这是很难1 "撤销"一个git fetch,但绝不2任何理由需要撤消git fetch.

请记住,git fetch调用远程控制器,获取分支名称列表到SHA-1映射,引入提交和其他对象以便将其存储在存储库中,然后更新远程跟踪分支以便他们指向遥控器的当前(截至你刚刚打电话的时候)分支提示.这对任何工作树文件都没有影响,如果你git fetch明天再次运行,今天完成的任何工作都可以在明天跳过.如果你确实设法撤消了fetch,那么明天运行就必须重新完成今天完成的工作,所以这是一个净损失:你只是花了一些精力,以便你的git明天必须通过网络带来更多的代码.

那说,脚注的时间.:-)


1这不是困难的,如果你有远程reflogs(你可能做的):只要使用遥控reflogs找到远程跟踪分支在最近的取指相同的信息也可能仍然是可用的更新FETCH_HEAD文件,然后使用git update-ref将这些引用指向它们之前的reflog条目.但是这仍然会将已获取的对象留在您的存储库中,因此要真正清除它们,您必须删除中间的reflog条目,然后运行git gc --prune=now,这需要非常小心并且将丢弃所有未引用的对象,而不仅仅是带来的对象最近的fetch.

2我认为有人可能认为"磁盘空间不足"可能是这样做的一个原因,特别是如果一个大型物体被意外推到遥控器上并且将被下一个遥控器移除fetch.但是,在一个空间不足的文件系统中工作一般都很棘手,而且我不确定除了将整个存储库移动到其他地方(某个没有磁盘空间问题的地方)之外我还想做很多事情.


The*_*her 8

我真的很喜欢torek 的回答,但它没有为您提供“更新引用日志”的命令,这正是我正在寻找的。我在其他答案中发现了这个反向 git fetch,所以我把它留在这里以简化对其他人的搜索。


让我们假设你有你的origin遥控器,你的本地develop分支基于master,但你的本地master在后面origin/master但你还没有看到它,因为你还没有获取origin)。

因此,执行git fetch会将新提交origin/master和标签添加到您的本地存储库。在某些情况下,您根本不想看到这些新提交,它们会降低您的历史记录的可读性。

话虽如此,您可以git fetch通过执行以下操作来“撤消” :

git update-ref refs/remotes/origin/master refs/remotes/origin/master@{1}
Run Code Online (Sandbox Code Playgroud)

所有这些都是将origin/master指针更改为先前的状态。也许您需要{n}稍微尝试一下才能获得确切的状态,但总的来说它可能会有所帮助。


小智 6

非常简单的解决方案:

git reset --keep HEAD@{1}
Run Code Online (Sandbox Code Playgroud)

或者第二种解决方案:

git reset --hard master@{"10 minutes ago"}
Run Code Online (Sandbox Code Playgroud)