是否会丢失任何分支无法访问的标记引用提交?

时间:2014-09-19 16:25:23

标签: git git-push git-tag

我在我的项目上工作,在branch分支上。然后我使用

恢复
git revert tag-name

然后我做了一些进展并承诺。当我试图推动时,我得到了这个错误:

  

更新被拒绝,因为遥控器包含您所做的工作   没有本地

我不希望在还原之前丢失我的进度,但希望从branch之后的提交中删除,保留它们以供将来参考1.00.00rcXX标记。

我创建了一个存储库的克隆,在那里标记了branch的头部,然后将branch倒回到恢复提交中:

git tag -a 1.00.00rcXX -m message
git reset --hard HEAD~1 # remove last commit from current branch

现在我想强制将我的更改推送回原始存储库,因此branch之前的所有提交都将丢失。

我的代码也会丢失,因为它基于branch无法访问的提交吗?

1 个答案:

答案 0 :(得分:3)

无法收集和垃圾回收

只有真正无法访问的提交才能被垃圾收集,因而永远丢失。

引用man gitglossary

  

无法访问的对象

     

无法从分支,标记或任何其他引用访问的对象。

只要标记存在,它链接到的历史部分就被认为是可达的,因此不会被垃圾收集。标签使这些提交保持“活着”。

推动标签并强制推动分支是安全的

Git试图阻止您在任何分支中进行非快进更改。您必须将-f选项传递给git push以在重置(倒带)分支后执行推送。如果你记住implications of overwriting history,你可以推动引用分支原始状态的标签和分支的新头部,你将不会失去任何东西。

跑吧:

git push --tags
git push -f origin your-rewound-branch

更好地使用分支而不是标记

顺便说一句,使用标签来表示这样的事情可能不是一个好主意。可能你有一天会想要删除开发历史的那个死胡同部分,你不应该用标签来删除它。使用分支(头部)而不是标签更适合于此目的。只需使用(可能使用更具描述性的名称)

git branch 1.00.00rcXX

而不是

git tag -a 1.00.00rcXX -m message