git: проверить из удаленной ветки изменения локальных файлов? - PullRequest
1 голос
/ 02 мая 2019

Я только что зашел в удаленную ветку, чтобы увидеть различия с локальной прямо в файлах. Никаких изменений не произошло, но когда я пытаюсь вернуться (ck = checkout) к мастеру, я получаю ошибку: «Ваши локальные изменения в следующих файлах будут перезаписаны checkout: checkout from remote branch

Редактировать: ошибка ничего не говорит об ожидающих коммитах или о чем-либо it just says abort

Я не понимаю, почему извлечение может внести какие-либо изменения в файлы, но тот факт, что извлечение сделано из удаленной ветви, и ошибка говорит о том, что «локальные файлы» сбивает с толку меня ... Локальные файлы должны ссылаться на локальная основная ветвь, на которую я переключаюсь, но я только что зафиксировал все изменения в этой основной ветке ... (!?). add . local master commit

Редактировать: это статус сразу после коммита: enter image description here

Что я (окончательно) не понимаю?

1 Ответ

2 голосов
/ 02 мая 2019

Короткий ответ

Отменить любые изменения в вашем рабочем дереве, которые могли быть добавлены в индекс с помощью

git checkout HEAD -- .

Для хранилища в файловой системе Windows FAT32, скажите git игнорировать биты выполнения в файловых режимах.

git config core.fileMode false

, после чего вы сможете оформить свою основную ветку.

git checkout master

или используя свой псевдоним

git ck master

Подробное объяснение

После того, как вы скажете git добавить все новые файлы и изменения в текущий каталог (.) и в любые дочерние каталоги

git add .

и затем зафиксируйте, обратите внимание, что git сообщает вам, что права доступа к файлу изменены, например, ,

mode change 100644 => 100755 .gitignore

в сочетании с линией, расположенной непосредственно над ней

264 files changed, 0 insertions(+), 0 deletions(-)

мы заключаем, что содержимое не изменилось - только разрешения.

Контекст имеет решающее значение для этого абзаца. Сразу после того, как вы запустили git commit -m 'many changes were not ...', вы могли бы подтвердить это, запустив git diff origin/master, и вывод будет состоять из множества последовательностей вида

$ git diff origin/master
diff --git a/.gitignore b/.gitignore
old mode 100644
new mode 100755
[...]

, но без добавления новых строк или удаления строк.

Появление ваших скриншотов и каталога с именем Desktop заставляет меня поверить (что подтвердил ваш более поздний комментарий), что вы используете Microsoft Windows в файловой системе, которая не представляет биты режима выполнения, поэтому git должен быть уведомлен игнорировать его с помощью git config core.fileMode false, что объясняет документация git config .

core.fileMode
Сообщает Git, следует ли выполнять исполняемый бит файлов в рабочем дереве.

Некоторые файловые системы теряют исполняемый бит, когда файл, помеченный как исполняемый, извлекается или извлекает неисполняемый файл с включенным исполняемым битом. git-clone или git-init проверяют файловую систему, чтобы определить, правильно ли она обрабатывает исполняемый бит, и эта переменная автоматически устанавливается при необходимости.

Однако хранилище может находиться в файловой системе, которая правильно обрабатывает файловый режим, и эта переменная устанавливается равной true при создании, но позже ее можно сделать доступной из другой среды, которая теряет файловый режим (например, экспорт ext4 через монтирование CIFS, посещение созданного Cygwin репозитория с Git для Windows или Eclipse). В таком случае может потребоваться установить для этой переменной значение false. См. git-update-index.

Git Philosophy

Git чрезвычайно осторожен, чтобы не разрушить вашу работу. Перед тем, как приступить к проверке мастера, git сравнивает состояние вашего текущего рабочего дерева с заголовком нужной ветви и, например, видит, что .gitignore в его положении отличается от .gitignore в мастере.

Поскольку git видит неподтвержденные изменения, которые он должен будет перезаписать для мастера проверки, он прерывает проверку и дает вам знать, что вам нужно либо намеренно отбросить эти изменения

git checkout HEAD -- .

или положите их куда-нибудь для безопасного хранения с помощью git stash или git add, за которыми следует git commit. С чистым рабочим деревом вы можете смело проверять различные ветви.

Сравнение файлов

Для получения подробной информации о том, что именно изменилось, выполните одну из следующих команд. Правильный вызов зависит от контекста.

После создания нового коммита

Вы добавили изменения и создали коммит на ветке master с именем объекта SHA-1 644ccb8 (как видно на скриншоте с вывода git commit -m [...]). В то время, когда вы его создали, 644ccb8 стал HEAD вашей основной ветки, и чтобы увидеть все изменения между ним и master в исходном, запустите

git diff origin/master

На английском это означает «Показать все изменения между origin/master и кончиком ветви, над которой я сейчас работаю». Фактически, приведенная выше команда эквивалентна git diff HEAD origin/master, что явно требует сравнения против HEAD.

Чтобы показать изменения для одного или нескольких файлов, названных в качестве разделителя --, используйте

git diff origin/master -- .gitignore README.md

После постановки, но до совершения

Ваши скриншоты показывают не все, но текст зеленого цвета из значения git status означает, что определенные изменения были «поставлены» или добавлены в индекс.В git мы постепенно создаем следующий коммит в индексе (также называемый промежуточной областью или кэшем) с одним или несколькими вызовами git add и, реже, удаляем изменения из индекса с помощью git reset.Как только индекс будет в хорошей форме, git commit добавляет новый коммит с содержимым индекса в историю.

Ваши скриншоты показывают, что вы запустили git add . из корня хранилища.

  • В сторону: знайте, что git add . рисует широкой кистью.Иногда это то, что вы хотите, но часто он собирает больше файлов, чем вы предполагаете, особенно когда в вашем .gitignore отсутствует несколько шаблонов.После большого git add всегда обязательно запускайте git status, чтобы убедиться, что вы не подобрали автостопщиков.

После запуска git add один или несколько раз, но до работает git commit, чтобы увидеть изменения, которые в данный момент находятся в индексе или кэше, добавьте параметр --cached.

git diff --cached

или ограничьте одним или несколькими конкретными файлами

git diff --cached -- README.md

Перед подготовкой

Чтобы увидеть разницу между тем, что находится в вашем рабочем дереве, и тем, что находится в индексе (или кеше), запустите один из

git diff
git diff -- README.md

Это режим по умолчанию git diff.

Detached HEAD

Обратите внимание, что из вашего скриншота в вашем хранилище есть detached HEAD , определенное в документации как

Это просто означает, что HEAD ссылается на конкретный коммит, а не на именованную ветвь.

Как правило, вы обычно не делаете хотите извлекать удаленные ветви отслеживания ( например , origin/master), теги или хэши SHA-1 напрямую, если вы планируете создатьКе модификации.

...