什么是';git fetch-p';方法

什么是';git fetch-p';方法,git,Git,我在删除我的一个本地分支时误会地运行了这个命令 git branch -D branch-name git fetch -p 但我看到他们的是一个分支名称列表,显示要删除 我害怕看到被删除的分支列表,我想可能是我执行了错误的命令,不小心删除了所有的分支 此命令(git fetch-p)的含义是什么。有什么想法吗 当您获取一个远程存储库时,比如说“origin”,您将获得该远程存储库上存在的每个分支的远程分支。这些分支在本地存储为/ 因此,假设origin有分支master,featureX

我在删除我的一个本地分支时误会地运行了这个命令

git branch -D branch-name

git fetch -p 
但我看到他们的是一个分支名称列表,显示要删除

我害怕看到被删除的分支列表,我想可能是我执行了错误的命令,不小心删除了所有的分支


此命令(
git fetch-p
)的含义是什么。有什么想法吗

当您获取一个远程存储库时,比如说“origin”,您将获得该远程存储库上存在的每个分支的远程分支。这些分支在本地存储为
/

因此,假设origin有分支
master
featureX
featureY
。获取后,本地存储库中存在以下“远程分支”:
origin/master
origin/featureX
origin/featureY

现在,假设其他人将
featureX
合并到master中,并从远程存储库中删除该功能分支。那么origin只有两个分支
master
featureY

但是,在获取时,这三个远程分支将仍然存在,包括在远程存储库中删除的分支。这是为了防止您意外地丢失分支(假设有人意外地从远程删除了分支,那么从中获取的每个人都会丢失它,从而使其难以恢复)

相反,您需要告诉fetch命令修剪远程分支上不再存在的任何分支。因此,通过执行
git-fetch--prune origin
git-fetch-p
远程分支
origin/featureX
也将被删除

顺便说一句,如果你想从远程存储库中删除一个分支,你必须将一个“空”分支推送到它,例如,
git push origin:branchname
将在本地和远程本身上删除远程分支
origin/branchname

这意味着删除 具有修剪远程分支的选项,例如:

$ git branch -a
develop
master
remotes/origin/HEAD
remotes/origin/develop
remotes/origin/feature/deleted-last-week
remotes/origin/master
如果上周删除的分支
功能
在远程上不再存在(因为其他人已经删除了它),运行
fetch-p
将删除对它的本地引用:

$ git fetch -p
remote: Counting objects: 751, done.
remote: Compressing objects: 100% (346/346), done.
remote: Total 697 (delta 399), reused 632 (delta 337)
Receiving objects: 100% (697/697), 785.97 KiB | 377 KiB/s, done.
Resolving deltas: 100% (399/399), completed with 27 local objects.
From github.com:AD7six/project
   3ed9793..dece27d  develop    -> origin/develop
   e4b5ae6..94053fd  master     -> origin/master
 x [deleted]         (none)     -> origin/feature/deleted-last-week
$ git branch -a
develop
master
remotes/origin/HEAD
remotes/origin/develop
remotes/origin/master

因为它不再存在于远程服务器上。修剪远程对象也可以显式地称为。

您是否尝试查看
获取的帮助<代码>git帮助获取
显示:

-p, --prune
    After fetching, remove any remote-tracking branches which no
    longer exist on the remote.
通常,在获取任何新引用或更新时,都会对
refs/remote/
区域进行更新,但删除引用除外。
-p
选项要求
fetch
(和
git remote update
)继续并删除远程计算机上不再存在的任何远程引用
git remote prune
还将删除已删除的分支


例如,假设有一个远程分支
foo
。在本地存储库中,
refs/remote/origin/foo
处保留了一个引用。某人删除
foo
分支。下次运行
git fetch
时,您的引用仍然保持不变。如果您运行
git fetch-p
,您将看到
refs/remote/origin/foo
被删除。

其他答案解释了
git fetch--prune
的作用,但有一种情况需要更精确一点:当没有任何东西可以从
在这种情况下,它确实删减了(从
/remotes/anUpstreamRepo/*
),但它没有说明上游回购是导致上述删减的原因

git 1.9/2.0(2014年第1季度)对此进行了修正:

fetch--prune
:始终打印标题url 如果运行“
fetch--prune
”时没有要获取的新引用,但它有要修剪的引用。然后,如果要获取新的引用,则不会打印标题url

此修补程序之前的输出:

此修补程序之后的输出:


注意:
git-fetch-prune
更精确了一点:我不理解
git-remote-prune
git-fetch-p
之间的区别。您说第一个命令将“同时删除已删除的分支”,这不正是第二个命令所做的吗?@AndreaBergonzo Nope.:-)
git-remote-prune
仅查找远程上是否存在分支,如果远程上缺少分支,则将在本地(从参考/remote下)删除它们
git fetch-p
将获取新数据,但也会运行修剪步骤。所以他们略有不同。所以
git-fetch-p
=
git-remote-prune
+
git-fetch
?@andrabergonzo这是一种合理的思考方式,尽管我会反过来说:
git-fetch-p
=
git-remote-prune
(提取发生在修剪之前)
$ git fetch --prune remote-with-no-new-refs
 x [deleted]         (none)     -> origin/world
$ git fetch --prune remote-with-no-new-refs
From https://github.com/git/git
 x [deleted]         (none)     -> origin/test