Это нормально, хотя я немного удивлен одним из шагов.
Когда вы переключаетесь с B на A, git видит, что файл должен быть обновлен в соответствии с версией A и делает это тихо, потому что вы проигнорировали его, сказав, что в отношении ветви B файл не имеет значения. Он должен сделать это - единственная альтернатива - отказаться от проверки ветки A. (Он отказался бы, если бы файл не был проигнорирован, сказав, что «Untracked working tree file» будет перезаписан слиянием ». Я действительно удивлен это не делает этого в этом случае тоже. У любого есть представление о том, является ли это свойство или ошибка?)
Когда вы переключаетесь обратно, git видит, что ветвь B не имеет этого файла, и удаляет его. Опять же, это нужно сделать. У него нет возможности прочитать ваш разум и понять, что этот проигнорированный файл, который был там минуту назад, - это тот, который вы хотите вернуть - он просто дает вам содержимое ветки B, в которой указано, что файл не существует.
Как следует из предложения ewall в комментариях, если вы хотите, чтобы файл выдержал эти переходы, его нужно отслеживать всеми ветвями или игнорировать во всех ветвях.
Поскольку единственное жизнеспособное решение - всегда отслеживать файл «f
», вы можете добавить только в ветви B
, smudge / clean process с gitattributes filter driver :
[/g3]
При проверке ветки B
:
f
во временном файле, заменив содержимое f
на один файл fbis
(отслеживаемый файл, который будет содержать для ветки B
, «B
содержимое f
") f
содержимое (как изменено в B
) в fbis
(fbis
совершается с f
изменениями в ветви B
) восстановить f
(с временным файлом), то есть f
не выполняется (игнорируется в B
) Вы можете добавить, все еще в ветви B
, пользовательский драйвер слияния , который будет защищать fbis
в случае слияния из других ветвей с B
: драйвер слияния всегда будет сохранять B
версию fbis
контента, следя за тем, чтобы проигнорированный файл f
вернуть свое содержание, когда всегда отделяется B
.
Поскольку эти драйверы (фильтр и слияние) не выполняются в других ветвях, файл «f» фиксируется в других ветвях со всеми его модификациями. В ветке B
его содержимое никогда не изменится, и все же «локальные модификации», сделанные в f
, будут восстановлены всякий раз, когда B
выгружается.
Если это восстановление содержимого не требуется, вам не нужно управлять fbis
. Просто сохраните драйвер фильтра, и вы будете уверены, что независимо от того, какую модификацию вы делаете с f
в ветви B
, эти изменения никогда не будут совершены, эффективно игнорируя содержимое f
.
Игнорирование файлов в git не означает, что они не проверяются. Вы можете проверить файл и управлять им в git и игнорировать его в .gitignore
.
У меня возникла аналогичная ситуация, и я делаю это:
Я выберу файл, который был удален в checkout index.php.
В вашем .gitignore ветви A и ветвь B удаляют строку, которая игнорирует ваш index.php, после этого фиксируйте свой .gitignore в обеих ветвях.
В ветви A создайте резервную копию index.php, удалите это и зафиксируйте.
Восстановить в ветке A index.php из созданной ранее резервной копии и в вашем .gitignore снова игнорировать index.php и зафиксировать это.
В вашей ветке B добавить index.php, игнорировать файл в вашем .gitignore, зафиксировать и быть счастливым.