переключение веток в git - когда я получу У вас есть локальные изменения, которые нельзя переключать ветки?

Возможные дубликаты:
git: переключить ветку и игнорировать любые изменения без фиксации.
странное поведение ветвей Git < / а>

Я знаю, что общая рекомендация - иметь чистый статус перед переключением веток в git. (тайник или парк-коммит). Я пытаюсь понять, когда я получу У вас локальные изменения не могут переключаться между ветвями, я не могу следовать логике:

У меня есть репо с файлом version.txt, содержащим текст 1:

git checkout -b новый

echo 2 ›› version.txt (рабочий каталог не грязный, модифицировал файл)

git checkout master (почему это работает? Я не выполнял этапы \ вносил свои изменения в новые)

то же самое произойдет, если я удалю содержимое файла в своей новой ветке или сначала подготовлю файл.

Может ли кто-нибудь помочь мне понять, когда я получу сообщение У вас есть локальные изменения, которые не могут переключаться между ветвями. ?

Спасибо, Ран


person ran wainstein    schedule 10.07.2011    source источник
comment
@Alok - это дубликат этого вопроса, но не того, на который вы ссылались!   -  person manojlds    schedule 10.07.2011


Ответы (3)


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

Пример:

$ git init
Initialized empty Git repository in /tmp/asadfasd/.git/
$ echo 1 > bar
$ git commit -am "commit 1 master"
[master (root-commit) 55da003] commit 1
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 bar
$ git co -b testbranch
Switched to a new branch 'testbranch'
$ git co master
Switched to branch 'master'
$ echo 2 >> bar
$ git commit -am "commit 2 master"
[master c6dc6d9] commit 2 master
 1 files changed, 1 insertions(+), 0 deletions(-)
$ git co testbranch
Switched to branch 'testbranch'
$ echo 3 >> bar
$ git co master
error: Your local changes to the following files would be overwritten by checkout:
bar
Please, commit your changes or stash them before you can switch branches.
Aborting

Если вы переустановите testbranch на master перед изменением файла, он будет работать, потому что файл не будет изменен.

Другими словами, если ветви расходятся, и вы изменяете расходящиеся файлы, это не сработает.

person Ulrich Dangel    schedule 10.07.2011

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

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


(просто вспомнил, что я уже отвечал на этот вопрос раньше - вставил сюда свой старый ответ и проголосовал за закрытие этого вопроса как дубликат)

Когда вы переключаете ветвь и файлы изменяются только локально, Git не выдает вам предупреждение / сообщение (и объединит изменения в другую ветку). Например, у вас есть репо на master, вы создаете временную ветку, имеете локальную модификацию в файле. Теперь, когда вы переключаетесь на мастер, вы не получите сообщения. Если, с другой стороны, вы вносите изменения в temp и фиксируете их (то есть temp отличается от master), а затем у вас есть локальные изменения, он даст вам это сообщение, когда вы переключитесь на master

Ветви Git ведут себя странно

person manojlds    schedule 10.07.2011

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

В вашем примере содержимое version.txt одинаково в каждой ветке. Таким образом, Git игнорирует любые незафиксированные модификации этого файла при переключении между ними.

person Richard Hansen    schedule 10.07.2011