Почему мой 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 обновит репозиторий, но не извлеченные файлы, поэтому будет выглядеть, как будто изменения ожидают постановки. Исправление заключается в том, чтобы сделать одну из двух вещей:

  1. Либо вставьте в пустое хранилище (источник), а затем используйте зацепку после получения, чтобы проверить файлы (возможно, используя git archive) в другое место на сервере, или
  2. Используйте крюк пост-получения для запуска git checkout или, например, обновить файлы на диске.

Вы можете прочитать больше в этом вопросе переполнения стека или в этой статье с практическими рекомендациями.

Да @MvanGeest прав, вы подталкиваете к непрошеному репо. Если вы намереваетесь использовать репо в качестве "благословенного репо", то есть точно так же, как вы используете главный репозиторий в Subversion, тогда вам нужно создать голое репо и нажать на него. если в ситуации, которую вы имеете сейчас, вы должны ssh в a и вытащить из b.

Другие вопросы по тегам