Git:提取后从不相关的存储库中删除更改或如何修复 "warning: no common commits"?

Git: strip changes from unrelated repository after fetch or how to fix "warning: no common commits"?

我用

$ git remote show origin 
* remote origin
  Fetch URL: git://gitorious.org/bash/bash.git

但是自 2011 年以来没有任何新变化。所以我 google 官方来源在哪里:http://savannah.gnu.org/git/?group=bash

我决定制作新的原点:

$ git remote rename origin gitorious
$ git remote add origin git://git.savannah.gnu.org/bash.git

fetch 最新更改以便比较发生的情况 (git log master..origin/master):

$ git fetch origin 
warning: no common commits
remote: Counting objects: 23368, done.
remote: Compressing objects: 100% (3449/3449), done.
^Cceiving objects:   8% (1895/23368), 8.51 MiB | 478.00 KiB/s    

在我看到 warning: no common commits 之后,我中断了获取并徘徊了如何从本地存储库中删除这些不相关的获取更改(我知道我需要清理 clone)。

我更喜欢 hg 并且它总是抱怨不相关的存储库,除非你 -f.

这只是一个警告。将有两个不相关的提交树(例如 gitk 将它们可视化为不相关的,一个接一个),但除此之外没有其他差异,所有 git 命令(diffmergecherry-pick 等)继续按预期工作。

对于clear/hide不需要的修改,您可以简单地删除对它们的引用,这是整个git的通用规则。对于第二个远程存储库,这意味着您需要删除适当的 remote: git remote rm origin。您还可以在 .git/refs/remotes/<remote-name>.git/packed-refs.

中手动删除引用

一旦引用被删除,存储库中的相应对象最终将被删除并 space 被回收。您也可以 运行 git gc 手动。

如果你想完全丢弃以前的遥控器,你可以简单地删除它:

git remote remove <remote-name>

不过,这只是删除远程条目和远程跟踪分支标签。让我展示一个(非常)简化的示例,两个遥控器有两个不相关的提交 DAG,加上您自己的本地更改。让我们将两个遥控器称为 rmt1rmt2(一个现在可能实际上是 gitorious,另一个 origin,但我想概括一下):

           L     <-- master
         /
A0 <- A1 <- A2     <-- rmt1/master

B0 <- B1 <- B2 <- B3   <-- rmt2/master

A 提交代表您从远程 rmt1 带来的所有内容(您最初拥有的远程,现在可能 gitorious)。在这里你 有一个本地提交 L 对你从 rmt1 得到的东西做了一些更改,你刚刚添加了远程 rmt2 并带来了它的提交图(B 提交)。

如果您现在 运行 git remote remove rmt1,git 删除配置行,还有 rmt1/master 标签。这是你剩下的,不包括已经不可见但没有被垃圾收集的提交:

           L     <-- master
         /
A0 <- A1

B0 <- B1 <- B2 <- B3   <-- rmt2/master

这里的问题是您自己的本地更改(提交 L)使用并因此保留了至少一些原始提交图 — A 系列提交。

据推测,您想要做的是找到部分或全部 不是 rmt1 提交的本地提交,看看您做了哪些更改想要保留并找到一些合适的提交,以在 B 系列提交中基于这些更改。如果只有一个本地提交,就像在这种情况下,那很容易;但如果有很多,您必须决定要保留哪一个。

在很多情况下,您现在有一个或两个积极使用的分支,而这些分支的尖端是您想要保留的。在这种情况下,您可以简单地保存旧的 git 存储库,通过克隆 B 系列(在本例中来自 git.savannah.gnu.org)来创建一个全新的 git 存储库,并在新的回购协议中选择一些分支,您将在其中移植您的活动分支提示。在这里,您只需使用保存的存储库来提取补丁(例如 git diff 或 git format-patch),然后将它们导入新存储库。这在概念上要简单得多。

不过,在其他情况下,您可能确实希望将两个远程存储库的内容保存在一个存储库中,至少保留一段时间,直到您可以变基或以其他方式保留您的更改。这是保留和复制两组 DAG 的便捷方法,它允许您在任一(独立)图中的提交上使用 git 命令,包括比较一个图中的树与另一个图中的树。它在概念上更复杂,并且是您目前前进的方向。

在不了解您的情况的情况下,我真的无法推荐一种或另一种方法。