我在分支 branch
上从事我的项目。然后我使用
git revert tag-name
然后我取得了一些进展并做出了 promise 。当我尝试推送时出现此错误:
Updates were rejected because the remote contains work that you do not have locally
我不想丢失恢复前的进度,但想从 branch
中删除之后所做的提交,将它们保留在 1.00.00rcXX
下以供将来引用标签。
我创建了存储库的克隆,标记为 branch
的 head在那里,然后倒带 branch
到恢复提交:
git tag -a 1.00.00rcXX -m message
git reset --hard HEAD~1 # remove last commit from current branch
现在我想强制将我的更改推送回我的原始存储库,因此所有在 branch
之前的提交将会丢失。
我的标签也会丢失吗,因为它基于从 branch
无法访问的提交?
最佳答案
无法访问和垃圾收集
只有真正无法访问的提交才能被垃圾收集,从而永远丢失。
引用man gitglossary
:
unreachable object
An object which is not reachable from a branch, tag, or any other reference.
只要标签存在,它链接到的历史记录部分就被认为是可访问的,因此不会被垃圾收集。该标签使这些提交保持“活跃”。
推送标签和强制推送分支是安全的
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
关于git - 从任何分支都无法访问的标记引用提交是否会丢失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25938411/