在我们的 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
也许有点离题,但该网站的观点可能有助于理解删除分支的一般主题:
与此处已经讨论的一些内容有重叠,但重点是内务管理:删除协作环境中不再需要的远程和本地分支。特别是,该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
(不幸的是,“好,易于理解”并不适用于脚本本身的格式。)