在svn中,我经常会删除包含我不再感兴趣的作品的分支,如果我真的需要的话,我可以在以后的任何时候恢复这些分支。
在git中,似乎这是不可能的。这意味着我现在在'git branch -a'中有大约50个分支,我不希望再次使用它,但不想永远失去它们。
git是否真的没有办法以版本控制的方式删除分支?没有听起来反git,为什么git设计所以几乎需要(在我看来)抛弃旧的分支,以这种方式无法恢复?这不符合版本控制的想法。
答案 0 :(得分:3)
一种可能性是为要归档的分支创建标记,然后可以删除分支。
git tag -a <tagname> <branchname>
然后,如果您想恢复分支,可以从标记创建一个新分支。
git checkout -b <branchname> <tagname>
它还可能有助于为标记开发命名方案,以便所有存档的分支标记位于标记列表的顶部或底部。
答案 1 :(得分:3)
我有时做的一件事是用前缀重命名分支:
git branch -m foo old/foo
您可以做的另一件事是将要保存的分支机构推送到另一个裸Git存储库以便妥善保管,然后在本地存储库中删除它们:
git remote add archive /path/to/archive/repo.git
git push archive foo
git branch -D foo
答案 2 :(得分:3)
您可以为git使用的常规命名空间之外的分支头创建引用。这会阻止git branch
列出分支,但会确保该分支的提交不会被垃圾收集,并且如果您以后决定实际需要它,仍会提供一个名称来取回该分支。
git update-ref refs/attic/old_topic_branch old_topic_branch
git branch -D old_topic_branch
此阁楼空间中的分支可以列出:
git for-each-ref refs/attic
可以通过以下方式恢复分支:
git checkout -b old_topic_branch refs/attic/old_topic_branch
但是如果您计划在任何时候放弃旧存储库(例如移动到新计算机),您仍然需要小心将这些引用移动到新的存储库,因为这些引用在克隆时不会被复制存储库。
答案 3 :(得分:1)
另一种可能性是简单地重命名“死”分支,可能与“命名空间”一起使用。例如,如果我不再需要分支topicbranch42
,但我将来可能需要它以供参考,只需这样做:
git checkout master # or any other branch that isn't topicbranch42
git branch -m topicbranch42 deprecated/topicbranch42
这样,你保留了所有的分支,但是他们的名字提供了一个非常明确的指标,他们没有积极开发/使用
答案 4 :(得分:0)
我今天早上才意识到对此的正确答案:
<。> .git / refs下的所有内容都是引用,因此不会被修剪,但只有refs / heads是分支,refs / tags是标签等等。所以只需将分支分流到“archive”引用目录。 真正的暴力方法只是mkdir -p .git/refs/archive/heads; mv .git/refs{,/archive}/heads/master
,它将踩踏该分支的任何以前存档的版本;这是一个更彻底的版本:
#!/bin/sh
# archive a branch, by committing it to .git/refs/archive/heads/
# to unarchive the branch, say 'git branch mybranch archive/heads/mybranch~'
# ---- NOIICE the parent link in the branch command above ----------------/
# any second parent of the archive ref is the previous archive header commit
getopts x x && set -x -v && shift
while test $# -ne 0; do
branch="refs/heads/$1"
archive="refs/archive/heads/$1"
git rev-parse -q --verify "$branch" >&- \
|| { echo >&2 archive-branch ignored nonexistent branch: $1; shift; continue; }
previously=`git rev-parse -q --verify "$archive"`
git mktree </dev/null | xargs git commit-tree \
-p "`git rev-parse "$branch"`" \
${previously:+ -p $previously} \
-m "Parent is the archived tip of branch '$1'" \
${previously:+ -m 'Second parent is the previous commit like this one.'} \
> "`git rev-parse --git-dir`/$archive"
rm "`git rev-parse --git-dir`/$branch"
shift
done
答案 5 :(得分:-1)
删除git分支只会删除引用提交的标签
只要您在某处写下哈希值,就可以运行git checkout <commit-hash>
来恢复已删除的分支。
运行git gc
将永久删除这些孤立的提交。