我刚刚向我的
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 存储库之间的代码。
您只需删除此遥控器即可撤消从遥控器A
获取的
所有:
git remote remove A
现在只需再次添加它并仅获取单个分支:
git remote add A <path/to/repository>
git fetch A <name of branch>
很难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
从远程删除。不过,一般来说,在空间不足的文件系统中工作是很棘手的,而且我不确定除了将整个存储库移到其他地方(没有磁盘空间问题的地方)之外,我还想在这里做很多事情。
的回答,但它没有为您提供“更新引用日志”的命令,而这正是我正在寻找的。我在其他答案中找到了这个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}
才能获得确切的状态,但总的来说它可能会有所帮助。git reset --keep HEAD@{1}
或第二种解决方案:
git reset --hard master@{"10 minutes ago"}
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
A
。
该命令用于删除本地从远程获取的分支:git branch -r -d <branch-name>
您可以使用
git branch -a
查看分行的名称,如果名称是
remotes/origin/A
您应该使用 git branch -rd origin/A
。您可以通过再次获取来撤消此操作:
git fetch origin