Git本地和远程删除后分支仍然存在

Git branch still exists after deleting locally and remotely

我有一个名为 Atomics 的开发分支(更准确地说,atomics)。它正在开发中。测试OK,所以合并到Master。我现在准备完全删除它,因为它不再需要了。

真的觉得这个问题很清楚,回答得很好:Delete a Git branch both locally and remotely。唉,没用...

这是我所做的:

# Accepted answer, succeeded
$ git push origin --delete atomics

# Shit, it did not delete the local branch
$ git branch -a
...
* master
atomics

# Another answer. Whoops, causes an error
git push --delete origin atomics
error: unable to delete 'atomics': remote ref does not exist

# Try yet another answer:
git fetch --all --prune

# Check again
$ git branch -a
...
* master
atomics

根据 Torek 的回答:

$ git branch -d atomics
error: The branch 'atomics' is not fully merged.

# See below on the prelude that may have caused this
# (yet another Git black-hole)

# Yep, did not work
$ git fetch --prune origin
$ git branch -a
* master
atomics
...

以防万一,这是 Apple 的 Git:

$ git --version
git version 1.8.5.2 (Apple Git-48)

此时,我有两个问题。首先,我们如何删除本地和远程分支实际有效?考虑到引用的问题,这似乎是多余的,但即使答案被接受,问题似乎也没有得到回答。

其次,如何从这种特殊的 Git 部分删除内容的状态中恢复?


这是序曲。 --squash是保证.

$ git checkout master
$ git merge --squash atomics
# These files already existed in Master, but a 'git push' after the merge
# did nothing. Also, 'git status' showed they were modified.
$ git add a.h b.h a.cpp b.cpp
$ git commit a.h b.h a.cpp b.cpp -m "Mergae Atomics into Master"
$ git push

编辑:我接受了 Torek 的回答,因为这个人太他妈的努力了以至于不能从中得到一些东西。不幸的是,该程序不适用于此问题;当另一个开发分支被删除时,它在以下实验中不起作用。该工具已损坏,再多的问答也无法修复它。

TL;DR: 使用(至少)两个 命令,顺序不限。删除本地(和/或远程跟踪,这也是本地的)。删除遥控器。

在您的输出中,atomics 是一个 local 分支。要删除它,请确保你不在上面(你不在上面,它的前缀是 *,这只是一般的第一步),然后使用 git branch -d 删除它。

[Edit 解释关于 git branch -d 所发生情况的编辑评论:如果 Git 抱怨本地分支没有完全合并, Git 试图告诉您可能有一些您将无法访问的提交,这些提交没有保存在其他任何地方。如果没关系——如果你真的想放弃它们,或者如果你想保留它们但很确定它们被安全地保存在某个地方——你可以告诉Git强制删除,使用 git branch -Dgit branch --delete --force。这指示 Git 忽略可能被放弃的提交。 结束编辑]

push --delete 的东西是告诉一些 other Git,在一些远程站点,删除 his[=40= 】 当地分公司。一般而言,其他网站上发生的事情不会影响您当地的东西。有一些例外——特别是 git fetchgit push 可以 进行本地更改——但默认情况下,两者都不会影响任何本地分支,无论它是什么Git 完成或失败。

您可能还需要 git fetch --prune origin 来删除您的远程跟踪分支(尽管有名称,但它是您存储库的本地分支)。您可以改为使用 git branch -r -d origin/atomics(本地删除远程跟踪分支 origin/atomics)。

这是一个单独的答案,部分原因是我可以进行一些格式化,还因为此时我们似乎在谈论不同的存储库 and/or 分支。

从 GitHub 复制,这样我就可以看到那里的实际内容

我先克隆 git://github.com/weidai11/cryptopp:

$ cd tmp
$ git clone git://github.com/weidai11/cryptopp
Cloning into 'cryptopp'...
remote: Counting objects: 7756, done.
remote: Compressing objects: 100% (75/75), done.
remote: Total 7756 (delta 33), reused 0 (delta 0), pack-reused 7681
Receiving objects: 100% (7756/7756), 7.48 MiB | 1.87 MiB/s, done.
Resolving deltas: 100% (5480/5480), done.
Checking connectivity... done.
$ cd cryptopp/

现在我可以像 GitHub 上那样查看分支。在我自己的存储库中,我只有一个本地 master(刚刚由 git clone 创建)。

$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/alignas
  remotes/origin/arm-neon
  remotes/origin/det-sig
  remotes/origin/master
  remotes/origin/solaris

我看到有一个名为 alignas 的分支。让我们找到它指向的提交:

$ git rev-parse origin/alignas
d0760a44eab5e6da04690d4a0d80fc306abd0844

是否有任何其他名称指向此提交?如果该分支完全合并到某个其他分支中,则会有,如果没有则不会:

$ git branch -r --contains d0760a44eab5e6da04690d4a0d80fc306abd0844
  origin/alignas

所以在 origin/alignas 上至少有一个不在任何其他分支上的提交。简要看一下它显示(编辑了一下):

$ git show --name-status origin/alignas
commit d0760a44eab5e6da04690d4a0d80fc306abd0844
Author: [redacted]
Date:   [redacted]

    Fix CRYPTOPP_ALIGN_DATA placement

M       rijndael.cpp

如果我现在要从 GitHub 中删除这个分支——我不能,我没有对这个存储库的 GitHub 的写权限,并且 git:// 不提供写权限许可——该提交将从 GitHub 中删除,也许还有其他一些。 (进一步检查表明,在这一点之前的提交主要是 在其他分支上 的东西的合并;我们会丢失合并提交,但是被合并的东西受到其他分支的保护分支机构。)

正在从 GitHub 中删除(我不能,所以,只是假设)

如果您希望立即从 GitHub 中删除此分支,即使至少有一个提交会丢失,您1 也可以这样做:

git push --delete origin alignas

这将使您在自己的存储库中留下远程跟踪分支 origin/alignas(假设您现在拥有它),但 git fetch origin --prunegit remote prune origin 随后会删除 origin/alignas 来自您自己的存储库:

git fetch origin --prune

或:

git remote origin prune

git fetch origin --prune 步骤 应该 完成这项工作,但至少在 Git 的某些版本中,这被打破了一段时间。


1当然假设你有写权限并且正在使用https://ssh://。两者都不适合我,所以我不能。

本地分支,在你的 存储库

您可能在您的存储库中有本地分支alignas。我还没有它,但是在你从 GitHub 中删除 alignas 之前,虽然我在 my 存储库中仍然有 origin/alignas,我现在可以这样做:

$ git checkout alignas
Branch alignas set up to track remote branch alignas from origin.
Switched to a new branch 'alignas'

现在我有那个分支:

$ git branch -l
* alignas
  master

这是我现在的分店。假设我想从 my 存储库副本中删除它(同时单独留下 origin/alignas):

$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.

(这一步是必要的,因为Git不会让我删除我所站的分支)

$ git branch -d alignas
warning: deleting branch 'alignas' that has been merged to
         'refs/remotes/origin/alignas', but not yet merged to HEAD.
Deleted branch alignas (was d0760a4).

我的 git 版本是 2.8.1。 Apple git 1.8.x 可能会给你一个关于分支没有被正确合并的错误。

让我再次创建本地 alignas,然后再次删除它,这次更加有力:

$ git checkout alignas
Branch alignas set up to track remote branch alignas from origin.
Switched to a new branch 'alignas'

这和以前一样:我的Git使用远程跟踪分支origin/alignas创建本地分支alignas,然后把我放在那个分支上。

$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
$ git branch -D alignas
Deleted branch alignas (was d0760a4).

再说一次,我必须下车,然后才能删除它。一旦我在本地删除了它,我就不会不小心推了它(见下文)。

其他人

拥有此存储库副本的任何其他人可能 拥有一个alignas 分支。例如,假设 Fred 有一个副本,并且他没有删除 his alignas。进一步假设他在 GitHub.

上拥有此存储库的写权限

从 GitHub 中删除 alignas 后,Fred 可以随时重新创建它。他所要做的就是 git push origin alignasgit push origin --all,它会在 GitHub 上返回。

要阻止它,你必须阻止 Fred。 :-)

以下解决方案帮助了我:重写命令,但使用 -D 标志 git branch -D your_branch