Подтвердить что ты не робот

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: Я понял это сейчас. Самый верный ответ был прав, см. Мой последний комментарий к этому ответу.

4b9b3361

Ответ 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

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