为什么我可以签出 GitHub 上已删除的分支?

为什么我可以签出 GitHub 上已删除的分支?

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

GitHub 存储库上是否有需要修复的内容,或者我应该在本地修复某些内容吗?

答案1

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

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

您只删除了“release”,但没有删除“remotes/origin/release”。请按如下方式删除它:

$ git branch -rd origin/release

或者删除全部获取远程端不再存在的分支:

$ git remote prune origin 

答案2

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

git fetch -p

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

git branch --remote

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

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

答案3

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

答案4

也许有点离题,但该网站的观点可能有助于理解删除分支的一般主题:

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

(不幸的是,“好,易于理解”并不适用于脚本本身的格式。)

相关内容