5

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

  1. 在本地创建了一个新项目并做了一些工作。
  2. 在 github 上创建了一个 repo
  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 仓库都只有两个提交。初始提交(由 github 在项目创建时进行)和第二个仅包含文件.gitignore.

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

当你做 a 时,你会丢失暂存的文件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

我能够在不使用 github 的情况下使用两个主机(此处重命名为 hostB,即“远程”和 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(s)(现在已在 中恢复.git/lost-found/other),那些将有您丢失的东西。(但任何目录结构都将消失,您必须弄清楚哪个文件是哪个文件,然后将它们重新放在您想要的位置。)

有趣的是,如果您git fetch origin跟着git merge origin/master,它会获取原始版本的初始修订版(在这种情况下,使用来自 hostB 的 .gitignore 和 README.md 文件)并保留您的“要提交的更改”。另一个受宠的理由git fetch紧随其后git merge?:-)

于 2012-04-28T22:19:27.627 回答
4

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


这是一个出乎意料的极端案例,干扰了我们试图变得太好的尝试,结果适得其反。

长期以来,没有历史记录并要求拉取是被禁止的,因为“git pull”是将两个(或多个)历史记录组合在一起,当你没有历史记录时拉取是无稽之谈——你只有一个历史记录(另一边的历史),没有什么可以结合的。

后来我们尝试变得更好,因为一些新用户在空目录中执行“git init”然后执行“git pull”时触发了错误,通过将“合并”重新定义为无历史记录意味着重置到其他历史记录。

这解决了“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 上的 repo 不包含任何有价值的文件。你没有忘记提交吗?

即使它们没有上演,您的本地src文件夹在哪里?如果你只做了有问题的事情,git 无论如何都不能吃掉你的文件。

于 2012-04-28T10:40:32.850 回答
0

add我认为你应该在之前remote add和之后提交你的本地更改pull

  1. 混帐初始化
  2. git 添加 src
  3. 混帐添加.gitignore
  4. git commit -m '更新忽略'
  5. git 远程添加来源 git@github.com:Synesso/memx.git
  6. git pull 起源大师
  7. git push 起源大师
于 2012-04-28T12:04:48.350 回答