当我删除我的一个本地分支时,我已经误解了这个命令,
git branch -D branch-name
git fetch -p
但我看到他们是一个显示要删除的分支名称列表。
我害怕看到已删除分支列表的列表,并且想到可能是我执行了错误的命令,并且意外删除了所有分支!
此命令的意思是什么(git fetch -p
)。任何的想法?
答案 0 :(得分:24)
当您获取远程存储库(例如“origin”)时,您将获得该远程存储库中存在的每个分支的远程分支。这些分支在本地存储为<remote>/<branch>
。
因此假设origin有分支master
,featureX
和featureY
。然后,在获取本地存储库中存在以下“远程分支”后:origin/master
,origin/featureX
和origin/featureY
。
现在,假设有人将featureX
合并到master中,并从远程存储库中删除了功能分支。然后,origin只有两个分支master
和featureY
。
但是,当您获取时,三个远程分支将仍然存在,包括在远程存储库中删除的分支。这是为了防止你意外丢失分支(想象有人意外地从遥控器中移除了分支,然后从中取出分支的每个人也会丢失它,使其难以恢复)。
相反,您需要告诉fetch命令 prune 远程分支上不再存在的任何分支。因此,通过执行git fetch --prune origin
或git 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 branches由commit 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