为什么我要签出在GitHub上删除的分支?


26

在我们的GitHub存储库中,一位同事删除了一个名为的分支release。但是,当我在git checkout release本地运行时,我总是得到被删除的分支release。同样,即使我签出了另一个分支,也使用删除了该release分支,git branch -D release然后再次运行git checkout release

GitHub存储库上有什么要修复的,还是我应该在本地修复?


1
git branch --remote运行后输出什么git fetch?您可能需要修剪git fetch -p以忘记已删除的远程分支。
斯蒂芬·基特

2
如果该分支曾经被推送到GitHub,然后又撤回了该分支,那么您也将拥有该分支的副本。每个git存储库本身都是完整的,除非您使用浅表克隆之类的东西。
muru

@StephenKitt:谢谢。git branch --remote输出origin/release。您是要在git fetch -p没有其他参数的情况下运行,并且会修剪所有已删除的远程分支吗?
蒂姆(Tim)

1
是的,git fetch -p没有其他参数将修剪所有已删除的远程分支。
斯蒂芬·基特

1
欢迎来到分布式版本控制世界!
克莱里斯(罢工)-17年

Answers:


24

在删除远程端的分支后,您可能仍然会在本地看到此以前获取的远程分支,请参阅:

$ git branch -a
[...]
release
remotes/origin/release
[...]

您仅删除了“发行版”,但没有删除“远程/来源/发行版”。像这样删除它:

$ git branch -rd origin/release

或删除所有不再存在于远程端的已获取分支:

$ git remote prune origin 

谢谢。在中git branch -rd origin/release,是什么-r意思?是否-d意味着一样的-D?可以 git branch -rd origin/release代替 git branch -d remotes/origin/release吗?
蒂姆(Tim)

@Tim:来自手册;-r :List or delete (if used with -d) the remote-tracking branches.;-D:Shortcut for --delete --force.
Looper

谢谢。可以git branch -rd origin/release代替git branch -d remotes/origin/release吗?
蒂姆(Tim)

@Tim no -r指的是远程分支,这是必需的。本地和远程分支存储在不同目录中,compare ls -l .git/refs/headsls -l .git/refs/remotes。您还可以有一个名为的本地分支remotes/origin/release,如果没有则将其删除-r。这听起来可能令人困惑,但是您可以玩转,使用奇怪的名称创建分支,然后查看它的外观.git/
rudimeier

15

远程删除分支后,您需要修剪本地存储库-最简单的方法是

git fetch -p

这将使用对远程存储库所做的所有更改来更新本地存储库,但不会更新任何本地分支。运行这个之后

git branch --remote

将不再显示已删除的远程分支。

git存储库是完整的,无论是在您自己的系统上还是在服务器上。因此,当您第一次克隆存储库时,您将获得完整的副本,并且本地git“知道”所有远程分支以及本地分支。此信息不会自动同步,因此当您的同事删除release服务器上的分支时,本地git存储库不会丢失其远程release分支的概念。与同步git fetch更新远程分支上的所有本地信息,以便它们与服务器上的状态(严格来说,远程存储库,无论在何处)相匹配,但不会删除远程分支上的任何本地信息。用git fetch -p(或git fetch --prunegit remote prune)修剪会删除已删除的远程分支上的本地信息。


谢谢。“使用对远程存储库所做的所有更改来更新本地存储库,但不更新任何本地分支”。考虑到不是我的本地分支机构的更新,那是什么更新?
蒂姆(Tim)

全部是远程更新。您的本地git存储库将您的本地分支和远程分支区分开来,但是远程分支并没有与服务器神奇地同步-它们也本地存在(例如,存储在本地git存储库中)。提取会将您的本地存储库与远程存储库同步,并更新远程分支的状态;默认情况下,不会从远程分支的本地信息中删除已删除的远程分支,-p--prune)强制这样做。
斯蒂芬·基特

谢谢。为什么不删除release的分支git branch -D releasegit checkout release化妆git checkout release停止得到release分支?
蒂姆(Tim)

1
因为git checkout release如果存在具有该名称的远程分支,它将自动重新创建分支。
斯蒂芬·基特

“远程分支”是指我的本地存储库或Github存储库中的分支吗?如果是以前的话,git branch -D release已经删除了release我本地存储库中的分支;如果是后者,则同事已release在GitHub上删除了该分支;因此,我仍然不确定为什么“如果存在具有该名称的远程分支,将自动重新创建分支”吗?
蒂姆(Tim)

3

蒂姆:Git是分布式VCS,因此,当您从远程克隆存储库到本地时,它将克隆所有内容(历史记录)。因此,当您克隆存储库时,它有一个分支称为release。由于您的同事远程删除了release分支,因此在您进行剪枝git fetch -p或明确删除该分支之前,您的本地将拥有该分支。


3
这个答案与已经存在的答案有何不同?
斯蒂芬·劳奇

1

也许有点切线,但是此站点的角度可能有助于了解删除分支的一般主题:

http://railsware.com/blog/2014/08/11/git-housekeeping-tutorial-clean-up-outdated-branches-in-local-and-remote-repositories/

这里已经讨论了一些重叠的内容,但重点是客房整理:删除协作环境中不再需要的分支(远程和本地)。特别是,该git branch --merged命令标识了由于合并到您的主线(或您关心的任何分支)而可以安全删除的分支。如果您正在合作,那么像这样的一些更奇妙的迷你脚本将以一种很好的,易于消化的格式显示日期和作者。

for branch in `comm -12  <(git branch --merged|awk '{print($1)}') <(git branch -r --merged|awk '{print($1)}'|awk -F \/ '{print($2)}')`; do echo -e `git show --format="%ci %cr %an" $branch | head -n 1` \\t$branch; done | sort -r

(不幸的是,“不错,易于消化”不适用于脚本本身的格式。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.