如何撤消“git fetch”

问题描述 投票:0回答:6

我刚刚向我的

remote A
添加了额外的
repo B
,然后运行
git fetch A
。我怎样才能撤消提取?如果我只是删除
remote A
git remote remove A1
会撤消提取吗?

更新:

$ git remote add A path/to/A
$ git fetch A

上面是我运行的命令,所以结果我将所有分支提取到我的

repo B
,但是我只需要来自
repo A
的一个特定分支,并且我需要它进入
repo B
上的特定文件夹,但这是另一个故事合并两个不同 git 存储库之间的代码

git git-remote git-fetch
6个回答
44
投票

您只需删除此遥控器即可撤消从遥控器A获取的

所有

git remote remove A

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

git remote add A <path/to/repository>
git fetch A <name of branch>

20
投票

很难1“撤消”

git fetch
,但从来没有2任何理由需要撤消
git fetch

请记住,

git fetch
所做的是调用远程,获取分支名称到 SHA-1 映射的列表,带来提交和您需要的其他对象,以便将它们存储在存储库中,然后更新您的远程-跟踪分支,以便它们指向远程的当前(截至您刚刚打电话的时间)分支提示。这对您的任何工作树文件都没有影响,如果您明天再次运行
git fetch
,则明天可以跳过今天完成的任何工作。如果你do设法撤消
fetch
,明天运行的人将不得不重新做今天完成的工作,所以这是一个净损失:你只是花了一些努力,所以你的git将不得不带来更多的代码明天通过网络。

也就是说,是时候做脚注了。 :-)


1如果您有远程引用日志(您可能会这样做),那么这并不困难:只需使用远程引用日志来查找在最近的提取中更新的远程跟踪分支 - 同样的信息也可能在FETCH_HEAD 文件,然后使用

git update-ref
将这些引用指向其之前的引用日志条目。但这仍然会将获取的对象留在存储库中,因此要真正清除它们,您还必须删除中间引用日志条目,然后运行
git gc --prune=now
,这需要非常小心,并且会丢弃
all
未引用的对象,不仅仅是最近带来的fetch

2

我认为有人可能会说“磁盘空间不足”可能是这样做的一个原因,特别是如果一个大对象被意外推到远程并且将被下一个fetch从远程删除。不过,一般来说,在空间不足的文件系统中工作是很棘手的,而且我不确定除了将整个存储库移到其他地方(没有磁盘空间问题的地方)之外,我还想在这里做很多事情。

    


9
投票
torek

的回答,但它没有为您提供“更新引用日志”的命令,而这正是我正在寻找的。我在其他答案中找到了这个reverse a 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}

这一切所做的只是将 
origin/master

指针更改为之前的状态。也许您需要稍微使用

{n}
才能获得确切的状态,但总的来说它可能会有所帮助。
    


5
投票

git reset --keep HEAD@{1}

或第二种解决方案:

git reset --hard master@{"10 minutes ago"}



4
投票

git update-ref -d refs/remotes/YOUR_REMOTE_NAME/BRANCH_NAME_TO_DELETE


为了防止再次获取它们,请将 git 远程设置为仅获取指定分支:

git remote set-branches YOUR_REMOTE_NAME desired_branch1 [desired_branch2, desired_branch3, etc]

,例如

git remote set-branches origin master

集合分支的默认行为是始终替换列表。如果要追加,请使用

--add

选项:

git remote set-branches --add origin another_branch
    


0
投票
A

该命令用于删除本地从远程获取的分支:

git branch -r -d <branch-name>

您可以使用 
git branch -a

查看分行的名称,如果名称是

remotes/origin/A
您应该使用
git branch -rd origin/A
您可以通过再次获取来撤消此操作:

git fetch origin

© www.soinside.com 2019 - 2024. All rights reserved.