从git中的“ no branch”抢救文件和提交


11

我开始处理另一个项目下git子模块中的某些文件。但是,由于它是git子模块,因此它从未检出“ master”,而只是检出了磁头并将所有文件放在“ no branch”的文件夹中。

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

如何将这些文件放入一个分支(如master)中,以便进行抢救?

Answers:


28

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

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

是的,这很棒!除了我git merge $COMMIT_SHA曾经在另一个分公司做过一次。
Xeoncross'3

3

“无分支”状态称为分离的HEAD。之所以这样称呼,是因为HEAD ref未附加到任何分支,而是直接指向提交。要将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的提交不基于分支名称的当前提示,则将导致您通常要避免的对分支名称的非快进更改(被视为重写历史记录)。


请注意,此答案假设HEAD仍指向分支上的最后一次提交。如果您从那时起就移动了HEAD,直到现在才意识到发生了什么,您可能需要在reflog中查找丢失的提交(请参见mipadi的答案)。
LarsH

1

要添加到以前的答案:

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

git tag <some-tag>

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.