舞台文件,然后远程添加,然后拉 - 我的文件都消失了

时间:2012-04-28 09:51:44

标签: git github

我似乎在一个新的回购中失去了我下午的工作。这是我做的:

  1. 在本地创建了一个新项目并做了一些工作。
  2. 在github上创建了一个回购
  3. git init
  4. git add src
  5. git remote add origin git@github.com:Synesso/memx.git
  6. git pull origin master
  7. git add .gitignore
  8. git commit -m 'updated ignore'
  9. git push origin master
  10. 我的本​​地仓库和github仓库只有两次提交。初始提交(由github在项目创建时创建),第二个提交仅包含文件.gitignore

    步骤4中添加的文件(git add src)不存在。它们似乎也没有上演。

    执行git pull时是否丢失了暂存文件?我可以以某种方式检索它们吗?

    现状:

    $ git status
    # On branch master
    nothing to commit (working directory clean)
    

    我的初始add不在reflog中。

    $ git reflog
    c80135d HEAD@{0}: checkout: moving from 999d128ea4e6969f9eacbceebb5f857f2aa5abb0 to master
    999d128 HEAD@{1}: checkout: moving from master to HEAD~1
    c80135d HEAD@{2}: checkout: moving from 999d128ea4e6969f9eacbceebb5f857f2aa5abb0 to master
    999d128 HEAD@{3}: checkout: moving from master to 999d128ea4e6969f9eacbceebb5f857f2aa5abb0
    c80135d HEAD@{4}: commit (amend): updated ignore
    28b4f90 HEAD@{5}: commit: updated ignore
    999d128 HEAD@{6}: initial pull
    

    history显示我添加了src文件夹,但未提交:

    223  git init
    225  git add src
    229  git add project/Build.scala
    234  git remote add origin git@github.com:Synesso/memx.git
    250  git pull origin master
    

    我知道如果你尝试使用脏文件,git会抱怨。但是做一个会消除分阶段文件的拉动是可以的吗?这似乎不对。


    我刚刚再次测试了这个过程,是的,它会破坏分阶段的文件。

    jem@jem-usb:~/projects$ mkdir x
    jem@jem-usb:~/projects$ cd x
    jem@jem-usb:~/projects/x$ git init
    Initialized empty Git repository in /home/jem/projects/x/.git/
    jem@jem-usb:~/projects/x$ echo "hi" > hello.world
    jem@jem-usb:~/projects/x$ git add hello.world
    jem@jem-usb:~/projects/x$ git status
    # On branch master
    #
    # Initial commit
    #
    # Changes to be committed:
    #   (use "git rm --cached <file>..." to unstage)
    #
    #       new file:   hello.world
    #
    jem@jem-usb:~/projects/x$ ls -asl
    total 24
     4 drwxrwxr-x 3 jem jem 4096 Apr 28 20:56 .
     4 drwxr-xr-x 8 jem jem 4096 Apr 28 20:56 ..
     4 drwxrwxr-x 7 jem jem 4096 Apr 28 20:56 .git
    12 -rw-rw-r-- 1 jem jem    3 Apr 28 20:56 hello.world
    jem@jem-usb:~/projects/x$ git remote add origin git@github.com:Synesso/memx.git
    jem@jem-usb:~/projects/x$ git reflog
    fatal: bad default revision 'HEAD'
    jem@jem-usb:~/projects/x$ git pull origin master
    remote: Counting objects: 7, done.
    remote: Compressing objects: 100% (5/5), done.
    remote: Total 7 (delta 0), reused 3 (delta 0)
    Unpacking objects: 100% (7/7), done.
    From github.com:Synesso/memx
     * branch            master     -> FETCH_HEAD
    jem@jem-usb:~/projects/x$ ls -asl
    total 36
     4 drwxrwxr-x 3 jem jem 4096 Apr 28 20:53 .
     4 drwxr-xr-x 8 jem jem 4096 Apr 28 20:52 ..
     4 drwxrwxr-x 8 jem jem 4096 Apr 28 20:53 .git
    12 -rw-rw-r-- 1 jem jem   59 Apr 28 20:53 .gitignore
    12 -rw-rw-r-- 1 jem jem    9 Apr 28 20:53 README.md
    jem@jem-usb:~/projects/x$ git reflog
    c80135d HEAD@{0}: initial pull
    

    文件hello.world已被删除,但未发出警告。

5 个答案:

答案 0 :(得分:7)

我能够在不使用github的情况下重现这一点,使用两台主机(此处重命名为hostB,即“remote”)和hostA,即“本地”:

hostB$ cd /tmp; mkdir repo; cd repo; git init
Initialized empty Git repository in /tmp/repo/.git/
hostB$ : > .gitignore; echo this is a readme > README.md
hostB$ git add .; git commit -m initial
[master (root-commit) 58d43bd] initial
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 .gitignore
 create mode 100644 README.md

hostA$ cd /tmp; mkdir repo; cd repo; git init
Initialized empty Git repository in /tmp/repo/.git/
hostA$ echo hi > hello.world
hostA$ git add hello.world
hostA$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   hello.world
#
hostA$ git remote add origin ssh://hostB.dom.ain/tmp/repo
hostA$ git pull origin master
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 4 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (4/4), done.
From ssh://hostB.dom.ain/tmp/repo
 * branch            master     -> FETCH_HEAD
hostA$ ls
README.md

重要提示:您可以使用git fsck --lost-found恢复已暂存的文件:

hostA$ git fsck --lost-found
Checking object directories: 100% (256/256), done.
dangling blob 45b983be36b73c0788dc9cbcb76cbb80fc7bb057
hostA$ 

果然,如果你检查blob(现在在.git/lost-found/other中恢复),那些将会丢失你的东西。 (任何目录结构都会消失,你必须弄清楚哪个文件是哪个,并将它们重新放在你想要的位置。)

有趣的是,如果你git fetch origin后跟git merge origin/master,它会抓取来源的初始版本(在这种情况下使用来自hostB的.gitignore和README.md文件)并保留你的“要提交的更改“。支持git fetch后跟git merge的另一个原因是什么? : - )

答案 1 :(得分:4)

我在Junio Hamano的git邮件列表上收到了以下回复:


这是一个意想不到的角落案件,干扰了我们的尝试 适得其反。

很长一段时间,没有历史,要求拉扯是被禁止的, 因为&#34; git pull&#34;是关于结合两个(或更多)历史 当你没有历史时,一起拉扯是一种废话 - 你只是 有一个历史(从另一边的历史),没有什么 结合。

后来我们试图变得更好,因为一些新用户在何时触发了错误 做&#34; git init&#34;在一个空目录后跟&#34; git pull&#34;,by 重新定义&#34;合并&#34;没有历史意味着重置到另一个 历史。

这解决了&#34; git init&amp;&amp; git pull&#34;,但我们没有预料到任何人 会做一个&#34; git init&amp;&amp; git add&amp;&amp; git pull&#34;顺序,有 除了错误之外,没有任何理智的结果。

一个补丁,只给出明智的结果可能看起来像这样。

 git-pull.sh |    3 +++
 1 file changed, 3 insertions(+)

diff --git a/git-pull.sh b/git-pull.sh
index 2a10047..da102d0 100755
--- a/git-pull.sh
+++ b/git-pull.sh
@@ -261,6 +261,9 @@ esac

 if test -z "$orig_head"
 then
+       test $(git ls-files | wc -l) = 0 ||
+       die "$(gettext "Uncommitted changes in the index")"
+
       git update-ref -m "initial pull" HEAD $merge_head "$curr_head" &&
       git read-tree -m -u HEAD || exit 1
       exit

答案 2 :(得分:1)

我认为这是一个不幸的副作用,即拥有一个没有单个提交的新存储库。如果您再次尝试测试,而是在本地执行:

git init; echo "Readme" > Readme; git add Readme; git commit -m 'Initial commit'

然后当你用'src'文件“拉”到一个工作目录时,GIT会发出警告,更重要的是,不会删除东西。

答案 3 :(得分:0)

您在github上的repo不包含任何有价值的文件。你没有忘记犯下它们吗?

即使他们没有上演,您的src文件夹本地在哪里?如果您只做了相关指定的内容,git无论如何也无法使用您的文件。

答案 4 :(得分:0)

我认为您应该在addremote add

之前pull之后提交您的本地更改
  1. git init
  2. git add src
  3. git add .gitignore
  4. git commit -m'updated ignore'
  5. git remote add origin git@github.com:Synesso / memx.git
  6. git pull origin master
  7. git push origin master