我有一个名为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。
答案 0 :(得分:6)
TL; DR:以任何顺序使用(至少)两个命令。删除本地(和/或远程跟踪,也是本地的)。删除远程。
在您的输出中,atomics
是本地分支。要删除它,请确保您没有删除它(您不会,它会以*
作为前缀,这只是一般的第一步),然后使用{{ 1}}删除它。
[编辑以说明有关git branch -d
发生的事情的编辑评论:如果Git抱怨本地分支未完全合并,Git会尝试告诉您那里可能是您将失去访问权限的某些提交,这些提交不会保存在其他任何地方。如果这样可以 - 如果你真的想放弃它们,或者你是想保留它们但是非常确定它们是安全保存的某处 - 你可以告诉Git强制删除,使用git branch -d
或git branch -D
。这指示Git忽略可能被放弃的提交。 结束修改]
git branch --delete --force
的内容是告诉某些远程站点的其他 Git删除他的本地分支。在其他网站上发生的事情一般不会影响您当地的东西。有一些例外情况 - 特别是push --delete
和git fetch
可以进行本地更改 - 但默认情况下,根本不会影响任何本地分支,无论其成功与否让其他一些Git去做。
您可能还需要git push
来删除您的远程跟踪分支(尽管名称是您的存储库的本地名称)。您可以使用git fetch --prune origin
(本地删除远程跟踪分支git branch -r -d origin/atomics
)。
答案 1 :(得分:1)
这是一个单独的答案,部分是因为我可以进行一些格式化,也因为我们现在似乎在讨论不同的存储库和/或分支。
我首先克隆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删除此分支,即使至少有一个提交会丢失,您 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
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 --all
或declare var jsfeat: any;
,然后又回到GitHub上。
要阻止它,你必须阻止弗雷德。 : - )
答案 2 :(得分:0)
以下解决方案对我有帮助:重写命令,但使用 -D 标志 git branch -D your_branch