'git fetch -p'是什么意思

时间:2013-07-24 11:35:51

标签: git

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

git branch -D branch-name

git fetch -p 

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

我害怕看到已删除分支列表的列表,并且想到可能是我执行了错误的命令,并且意外删除了所有分支!

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

4 个答案:

答案 0 :(得分:24)

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

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

现在,假设有人将featureX合并到master中,并从远程存储库中删除了功能分支。然后,origin只有两个分支masterfeatureY

但是,当您获取时,三个远程分支将仍然存在,包括在远程存储库中删除的分支。这是为了防止你意外丢失分支(想象有人意外地从遥控器中移除了分支,然后从中取出分支的每个人也会丢失它,使其难以恢复)。

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

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

答案 1 :(得分:10)

这意味着修剪

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

答案 2 :(得分:7)

您是否正在尝试查看fetch的帮助? git 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已被删除。

答案 3 :(得分:4)

其他答案解释了git fetch --prune的作用,但有一种情况需要更精确:当 {{3时无法获取(没有新的参考)时}} 即可。
在这种情况下,它会修剪upstream repo(来自/remotes/anUpstreamRepo/*),但它没有说出上游回购是什么原因导致修剪。

这由remote tracking branchescommit 4b3b33a修正为git 1.9 / 2.0(2014年第一季度):

fetch --prune:始终打印标题网址

  

如果&#34; fetch --prune&#34;运行时没有新的refs来获取,但它已经修改了。然后,如果有新的refs要获取,则不会打印标题网址。

     

此补丁之前的输出:

$ 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