34

我在删除我的一个本地分支时误解了这个命令,

git branch -D branch-name

git fetch -p 

但我看到他们是一个显示要删除的分支名称列表。

我害怕看到已删除的分支列表,并认为可能是我执行了错误的命令,并且不小心删除了所有分支!

git fetch -p这个命令( )是什么意思。任何想法?

4

4 回答 4

40

当您获取远程存储库时,例如“origin”,您将获得该远程存储库上存在的每个分支的远程分支。这些分支在本地存储为<remote>/<branch>.

所以假设 origin 有分支master和。然后在获取本地存储库中存在以下“远程分支”后:和.featureXfeatureYorigin/masterorigin/featureXorigin/featureY

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

但是,当您获取时,三个远程分支仍然存在,包括在远程存储库中删除的一个。这是为了防止你不小心丢失了分支(想象一下有人不小心从远程删除了分支,那么从它获取的每个人也会丢失它,很难恢复它)。

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

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

于 2013-07-24T11:42:12.957 回答
15

是修剪的意思

git fetch可以选择修剪远程分支,例如:

$ git branch -a
develop
master
remotes/origin/HEAD
remotes/origin/develop
remotes/origin/feature/deleted-last-week
remotes/origin/master

如果远程分支feature/deleted-last-week不再存在(因为其他人已经删除了它),运行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 remote prune

于 2013-07-24T11:46:05.083 回答
8

您是否尝试查看帮助fetchgit help fetch显示:

-p, --prune
    After fetching, remove any remote-tracking branches which no
    longer exist on the remote.

通常,当您获取任何新引用或更新您的refs/remote/<remote-name>区域时,除了删除引用。该-p选项要求fetch(和git remote update)继续并删除遥控器上不再存在的任何远程引用。 git remote prune还将删除已删除的分支。

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

于 2013-07-24T11:47:51.983 回答
4

其他答案解释了做什么git fetch --prune,但有一种情况需要更精确一点:当没有什么可以从上游 repo获取(没有新的 refs)时。
在这种情况下,它确实修剪了远程跟踪分支(来自/remotes/anUpstreamRepo/*),但它没有说明上游 repo 是什么原因造成的。

这是由汤姆米勒(tmiller)为 git 1.9/2.0(2014 年第一季度)提交的 4b3b33a 修复的:

fetch --prune: 总是打印标题 url

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

此补丁之前的输出:

$ 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
于 2014-01-12T11:33:44.253 回答