Answers:
我相信执行此操作的正确方法是标记分支。如果您在标记了分支之后删除了该分支,则可以有效地保留该分支,但不会使分支列表混乱。
如果您需要返回分支,只需签出标签即可。它将有效地从标签恢复分支。
要归档和删除分支:
git tag archive/<branchname> <branchname>
git branch -d <branchname>
要在以后恢复分支:
git checkout -b <branchname> archive/<branchname>
分支的历史记录将与标记时的历史记录完全一样。
git checkout -b <branchname> archive/<branchname>
branch -D因为如果以这种方式进行归档,则可能无法完全合并
杰里米的回答原则上是正确的,但是恕我直言,他指定的命令不太正确。
以下是将分支归档到标签而无需检出分支的方法(因此,在删除该分支之前不必检出另一个分支):
> git tag archive/<branchname> <branchname>
> git branch -D <branchname>
这是还原分支的方法:
> git checkout -b <branchname> archive/<branchname>
是的,您可以使用创建带有一些非标准前缀的引用git update-ref。例如
git update-ref refs/archive/old-topic topic && git branch -D topicgit branch topic refs/archive/old-topic带有非标准前缀(此处refs/archive)的引用不会出现在通常的上git branch,git log也不会出现git tag。不过,您可以使用列出它们git for-each-ref。
我正在使用以下别名:
[alias]
add-archive = "!git update-ref refs/archive/$(date '+%Y%m%d-%s')"
list-archive = for-each-ref --sort=-authordate --format='%(refname) %(objectname:short) %(contents:subject)' refs/archive/
rem = !git add-archive
lsrem = !git list-archive
另外,您可能需要配置遥控器,例如push = +refs/archive/*:refs/archive/*自动推送存档的分支(或git push origin refs/archive/*:refs/archive/*单次推送)。
另一种方法是在删除分支之前在某个位置记下SHA1,但这有其局限性。没有任何参考的提交将在3个月后(或几周没有reflog)进行GC处理,更不用说手动了git gc --prune。由refs指向的提交对于GC是安全的。
编辑:通过@ap找到相同想法的perl实现:git-attic
编辑^ 2:找到一个博客帖子,其中Gitster自己使用相同的技术。
这是一个别名:
arc = "! f() { git tag archive/$1 $1 && git branch -D $1;}; f"
像这样添加它:
git config --global alias.arc '! f() { git tag archive/$1 $1 && git branch -D $1;}; f'
请记住,git archive已经有命令,因此您不能将其archive用作别名。
您还可以定义别名以查看“已存档”分支的列表:
arcl = "! f() { git tag | grep '^archive/';}; f"
我不会存档分支。换句话说,分支机构将自己存档。您想要的是确保可以通过可靠的方式找到与考古学家有关的信息。可靠的是,它们有助于日常开发,并且不会在完成工作的过程中增加额外的步骤。也就是说,我不相信人们在完成分支后会记得添加标签。
这两个简单的步骤将极大地帮助考古和开发。
git merge --no-ff合并任务分支;您想要合并提交和历史记录气泡,即使只是一次提交。而已。为什么?因为作为代码考古学家,我很少要开始了解分支上的工作。远东更多的时候它就是为什么在所有的尖叫九层地狱的代码写成这样?我需要更改代码,但是它具有一些奇怪的功能,并且我需要使它们困惑以免破坏重要的东西。
下一步是git blame找到关联的提交,然后希望日志消息可以解释。如果需要更深入地研究,我将找出工作是否在分支中完成,并整体阅读分支(以及问题跟踪器中的注释)。
比方说git blame提交XYZ。我打开一个Git历史记录浏览器(gitk,GitX git log --decorate --graph等),找到XYZ提交并查看...
AA - BB - CC - DD - EE - FF - GG - II ...
\ /
QQ - UU - XYZ - JJ - MM
有我的分店!我知道QQ,UU,XYZ,JJ和MM都是同一个分支的一部分,我应该查看它们的日志消息以了解详细信息。我知道GG将是合并提交,并具有希望与跟踪器中的问题相关联的分支的名称。
如果由于某种原因,我想找到一个旧的分支,可以运行git log并在合并提交中搜索分支名称。即使在非常大的存储库上,它也足够快。
这就是我说分支机构自己存档时的意思。
标记每个分支会增加不必要的工作来完成工作(这个关键过程应该无情地简化),用数百个仅偶尔有用的标记来标记列表(不是说性能,而是人类可读性),并且是“在考古学中甚至非常有用。
我的方法是使用“ trash_”前缀重命名所有我不在乎的分支,然后使用:
git branch | grep -v trash
(带有外壳键绑定)
要保留活动分支的颜色,需要:
git branch --color=always | grep --color=never --invert-match trash
您可以使用脚本来为您存档分支
它使用前缀archive /为您创建一个标签,然后删除该分支。但是在使用之前请检查代码。
用法- $/your/location/of/script/archbranch [branchname] [defaultbranch]
如果要运行脚本而不写位置,则将其添加到路径中
那你可以打电话给
$ archbranch [branchname] [defaultbranch]
的[defaultbranch]是,它会去当归档完成分支。颜色编码存在一些问题,但其他问题应该起作用。我已经在项目中使用了很长时间,但是它仍在开发中。
git checkout [rev] file