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

时间:2016-06-07 02:30:01

标签: git branch

我有一个名为Atomics的开发分支(更准确地说,atomics)。它完成了开发。它测试好了,所以它被合并到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是为了确保log on Master is accurate

$ 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的答案,因为这个男人太努力了,不能从中得到一些东西。不幸的是,该程序对这个问题不起作用;当删除另一个dev分支时,它不适用于以下实验。该工具已损坏,并且没有任何可以修复它的Q& A。

3 个答案:

答案 0 :(得分:6)

TL; DR:以任何顺序使用(至少)两个命令。删除本地(和/或远程跟踪,也是本地的)。删除远程。

在您的输出中,atomics本地分支。要删除它,请确保您没有删除它(您不会,它会以*作为前缀,这只是一般的第一步),然后使用{{ 1}}删除它。

[编辑以说明有关git branch -d发生的事情的编辑评论:如果Git抱怨本地分支未完全合并,Git会尝试告诉您那里可能是您将失去访问权限的某些提交,这些提交不会保存在其他任何地方。如果这样可以 - 如果你真的想放弃它们,或者你是想保留它们但是非常确定它们是安全保存的某处 - 你可以告诉Git强制删除,使用git branch -dgit branch -D。这指示Git忽略可能被放弃的提交。 结束修改]

git branch --delete --force的内容是告诉某些远程站点的其他 Git删除他的本地分支。在其他网站上发生的事情一般不会影响您当地的东西。有一些例外情况 - 特别是push --deletegit fetch 可以进行本地更改 - 但默认情况下,根本不会影响任何本地分支,无论其成功与否让其他一些Git去做。

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

答案 1 :(得分:1)

这是一个单独的答案,部分是因为我可以进行一些格式化,也因为我们现在似乎在讨论不同的存储库和/或分支。

从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

https://应该完成这项工作,但至少在某些版本的Git中,这已经被打破了一段时间。

1 当然,假设您拥有写入权限,并且正在使用ssh://alignas。对我来说都不是,所以我不能。

本地分支,位于您的存储库

您可能在您的存储库中拥有本地分支alignas。我还没有它,但是在你从GitHub中删除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

现在我有那个分支:

origin/alignas

这是我目前的分支。假设我想从我的存储库副本中删除它(同时单独留下$ git checkout master Switched to branch 'master' Your branch is up-to-date with 'origin/master'. ):

$ 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不会让我删除我站在的分支机构)

alignas

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

让我再次创建本地$ git checkout alignas Branch alignas set up to track remote branch alignas from origin. Switched to a new branch 'alignas' ,然后再次强行删除它:

origin/alignas

这和以前一样:我的Git使用远程跟踪分支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

同样,我必须离开它,然后我可以删除它。一旦我在本地删除它,我就不小心推它(见下文)。

其他人

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

从GitHub删除git push origin alignas后的任何时候,Fred都可以重新创建它。他所要做的就是git push origin --alldeclare var jsfeat: any; ,然后又回到GitHub上。

要阻止它,你必须阻止弗雷德。 : - )

答案 2 :(得分:0)

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