Почему мой git origin хочет удалить все мои изменения?
Подумав, что я наконец-то понял git, теперь я нахожусь в замешательстве по поводу поведения git, которое я наблюдаю - всякий раз, когда я отправляю изменения, сделанные и зафиксированные на моей локальной машине, в мой исходный git-репозиторий, эти изменения немедленно постановка для отмены на исходном сервере. Да??!?
У меня есть машина (машина A) с git-репозиторием для проекта; на этой машине запущен SSH-сервер, и я настроил учетную запись, чтобы я мог удаленно подключиться к ней и клонировать git-репо. Затем я использовал git на машине B, чтобы клонировать репо:
git clone ssh://username@remote.host/path/to/repo
без проблем. Я внес изменения в проект на машине B и зафиксировал эти изменения в хранилище git на B. Затем я перенес изменения в исходное хранилище на машине A:
git push master origin
и это работало нормально; на машине B, выход git remote show origin
показывает, что происхождение обновлено:
$ git remote show origin
* remote origin
Fetch URL: ssh://username@remote.host/path/to/repo
Push URL: ssh://username@remote.host/path/to/repo
HEAD branch: master
Remote branch:
master tracked
Local ref configured for 'git push':
master pushes to master (up to date)
Но когда я иду к машине А и делаю git status
Я вижу, что все изменения, которые я только что нажал, теперь должны быть отменены!
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: build-fatjar.xml
# deleted: src/monitor/config/client-lm-prod.xml
# modified: src/monitor/config/quartz-baseconfig.xml
# modified: src/monitor/service/task/BaseTask.java
# new file: src/monitor/service/task/CheckForCorrections.java
# deleted: src/monitor/service/task/CheckForDuplicates.java
# deleted: src/monitor/service/task/ProcessCorrections.java
# renamed: src/monitor/test/CheckForDuplicatesTest.java -> src/monitor/test/CheckForCorrectionsTest.java
# deleted: src/monitor/test/ProcessCorrectionsTest.java
# modified: src/monitor/test/TaskTestCase.java
Единственный способ вернуть исходное хранилище (компьютер A) в то же состояние, что и на компьютере B, - это git reset HEAD
сбросить все эти изменения, чтобы быть зафиксирован, а затем git rm
каждый из них; в противном случае, следующий git commit
на машине A отменит все, что я только что нажал с машины B.
Я прочитал все ссылки, которые могу достать, и никто не упоминает об этом поведении; также я не могу найти ссылку на это в Интернете. Есть идеи?
2 ответа
Звучит так, как будто вы продвигаетесь к непроигрышному репо (то есть репо, в котором файлы извлечены на диск). Git обновит репозиторий, но не извлеченные файлы, поэтому будет выглядеть, как будто изменения ожидают постановки. Исправление заключается в том, чтобы сделать одну из двух вещей:
- Либо вставьте в пустое хранилище (источник), а затем используйте зацепку после получения, чтобы проверить файлы (возможно, используя
git archive
) в другое место на сервере, или - Используйте крюк пост-получения для запуска
git checkout
или, например, обновить файлы на диске.
Вы можете прочитать больше в этом вопросе переполнения стека или в этой статье с практическими рекомендациями.
Да @MvanGeest прав, вы подталкиваете к непрошеному репо. Если вы намереваетесь использовать репо в качестве "благословенного репо", то есть точно так же, как вы используете главный репозиторий в Subversion, тогда вам нужно создать голое репо и нажать на него. если в ситуации, которую вы имеете сейчас, вы должны ssh в a и вытащить из b.