Стадия файлов, затем удаленное добавление, затем извлечение - и мои файлы исчезли
Кажется, я потерял работу во второй половине дня в новом репо. Вот что я сделал:
- Создал новый проект локально и проделал определенную работу.
- Создал репо на github
git init
git add src
git remote add origin git@github.com:Synesso/memx.git
git pull origin master
git add .gitignore
git commit -m 'updated ignore'
git push origin master
У моего локального репо и репозитория github есть только два коммита. Начальная фиксация (сделанная github при создании проекта) и вторая, включающая только файл .gitignore
,
Файлы, добавленные в шаге 4 (git add src
) нет. И при этом они не кажутся организованными.
Вы теряете постановочные файлы, когда вы делаете git pull
? Могу ли я получить их как-нибудь?
Текущее состояние:
$ git status
# On branch master
nothing to commit (working directory clean)
Мой начальный add
не в рефлоге.
$ 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 ответов
Я смог воспроизвести это без использования 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-объекты, которые теперь восстанавливаются в .git/lost-found/other
), у тех будут ваши потерянные вещи. (Любая структура каталогов исчезнет, и вам придется выяснить, какой файл является каким, и переместить их туда, куда вы хотите.)
Интересно, если вы git fetch origin
с последующим git merge origin/master
он захватывает исходную ревизию (и) источника (в данном случае файлы.gitignore и README.md из hostB) и сохраняет ваши "изменения, которые должны быть зафиксированы". Еще одна причина в пользу git fetch
с последующим git merge
?:-)
Я получил следующий ответ в списке рассылки git от Хунио Хамано:
Это непредвиденный угловой случай, мешающий нашей попытке быть слишком милым, что привело к обратному результату.
В течение долгого времени запрещалось не иметь истории и просить тянуть, потому что "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
Я считаю, что это, к сожалению, побочный эффект от наличия нового репозитория без единого коммита. Если вы попробуете снова, но вместо этого выполните локально:
git init; echo "Readme" > Readme; git add Readme; git commit -m 'Initial commit'
затем, когда вы "тянете" в рабочий каталог с файлами "src", GIT предупредит и, что более важно, не удалит вещи.
Ваш репозиторий на github не содержит никаких ценных файлов. Разве вы не забыли совершить их?
Даже если они не поставлены, где ваш src
папка локально? Если вы сделали только то, что указано в вопросе, git все равно не сможет съесть ваши файлы.
Я думаю, что вы должны совершить свои локальные изменения после add
до remote add
а также pull
- мерзавец
- git add src
- git add.gitignore
- git commit -m 'обновлено игнорировать'
- git remote добавить источник git@github.com:Synesso/memx.git
- мастер происхождения git pull
- мастер происхождения git push