删除/隐藏git分支而不删除提交历史记录

syn*_*tik 25 git git-branch git-branch-sculpting

情况:

我有一个主要的回购,主要的开发分支和许多"实验"分支从它发芽(例如,exp1exp2).这些实验分支的目的是作为产生数值结果的实验​​的占位符.我记录了实验分支的分支名称(和提交ID),因此我可以返回到提交,以准确查看结果背后的代码和历史记录.

但是,现在,有很多实验分支,很难看到主树.所以,我正在重新思考将占位符保留在每组结果背后的代码(即每个实验)的策略.显然我可以在每个分支保存工作目录,但保留提交历史记录也会很好.

可能的方法:

解决此问题的一种方法是将实验分支移动到它们自己的独立存储库中,每个存储库都以dev分支的提交历史记录中的相应节点的子节点为根.这是我的意思的说明:

在此输入图像描述

点击此处查看大图版本(在imgur.com上).

因此,例如,对于分支exp1,我想将提交导出A->B->C到以提交为根的单独repo A.然后,我可以记录提交的哈希值,P1以便我知道exp1分支的后果.

题:

我怎样才能做到这一点?

更好的问题:

另一方面,我强烈怀疑有一个更好的策略来做我想做的事情 - 即,整理树进行目视检查,但将占位符保留在先前的分支中,以便我可以在需要时返回它们.那么,任何人都可以为此推荐一个策略吗?

tor*_*rek 19

这里有一个替代方法:在删除分支名称之前使用非分支引用来保存分支提示.

由于这些是非分支引用,因此它们不会显示在git branch输出中,也不会显示在例如git log --branches和所示的内容中gitk --branches.但是,它们将显示在--all列表中,并将保留存储库对象.

要创建或更新非分支引用,请使用git update-ref.选择一个refs/您认为不会与未来使用相冲突的名称空间(当前refs/heads/用于分支,refs/tags/标记,refs/remotes/远程分支,refs/notes/注释和refs/stash存储).

  • @ manu3d:只需创建指向所需提交的分支.请记住,任何普通的分支名称(在此类"归档"之前或之后)只是指向某个特定的提交ID,我们称之为"分支的尖端".因为ref,比如`refs/archive/foo`**也指向某个特定的提交ID,你可以简单地执行`git checkout -b restored refs/archive/foo`来创建新的分支`restored`(`refs/heads/restored`)指向该提交.是什么使它成为一个分支是它的名字在`refs/heads /`.一旦它是*current*分支,Git将自动更新它. (7认同)
  • 我明白了,所以这是一个所谓的管道命令,它允许你基本上任意创建(更新)引用.而`heads`,`tags`,`remotes`,`notes`和`stash`实际上只是在git中具有标准公认含义的引用的命名空间.对? (4认同)
  • 如果所有"归档分支"都列在`refs/archive /`下,请使用`git for-each-ref refs/archive`来显示它们(注意`git for-each-ref`有很多参数,包括格式控制其输出的指令).如果你选择了其他一些名称空间,你需要的东西至少略有不同.我不确定这里的答案是否需要进一步阐述; 人们也可以阅读评论.:-) (3认同)
  • 啊,哈!谢谢.那么,这个命令应该足够好了吗?`git update-ref refs/archive/run/diss-001 origin/run/diss-001` (2认同)
  • 是.只是展望未来,看看5年后你想要使用的任何命令或实用程序是否也试图使用`refs/archive /`name-space.:-)(似乎不太可能,但5年前,谁会知道`refs/notes /`会被使用?) (2认同)
  • @DmitryPetrov:它们可能无法推送(这取决于接收 Git 允许的引用规范),但如果您使用的引用命名空间是“refs/archive/”,则只需“git fetch --prune <remote>”例如,“+refs/archive/*:refs/archive/*”,用其他 Git 中的名称覆盖您自己的所有 `refs/archive/*` 名称。请注意,这将删除您拥有的任何“refs/archive/*”名称,但它们没有,因此如果不好,请不要使用“-p”;或者,接收到不同的命名空间,或者限定“refs/archive/”下的名称,或者您想要的任何内容。 (2认同)
  • @Dave:是的,*前提是*接收 Git 允许。每个 Git 实现都可以对非标准命名空间设置自己的限制。例如,GitHub 不会让你创建“refs/pull/”名称:他们将这些名称保留给自己。Gerrit 服务器保留 `refs/for/`:它们让你推送到那里,但这些名称是“魔法”的,会导致特殊操作,然后消失。 (2认同)
  • 你必须 `git fetch origin "refs/archive/*:refs/archive/*"`,和以前一样,它依赖于服务器的配合。*默认* fetch refspec(带有 `git fetch`)位于您的 Git 配置中;运行“git config --get-all remote.origin.fetch”以查看名为“origin”的远程设备。 (2认同)