繁体   English   中英

从 git 存储库中删除分离的分支

[英]Remove detached branches from git repository

我玩了另一个名为tmp的遥控器。 我添加了遥控器并推送了分支masternew-branch 然后我删除了tmp遥控器。

现在分支tmp/mastertmp/new-branch已分离。 我不再需要它们了。 我如何将它们连同它们的提交一起删除?

这是我的回购协议上的图表:

* a856b8c - (HEAD -> master, tag: abc, origin/master) Update                                                                                                                                                                                                  
| * 8a142e4 - (tmp/master) Update                                                                                                                                                                                                                             
|/                                                                                                                                                                                                                                                            
| * 5d43564 - (tmp/new-branch) New commit                                                                                                                                                                                                                     
| * f9f33d9 - New commit                                                                                                                                                                                                                                      
| * 9869631 - New commit                                                                                                                                                                                                                                      
| * 03cdb15 - New commit                                                                                                                                                                                                                                      
| * 7a24a77 - Test                                                                                                                                                                                                                                            
|/                                                                                                                                                                                                                                                            
* 97b8dcd - Skip lines

所以我想从 repo 的历史记录中删除提交:8a142e4、5d43564 等等。

采用:

git remote remove tmp

(如果你愿意,你可以停在这里;rest 只是评论)。 如果因为tmp消失而拒绝运行,请使用git remote add tmp https://any.url.here然后git remote remove tmp

还不完全清楚你用“分离分支”这个词的意思。 但是,您确实有一个标签 ,我剪掉了它,因为它与此特定设置无关。 这些不是“分离的 HEAD”案例。 相反,这些只是陈旧的名称。

这里重要的一件事是这些(大概)是远程跟踪名称,或者 Git 称它们为远程跟踪分支名称。 这意味着git branch -delete不会解决问题,但git branch -r --delete会(尽管正如SebDieBln 在评论中指出的那样,您还需要--force )。

Git 中的remote只是一个名称,如origin或在您的情况下为tmp ,我们使用它来让 Git 能够通过名称引用其他一些 Git 存储库,而不必输入一些冗长乏味的 URL反复。 但除了存储 URL 之外,遥控器的存在还提供了另一种能力:

  • 每个存储库都有自己的分支名称。
  • 这些分支名称中的每一个都存储一 (1) 个提交 hash ID。

名称存储 hash ID 的事实为我们和 Git 提供了一种查找提交 hash ID 的简单方法,这通常是我们查找提交的第一种方式:通过某个名称。 (第二种方法是找到一个提交——通常是通过一个名字——然后从那里向后工作到更早的提交,第三种方法是通过某种方式神奇地知道 hash ID,也许是因为我们之前在git log中看到了它,这使用了第二种方法。)

但总的来说,我们无法一直访问其他Git 存储库中的名称。 我们必须运行git ls-remote或一些类似的命令来找到 hash ID 和 go及其分支名称。 在古代(2005 年初),人们确实做过这种事情。 这很快就变得非常乏味,就像输入长 URL 一样,所以 Git 被教导不仅要通过这些遥控器保存 URL,还要保存它们的分支名称和 hash ID。 因此,如果您有一个名为origin的远程服务器,而他们,无论他们在origin的谁,都有一个名为xyzzy的分支,您最终会在您的存储库中得到一个origin/xyzzy

这些远程跟踪名称本质上用作 Git 存储库记住其他 Git 存储库中的分支名称的一种方式。 这就是他们存在的理由。 git fetch命令构建这些远程跟踪名称,创建它们并在有机会时更新它们。 git push命令也会在成功推送时更新名称。请注意, git pull意味着运行git fetch ,然后运行第二个 Git 命令,它是更新远程跟踪名称的 pull 的 fetch 步骤。)

git remote命令通常是面向用户的命令,用于操作像origin或(这里) tmp这样的遥控器。 git remote add添加一个新的遥控器。 git remote remove删除远程,并且由于远程跟踪名称代表远程存在,因此它也会删除远程跟踪名称。 1个

最后的:

所以我想从 repo 的历史记录中删除提交:8a142e4、5d43564 等等。

删除 Git 找到那些 hash ID 的名称将阻止提交显示在git log中,但实际上不会删除提交。 如果您记住他们的 hash ID 并将它们提供给 Git,您很可能仍然可以通过他们的 hash ID 访问这些提交至少 30 天,也许 90 天或更长时间。

通常,删除名称就足够了,这样您就不会再看到提交了。 如果不是,好吧,真正删除提交实际上相当困难——不是不可能,但不容易,而且这些方法并不真正属于这个答案,所以我会在这里停下来。


1依稀记得在某个很早的Git版本中, git remote remove并没有删除对应的remote-tracking names。 但是,这些版本的 Git 现在应该不再使用了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM