应该.git包含所有文件吗?我该如何解决问题?

时间:2014-09-22 13:40:09

标签: git history git-checkout

我有一个.git目录的普通副本备份。我没有备份中.git目录之外的实际文件(git status表示将在提交时删除所有文件),只有实际的.git目录。

当我git checkout master时,我会得到大约一半应该存在的文件。我的印象是这应该重新创建所有项目文件。

这是否意味着git历史中的某个地方存在错误?某些文件更改明显无法解析为完整文件。如果我从包括文件在内的完整项目中获得备份,我如何“修复”我的历史记录以确保它包含所有内容?

我不是git-pro,但是解压缩到空目录的备份当前位于功能分支中。因此,根据git status,如果我执行git commit,将删除一百万个文件。我估计做git checkout master会给我空目录中最新主提交中的所有文件。

3 个答案:

答案 0 :(得分:1)

不知道为什么有一半文件丢失,但你可以试试:

git clone .git /path/to/new/repo

然后你会欺骗git相信它是一个裸存储库,并从它克隆到/path/to/new/repo,其中master将被检出。

在您的修改中 自上次提交以来的修改不会保留在一个分支上。例如,在您的情况下,git status显示所有文件都被删除,更改分支然后不会"保持"这个更改在那个分支上,但是这些更改会带给你结账的下一个问题,除非你先把它藏起来。

考虑这个例子:

git init gittest
cd gittest
echo "First commit" > a
git status
   Untracked files:
      a

git add a
git commit -m "Initial commit"
git branch test
git checkout test
echo "Editing a" >> a
git status
   modified: a
git checkout master
M      a
Switched to branch 'master'
git status
   modified: a
cat a
First commit
Editing a

这里我在master中工作并提交第一个提交,然后更改分支以进行测试,编辑a,然后移回master,看看,更改是保留的!这就是您所发生的事情,在您的功能分支中,所有文件都被删除,当您签出master时,您也会将这些更改(删除的文件chanes)带到master。

你知道吗?这是一个有点混乱的解释,但希望你明白。

如果您想取消删除文件,可以使用以下答案How do I revert all local changes in Git managed project to previous state?中描述的内容:

git checkout .
git reset
# vìola

答案 1 :(得分:1)

更好更安全的选择是:

  1. 将.git dierctory的内容复制到新目录中

  2. cd进入新目录并运行git config --bool core.bare true 这将使新目录成为一个简单的仓库

  3. 现在运行git clone <URL-To-Bare> <New-repo>

  4. 希望它能解决问题!

答案 2 :(得分:1)

Git stash会撤消工作副本上的所有更改(包括已删除的&#39;文件)将您的文件全部恢复为工作副本

git stash

同样的结果就像你使用&#34; git clone&#34;再次

在此之后,如果要删除最近创建的存储,可以执行以下操作:

git stash drop stash@{0}

我不建议删除藏匿物,因为您最初不知道何时需要藏匿信息,因为藏匿物并没有真正占用太多空间(在同一结构中内部表示的藏匿处)作为提交对象)