2012-04-28 32 views
5

我似乎已經失去了我的下午的工作在一個新的回購。以下是我所做的:舞臺文件,然後遠程添加,然後拉 - 我的文件不見了

  1. 在本地創建了一個新項目並完成了一些工作。
  2. 創建了一個回購GitHub上
  3. git init
  4. git add src
  5. git remote add origin [email protected]:Synesso/memx.git
  6. git pull origin master
  7. git add .gitignore
  8. git commit -m 'updated ignore'
  9. git push origin master

我的本地回購和github回購只有兩個提交。最初的提交(由github在項目創建時作出)和第二次只包含文件.gitignore

在步驟4(git add src)中添加的文件不存在。他們似乎也沒有上演。

當你做git pull時,你會丟失上演的文件嗎?我可以以某種方式檢索它們嗎?

當前狀態:

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

我inital add不在引用日誌。

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

history表明,我添加了src文件夾,但沒有提交它:

223 git init 
225 git add src 
229 git add project/Build.scala 
234 git remote add origin [email protected]:Synesso/memx.git 
250 git pull origin master 

我知道,如果你嘗試用本髒文件獲取Git會抱怨。但是,這樣做可以消除階段性文件的拖動效果。這似乎是錯誤的。


我剛剛測試過這個過程,是的,它銷燬了上演的文件。

[email protected]:~/projects$ mkdir x 
[email protected]:~/projects$ cd x 
[email protected]:~/projects/x$ git init 
Initialized empty Git repository in /home/jem/projects/x/.git/ 
[email protected]:~/projects/x$ echo "hi" > hello.world 
[email protected]:~/projects/x$ git add hello.world 
[email protected]:~/projects/x$ git status 
# On branch master 
# 
# Initial commit 
# 
# Changes to be committed: 
# (use "git rm --cached <file>..." to unstage) 
# 
#  new file: hello.world 
# 
[email protected]:~/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 
[email protected]:~/projects/x$ git remote add origin [email protected]:Synesso/memx.git 
[email protected]:~/projects/x$ git reflog 
fatal: bad default revision 'HEAD' 
[email protected]:~/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 
[email protected]:~/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 
[email protected]:~/projects/x$ git reflog 
c80135d [email protected]{0}: initial pull 

文件hello.world被刪除時未顯示警告。

+1

'git reflog'會顯示你的樹形修改。但是如果你從未犯過'src'文件... – 2012-04-28 09:58:51

+0

現在'git status'說了什麼? – vissi2 2012-04-28 10:40:54

回答

7

我能重現此不使用github上,使用兩臺主機(這裏爲hostB上,這是「遠程」和玉簪,這是「本地」改名):

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(S)(現在在.git/lost-found/other恢復),這些將有你丟失的東西。 (任何目錄結構會雖然走了,你必須弄清楚哪些文件是和重新把他們你想讓他們。)

有趣的是,如果你git fetch origin其次git merge origin/master,它抓住了原點的初始修訂(在這種情況下,使用來自hostB的.gitignore和README.md文件)並保留「要提交的更改」。贊成git fetch後跟git merge的另一個原因? :-)

+0

這是...美麗。謝謝。 – Synesso 2012-04-29 00:33:58

+0

我很感激 - 希望我能Flattr這個答案! – Treffynnon 2014-01-23 17:36:23

+0

@Treffynnon:2013年6月,它在「官方」git中被修復,並提交了'b4dc085a8dc2ec2fb5f6366fa672222b807ed655',並且包含在git v1.8.4中。 – torek 2014-01-23 17:51:46

0

您在github上的回購不包含任何有價值的文件。你忘了提交嗎?

即使他們沒有上演,你的src文件夾在哪裏本地?如果你只是做了什麼問題,git無論如何都無法吃掉你的文件。

+0

這就是我的想法。但src文件夾不再在本地存在。 – Synesso 2012-04-28 10:44:59

0

我想你應該提交本地更改後add之前remote addpull

  1. 的git的init
  2. 混帳添加SRC
  3. 混帳添加的.gitignore
  4. git的承諾-m '更新忽略'
  5. git remote add origin [email protected]:Synesso/memx.git
  6. git拉原點主
  7. 混帳推起源主
+0

我認爲這很明顯。 – Ashe 2012-04-28 23:00:37

1

我認爲,這是一種具有新的存儲庫W/O單提交的不幸副作用。如果再次嘗試測試,而是在本地執行:當你「拉」與「SRC」文件的工作目錄,然後

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

,GIT會發出警告,更重要的是,不會刪除的東西。

4

我收到了來自朱尼奧·哈默諾git的郵件列表如下答覆:


這是一個意想不到的角落情況下干擾我們嘗試過 高興,事與願違。

很長一段時間,沒有歷史,並要求拉被禁止,因爲 「混帳拉」是大約是結合兩個(或更多)的歷史 一起拉動時,你有沒有歷史是無稽之談---你只有 有一個歷史(從另一側的歷史),沒有什麼 結合起來。

後來我們力求做到更好,爲一些新用戶時, 做「git的初始化」在一個空目錄,然後是「混帳拉」,由 重新定義「合併」成沒有歷史意味着重置爲觸發的錯誤其他 歷史。

這解決了「混帳初始化& &混帳拉」,但我們沒有預料到的人 會做一個「混帳初始化& & git的添加& &混帳拉」序列,將有 不理智的結果不僅僅是其他錯誤。

一個只給出理智結果的補丁可能是這樣的。

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 
+0

非常有趣。 +1 – VonC 2012-04-29 09:59:51

相關問題