Git позволяет мне переключаться между ветвями без изменений
Я просто изучаю Git, проходя через учебник. Я в ветке seo_title, и у меня есть незафиксированные изменения в файле mission.html. Я сделал git checkout master
, ожидая получить предупреждение об изменениях, не поставленных для фиксации, никаких добавленных изменений и т.д., Однако вместо этого он пошел вперед и переключил ветки с сообщением:
M mission.html
Switched to branch 'master'
Тогда, когда я сделал git diff mission.html
, он показал мне, что рабочий каталог все еще содержит изменения, которые я сделал, пока я проверил другую ветку.
Что мне не хватает?
Для чего это стоит, я использую Git Bash в Windows.
EDIT: изменения в файле mission.html также не были добавлены в индекс промежуточного уровня.
РЕДАКТИРОВАТЬ 2: Я думал, что правильный ответ был правильным, но при дальнейшем расследовании он не соответствует поведению, которое я вижу. Вот более подробное описание того, что я делаю:
top_directory(master) > git branch new_branch_1
top_directory(master) > git branch new_branch_2
top_directory(master) > git checkout new_branch_1
(открыть блокнот ++ и изменить resources.html, сохранить)
top_directory(master) > git status
# On branch new_branch_1
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed
# (use "git checkout -- <file>..." to discard changes in wo
#
# modified: resources.html
#
no changes added to commit (use "git add" and/or "git commit
top_directory(new_branch_1) > git checkout new_branch_2
Здесь я ожидаю, что Git возразит и скажет мне, чтобы он был заблокирован или зафиксирован, поскольку new_branch_1 и new_branch_2 имеют разные версии resources.html, но он просто переключается на новую ветку без предупреждения, и она приносит незафиксированные изменения вдоль:
M resources.html
Switched to branch 'new_branch_2'
top_directory(new_branch_2) > git status
# On branch new_branch_2
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: resources.html
#
no changes added to commit (use "git add" and/or "git commit -a")
Есть ли режим или параметр, который заставит его вести себя таким образом, а не предупреждать? Или я все еще не понимаю сценарий?
ИЗМЕНИТЬ 3: Я понял это сейчас. Самый верный ответ был прав, см. Мой последний комментарий к этому ответу.
Ответы
Ответ 1
Поведение, которое вы видели в последний раз, когда вы пытались переключить ветки с локальными изменениями, теперь связано с различными изменениями файла.
Итак, скажем, у нас есть ветвь с названием "readme" , где вы вносили некоторые изменения в файл, скажем, README.md.
Теперь вы переключились на мастер. Вы выполняете некоторую работу над другими файлами (а не README.md). Теперь у вас есть локальные изменения. Если вы попытаетесь вернуться к ветке "readme" , не внося никаких изменений, это позволит вам. Зачем? Поскольку переключение на ветку "readme" не отменяет никаких локальных изменений.
Если, однако, вы вносите изменения в файл README.md на главной ветке, тогда, когда вы пытаетесь сделать
git checkout readme
вы столкнетесь
error: Your local changes to the following files would be overwritten by checkout: README.md
Please, commit your changes or stash them before you can switch branches.
потому что у вас есть изменения в README.md, для которых требуется слияние.
Ответ 2
Это нормальное поведение. Если вы не хотите, чтобы измененные файлы находились в вашей недавно проверенной ветке, а затем спрячьте их. Вот так.
# on branch dev
$ git stash
$ git checkout master
# do stuff on master
# back to dev
$ git checkout dev
$ git stash pop
Ответ 3
Git позволит вам проверять другие ветки (или теги или хэши SHA1), пока фиксация, с которой вы меняете свое дерево работы, делает НЕ скрывать ваши локальные незафиксированные изменения.
В вашем случае дерево ветвей master
имело бы ту же версию missing.html
, что и в настоящее время в конце текущей ветки, с которой вы переключались. Git не нужно касаться рабочей копии (по крайней мере, missing.html
) при изменении ветвей здесь и, следовательно, позволяет сохранить локальные изменения.
Если вы действительно пытались выполнить checkout
коммит, где в дереве дерева была другая версия missing.html
(чем в вашей текущей ветке), Git будет показывать сообщение об ошибке, подобное этому
$ git checkout some-other-branch
error: Your local changes to the following files would be overwritten by checkout:
missing.html
Please, commit your changes or stash them before you can switch branches.
Aborting
Ответ 4
Git - глупый трекер контента. Он работает только с моментальными снимками рабочего дерева. Главное требование - вы должны иметь возможность восстановить рабочее дерево. Конечно, он обновляется. Но если измененный файл в обеих ветвях одинаковый - почему бы не разрешить переключение? Если вы сделали это по ошибке, вы можете переключить назад восстановление предыдущего состояния, неважно. Но если файл отличается в ветвях, вам нужно объединить содержимое, поэтому он настаивает на фиксации изменений, в противном случае будет невозможно вернуться назад.
Ответ 5
это очевидно, если вы измените файл, который не изменяется в ветке, в которую вы хотите выполнить проверку, потому что синтаксис проверки заключается в том, чтобы привести весь индекс и рабочий каталог в вашу новую ветку, вы увидите, что они появились в ваш новый филиал. Хотя, если есть конфликты, возможно, нужно объединить эти файлы, что означает один раз после слияния, если вы вернетесь к старой ветке, то это уже объединенная версия, а не предыдущая, вы ее потеряете. В результате, чтобы вы сохранили старое изменение, оно не позволит вам это сделать.