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

标签 git git-push git-tag

我在分支 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/

相关文章:

Visual Studio 2013 中的 Git 远程操作导致错误 "A specified logon session does not exist. It may already have been terminated"

ruby-on-rails - Gemfile 语法错误 : <<<<<<< HEAD when trying to start localhost

linux - git --- 如何在 linux 上安排 `git push`?

git - 交互式 rebase 后查找原始 git 提交哈希

git - 无法推送到 git 存储库。它卡在 "Writing Objects: 100%"之后

git - 对 github 上的提交感到困惑

git - 验证是否在 master 分支中完成了标记

git - 从 Git 存储库中删除所有标签

git - 获取没有提交哈希的 git 标签

git - Jenkins 使用 Publish over SSH 插件传输 0 个文件