从 git 中的“无分支”中拯救文件和提交

从 git 中的“无分支”中拯救文件和提交

我开始处理另一个项目下 git 子模块中的一些文件。但是,由于它是一个 git 子模块,因此它从未签出“master”,而是只签出 head 并将文件夹中的所有文件放在“无分支”中。

现在,我意外地对这些文件做了一些更改,我刚刚意识到我正在项目的“无分支”子模块中工作。

我如何将这些文件放入分支(例如 master)以便我可以拯救它们?

答案1

您可以使用git reflog来查找“丢失”的提交:

$ cd submodule_dir
$ git reflog          # Find the commit
$ git checkout master
$ git cherry-pick $SHA_OF_MISSING_CMMIT

答案2

“无分支”状态称为分离 HEAD。之所以这样称呼,是因为 HEAD 引用未附加到任何分支,而是直接指向提交。要将 HEAD 附加到指向当前 HEAD 提交的分支,请使用git checkout -b branchname

您可以安全地更新现有分支以包含 HEAD 中的提交,顺序如下:

git branch temp
git checkout branchname
git merge temp
git branch -d temp

或者,等效地,使用 reflog 符号HEAD@{1}来避免创建临时分支:

git checkout branchname
git merge HEAD@{1}

如果您不打算立即进行合并,使用临时分支将是一个好主意。

如果你想强制覆盖现有分支以指向 HEAD 处的提交,你可以使用git branch -f branchname && git checkout branchname。如果 HEAD 处的提交不是基于当前提示的分店名称这将导致非快进变化分店名称您通常希望避免这种情况(它被视为重写历史)。

答案3

补充一下之前的答案:

当你仍然处于分离的 HEAD 上时,你可以添加一个标签:

git tag <some-tag>

这将添加标签提交后,这将使其在gitk和其他工具中可见。

相关内容