删除 Git 中的远程分支:一次彻底理解

5
我今天发布这篇文章的原因是,我在命令行界面上看到的行为与网上阅读的不同,令我感到困惑。
这里涉及到的两个命令是:
git branch -r -d origin/topic1

并且

git push origin :topic1

迄今为止,我了解到以下内容(虽然可能完全错误,我的大脑已经崩溃):

  • 第一个应该同时删除跟踪引用和远程分支
  • 第二个应该只删除远程分支但不删除跟踪引用(如果存在本地分支),尽管作为一位入门者,为什么不删除跟踪引用似乎是毫无意义并且令人困惑的。

以下是我最近遇到的情况。我刚克隆了一个具有两个远程分支的存储库:

origin/master
origin/develop

我唯一的本地分支是:
master

我想删除远程分支origin/develop,请看下面:

Robert@COMP /c/Code/project (master)
$ git branch -rd origin/develop
Deleted remote branch origin/develop (was 9ff16e8).

Robert@COMP /c/Code/project (master)
$ git fetch
From github.com:username/project
 * [new branch]      develop    -> origin/develop

正如您所看到的,我试图删除远程分支并立即从源获取最新更改,但由于某种原因它重新创建了该分支。我不知道为什么会这样做,我很困惑。我没有本地对应的 origin/develop 分支,所以我不知道为什么会这样做。
我想知道为什么会发生这种情况,同时(为了回答这个问题的更普遍的标题,并帮助每个在stack overflow上寻找答案的人),我想获得一些更一般的答案:
- 删除远程分支有两种方法。有没有一个真正好记、简单的方法来记住在哪种情况下使用哪种方法? - 假设这很重要,那么是否存在相应的本地分支(用于远程分支)的存在会影响如何删除远程分支的决策? - 追踪引用/关系在本地和远程分支之间的存在如何影响选择删除分支的方式,哪些删除分支的方法也会清理追踪引用?

1
Git文档有一个非常不好的习惯,就是使用相同的单词表示不同的含义。虽然它应该是“从上下文中很明显”,但并不总是如此,对于那些新手或轻度使用git的人来说,这可能永远都不会变得明显。 - torek
1个回答

3

首先应该删除追踪引用和远程分支。

不行:这是一个本地操作,所以它只能删除远程跟踪分支(在你的仓库内)。

远程跟踪分支用于记住从远程仓库获取的分支的最后一个 SHA1。
如果你想删除远程仓库上的那个分支,你需要告诉远程仓库(因此需要使用 git push :topic1)。

本地分支(在你的仓库内)可以是:

  • 一个简单的分支
  • 一个远程跟踪分支(由 fetch 创建)
  • 一个本地跟踪分支(因为它有一个关联的上游分支

如 "如何删除所有已合并的 git 分支?" 中所提到的,一旦你删除了远程仓库的几个分支,你就可以使用以下命令清理你本地仓库中的所有远程跟踪分支:

git remote prune origin

那么我理解的 git push origin :topic1 不会删除跟踪引用,是吗?那么完整的命令是什么,可以清除跟踪引用呢?最好有一个干净的命令可以同时完成这两个任务。 - void.pointer
@RobertDailey 是的,远程跟踪分支仍然存在,就像我在这里提到的一样:https://dev59.com/3WjWa4cB1Zd3GeqPnBOO#12276576 - VonC
@RobertDailey 所以你需要两个命令,但正如我在编辑后的答案中提到的那样,git remote prune可以帮助解决问题。 - VonC
谢谢VonC,我修改了我的问题以澄清术语“remote”似乎有多重含义,这就是我困惑的原因,希望人们能够阅读并在未来受益。您的答案非常好,非常感谢! - void.pointer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接