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 -D
或 git branch --delete --force
。这指示 Git 忽略可能被放弃的提交。 结束编辑]
push --delete
的东西是告诉一些 other Git,在一些远程站点,删除 his[=40= 】 当地分公司。一般而言,其他网站上发生的事情不会影响您当地的东西。有一些例外——特别是 git fetch
和 git 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 --prune
或 git 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 alignas
或 git push origin --all
,它会在 GitHub 上返回。
要阻止它,你必须阻止 Fred。 :-)
以下解决方案帮助了我:重写命令,但使用 -D 标志 git branch -D your_branch
我有一个名为 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 -D
或 git branch --delete --force
。这指示 Git 忽略可能被放弃的提交。 结束编辑]
push --delete
的东西是告诉一些 other Git,在一些远程站点,删除 his[=40= 】 当地分公司。一般而言,其他网站上发生的事情不会影响您当地的东西。有一些例外——特别是 git fetch
和 git 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 --prune
或 git 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 alignas
或 git push origin --all
,它会在 GitHub 上返回。
要阻止它,你必须阻止 Fred。 :-)
以下解决方案帮助了我:重写命令,但使用 -D 标志 git branch -D your_branch