5

新しいレポで午後の仕事を失ったようです。これが私がしたことです:

  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

私のローカル リポジトリと github リポジトリの両方に 2 つのコミットしかありません。最初のコミット (プロジェクトの作成時に github によって行われる) と、ファイルのみを含む 2 番目のコミット.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は警告なしに削除されました。

4

5 に答える 5

7

I was able to reproduce this without using github, using two hosts (renamed here as hostB, which is the "remote", and hostA, which is the "local"):

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

Important: you can use git fsck --lost-found to recover your staged files:

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

and sure enough, if you examine the blob(s) (which are now restored in .git/lost-found/other), those will have your lost stuff. (Any directory structure will be gone though, and you'll have to figure out which file is which and re-put them where you want them.)

Interestingly, if you git fetch origin followed by git merge origin/master, it grabs the origin's initial revision(s) (with the .gitignore and README.md files from hostB, in this case) and retains your "changes to be committed". Another reason to favor git fetch followed by git merge? :-)

于 2012-04-28T22:19:27.627 に答える
4

Junio Hamano から git メーリング リストで次の返信を受け取りました。


これは、裏目に出て、あまりにも親切にしようとする私たちの試みを妨害する予期せぬまれなケースです.

長い間、履歴を持たずにプルを要求することは禁じられていました。「git プル」とは、2 つ (またはそれ以上) の履歴を組み合わせることであり、履歴がないときにプルすることはナンセンスであるためです --- 履歴は 1 つしかありません (反対側からの歴史)と組み合わせるものは何もありません。

一部の新規ユーザーが空のディレクトリで「git init」を実行した後に「git pull」を実行するとエラーが発生したため、「merge」を履歴なしに再定義して、他の履歴にリセットすることを意味するようにしました。

これで「git init && git pull」は解決しましたが、「git init && git add && git pull」シーケンスを実行する人がいるとは予想していませんでした。

正気の結果のみを与えるパッチは、次のようになります。

 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
于 2012-04-29T05:17:42.583 に答える
1

これは残念なことに、単一のコミットを伴う新しいリポジトリを持つことの副作用だと思います。テストを再試行するが、代わりにローカルで実行する場合:

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

次に、「src」ファイルを含む作業ディレクトリに「プル」すると、GIT は警告を発し、さらに重要なことに、内容を削除しません。

于 2012-04-28T16:08:05.193 に答える
0

githubのリポジトリに価値のあるファイルが含まれていません。それらをコミットすることを忘れませんでしたか?

ステージングされていなくても、srcフォルダはローカルのどこにありますか?問題で指定されたものだけを実行した場合、gitはとにかくファイルを食べることができませんでした。

于 2012-04-28T10:40:32.850 に答える
0

addremote addと後にローカルの変更をコミットする必要があると思いますpull

  1. git初期化
  2. git add src
  3. git add .gitignore
  4. git commit -m '更新された無視'
  5. git remote add origin git@github.com:Synesso/memx.git
  6. git pull オリジンマスター
  7. git push オリジンマスター
于 2012-04-28T12:04:48.350 に答える