Git: почему, когда я переключаю ветки, некоторые мои файлы остаются на месте, а другие нет? - PullRequest
0 голосов
/ 24 апреля 2020

Я довольно новичок в Git.

Я работаю над проектом, в котором я создал серию веток с моими собственными, бесплатными sh файлами.

I заметил, что когда я переключаюсь с одной ветви на другую, некоторые файлы исчезают, а другие остаются. Это было бы хорошо, за исключением того, что он ломается, когда я компилирую.

Кто-нибудь знает, почему это так и как это остановить?

Ответы [ 3 ]

0 голосов
/ 24 апреля 2020

Я предполагаю, что вы создали ветви до того, как все файлы были переданы, или что вы удалили их впоследствии.

Для чего вы используете ветви?

Ветви представляют параллельные версии репо Таким образом, вы можете иметь совершенно разные файлы в каждой ветви. Если вы хотите "сбросить" ваши ветви до того же состояния, что и у основной ветви, вы можете попробовать слияние .

0 голосов
/ 24 апреля 2020

Ветвь - это метка и указатель на коммит. Каждый коммит содержит файлы из рабочего дерева. (Git использует все возможные приемы, чтобы не тратить пространство, он никогда не хранит копии идентичных файлов, он хранит указатели на файлы. Но это не имеет значения - в идеале каждый коммит хранит все дерево файлов.)

При переключении ветвей git переключается с текущего коммита (на который указывает HEAD) на новый коммит (на который указывает ветвь). Git синхронизирует файлы в рабочем дереве с файлами в новом коммите. Для каждого файла в старом и новом коммитах есть 4 варианта:

  1. Файл в старом коммите и в новом коммите одинаков. Git не касается файла.

  2. Файл в старом коммите и в новом коммите отличается. Git обновляет файл из нового коммита.

  3. Файл в старом коммите существует, а в новом коммите он отсутствует. Git удаляет файл.

  4. Файл в старом коммите не существует, но существует в новом коммите. Git поместите файл в рабочее дерево.

Вероятность того, что в рабочем дереве есть измененные файлы перед переключением ветвей.

Для варианта 1 выше: git переключает ветви, не касаясь файла, поэтому изменения в файле остаются. Для вариантов 2 и 3: git жалуется, что не может обновить / удалить измененный файл и прерывает переключение.

Поэтому, если вы переключаетесь на другую ветку и в коммите нет файлов, которые были добавлены в Другой коммит вы можете:

Слить другую ветку с текущей. Это приносит все изменения из объединяемой ветви - добавляются новые файлы, обновляются обновленные файлы, удаляются удаленные файлы.

Или вы можете просто принести файлы из другого коммита, используя ту же команду git checkout в файловом режиме. :

git checkout <commitish> -- file1 file2…
git add file1 file2…
git commit

<commitish> здесь есть любой указатель на коммит - идентификатор SHA1 коммита, ветви или тега.

PS. git checkout с двумя его режимами (переключение веток и копирование файлов) считается сбивающим с толку, поэтому в более новых выпусках его заменяют две отдельные команды git switch и git restore.

0 голосов
/ 24 апреля 2020

git checkout (или git switch) сохраняет ваше рабочее дерево и рабочую область, если они совместимы. Если это не так, git подскажет вам, что ваша работа будет стерта.

Рекомендуется всегда сохранять sh ваши изменения (или фиксировать их) при смене веток.

Relavent другой пост: git переключение веток без отмены локальных изменений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...