我在删除我的一个本地分支时误解了这个命令,
git branch -D branch-name
git fetch -p
但我看到他们是一个显示要删除的分支名称列表。
我害怕看到已删除的分支列表,并认为可能是我执行了错误的命令,并且不小心删除了所有分支!
git fetch -p
这个命令( )是什么意思。任何想法?
我在删除我的一个本地分支时误解了这个命令,
git branch -D branch-name
git fetch -p
但我看到他们是一个显示要删除的分支名称列表。
我害怕看到已删除的分支列表,并认为可能是我执行了错误的命令,并且不小心删除了所有分支!
git fetch -p
这个命令( )是什么意思。任何想法?
当您获取远程存储库时,例如“origin”,您将获得该远程存储库上存在的每个分支的远程分支。这些分支在本地存储为<remote>/<branch>
.
所以假设 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 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。
您是否尝试查看帮助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
被删除了。
其他答案解释了做什么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