После $ Git checkout branchName все изменения (зафиксированные или нет / поставленные или нет) появляются при переключении ветки

Странное поведение Git / ветки

Недавно мне пришлось восстанавливать свой компьютер и заново устанавливать ВСЕ программное обеспечение.

Git ведет себя незнакомым образом.

я сделал

$ git init
$ git branch -b newBranch
$ git checkout newBranch

После этого я внес некоторые изменения в пару файлов и добавил новый файл.

Я НЕ БЫЛ $ git add -A ИЛИ $ git commit -m 'msg'

На,

$ git checkout master

все изменения, внесенные newBranch, отражаются на master:

  • все изменения, внесенные во все файлы на newBranch
  • все новые файлы, созданные на newBranch

На,

$ git status

все изменения отображаются как неустановленные (красным).

Раньше, всякий раз, когда я переключался на ветку и вносил некоторые изменения, при переключении на другую ветку я больше НЕ мог видеть эти изменения (поэтапные / неустановленные или зафиксированные / не зафиксированные).

И только при беге

$ git merge sourceBranch destinationBranch

Отразятся ли эти изменения на других ветках. Кажется, это не так

с моим Git.

Is it

  • сломанный?
  • неправильно настроен?
  • неправильно установлен?
  • испорчен?
  • что я не понимаю?

person wowiamhere    schedule 23.03.2016    source источник
comment
Раньше, всякий раз, когда я переключался на ветку и вносил некоторые изменения, при переключении на другую ветку я больше НЕ мог видеть эти изменения (поэтапные / неустановленные или зафиксированные / не зафиксированные). Я не верю, что это так, здесь какая-то путаница.   -  person Gauthier    schedule 23.03.2016


Ответы (4)


Итак, вы сейчас работаете над веткой newBranch, вы внесли изменения, но не еще ничего зафиксировали.

Почему разрешено оформлять заказ в ветке master?

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

Однако, если вы сейчас работаете над веткой master и изменяете некоторые файлы, Git не позволит вам сделать это, потому что локальные изменения будут перезаписаны.

person Maroun    schedule 23.03.2016
comment
После * внесения изменений в NewBranch (без постановки), * переключения на мастер и внесения некоторых изменений в изменения, которые появляются из NewBranch, * и переключения обратно на NewBranch, я могу видеть все изменения, сделанные в мастере (все еще неустановленные) - person wowiamhere; 23.03.2016

Он не сломан или что-то еще, попробуйте добавить эти неэстейджеры и снова зафиксировать.

person dogstring    schedule 23.03.2016

Краткий ответ: ваши локальные изменения не отслеживаются git, пока вы не add или commit. Если вы переключаете ветвь без добавления или фиксации, git не перезаписывает эти локальные изменения, поэтому вы не потеряете данные слишком легко.


Есть три отдельных домена:

  • ваши локальные файлы (L)
  • плацдарм (S)
  • репозиторий (R)

Вы внесли изменения в L. Они не отражаются ни в S, ни в R, домены разделены. Если вы не сообщили git add (S) или commit (R), ваши изменения в L еще не относятся ни к какой ветви, а только к домену L.

Когда вы checkout переходите от и к master и newBranch, git изменяет текущий HEAD, то есть если бы локальные изменения были внесены в S или R, если бы вы были на add или commit.

Когда вы checkout разветвляетесь, git также пытается отразить извлеченную фиксацию (которая находится на конце ветки, которую вы извлекаете) в файловую систему, домен L. Но, чтобы предотвратить попадание себе в ногу и потерю невыполненных и незавершенных изменений в L, git не перезаписывает эти L изменения. Поскольку они не добавлены и не зафиксированы, вы не смогли бы получить их иначе.

Примечание: вы можете указать git перезаписать такие локальные изменения, передав флаг -f (принудительное) в checkout. Вы потеряете свои локальные изменения без предупреждения.

Также обратите внимание: переключение ветки при наличии локальных изменений не всегда возможно, например, если изменяемая ветвь будет применять изменения, которые перезапишут некоторые из ваших локальных изменений. Здесь я чаще всего использую -f, когда знаю, что хочу потерять локальные изменения.

Этот ответ (мой) может помочь: https://stackoverflow.com/a/2569513/108802

person Gauthier    schedule 23.03.2016
comment
Я не понимаю, почему, когда я проверяю ветку без добавления или фиксации, исходный код в моем редакторе кода не возвращается к файлу без изменений, сделанных в другой ветке; хотя я не запускал $ git merge - person wowiamhere; 23.03.2016
comment
Вы не вносили изменений в другую ветку, пока не зафиксируете эти изменения. Вы были в ветке (домен R), вы внесли изменения (домен L), но сами изменения являются локальными, а не в ветке. - person Gauthier; 23.03.2016
comment
checkout с -f, и вы получите ожидаемое поведение. Но ваши локальные изменения будут потеряны, если никогда не будут внесены. - person Gauthier; 23.03.2016
comment
вау, похоже, то, как я настроил свои команды bash в моей предыдущей установке, дал мне неправильное представление о вещах. СПАСИБО за куча. Мне нужно больше прочитать документацию. - person wowiamhere; 23.03.2016
comment
@wowiamhere: хорошо, что ты разобрался! Если вы считаете, что ваш вопрос решен, подумайте о том, чтобы проголосовать / принять ответ. - person Gauthier; 23.03.2016

Предыдущая установка ввела меня в заблуждение относительно реальных команд и возможностей Git. Необходимо внимательно прочитать документацию.

person wowiamhere    schedule 23.03.2016