Почему изменения, внесенные в мой файл в ветке, отображаются на мастере в Git?

Вот последовательность команд, которые я запускал:

Здесь я на мастере.

$ git branch
* master

Создание файла в ветке master и его коммит.

$ echo "hello world, from master." > helloworld.sh

$ git add helloworld.sh
warning: LF will be replaced by CRLF in helloworld.sh.
The file will have its original line endings in your working directory.

$ git commit -m "Adding helloworld.sh"
[master e15289b] Adding helloworld.sh
warning: LF will be replaced by CRLF in helloworld.sh.
The file will have its original line endings in your working directory.
 1 file changed, 1 insertion(+)
 create mode 100644 helloworld.sh

$ git status
On branch master
nothing to commit, working directory clean

Создание новой ветки с именем firstbranch.

$ git branch firstbranch

$ git checkout firstbranch
Switched to branch 'firstbranch'

$ ls
helloworld.sh

Добавляем код в helloworld.sh:

$ echo "hello world, from firstbranch" >> helloworld.sh

$ cat helloworld.sh
hello world, from master.
hello world, from firstbranch

Вернитесь к master:

$ git checkout master
M       helloworld.sh
Switched to branch 'master'

Проверьте содержимое helloworld.sh в ветке master:

$ cat helloworld.sh
hello world, from master.
hello world, from firstbranch

Это меня совершенно удивило! Я думал, что изменения в firstbranch не будут здесь отражены, пока я не сделаю слияние. Я даже не зафиксировал свои изменения в firstbranch, но они все еще появляются в ветке master. Что тут происходит?


person Srikanth    schedule 13.06.2014    source источник
comment
Потому что вы не зафиксировали изменения, а измененный файл остается измененным. вы должны зафиксировать свои изменения, чтобы внести изменения в git, или вы должны спрятать их. если вы используете git status в обеих ветвях, вы заметите, что файл изменен в обеих.   -  person Jepessen    schedule 13.06.2014
comment
Этот вопрос определенно был бы задан на Stack Overflow раньше. Если кто-то может найти хороший канонический, отметьте его как дубликат.   -  person    schedule 13.06.2014


Ответы (2)


Вы не зафиксировали свои изменения в файле перед переключением веток. Правильным способом сделать это было бы

echo "hello world, from firstbranch" >> helloworld.sh
git commit
git checkout master

Настоятельно рекомендуется к прочтению

person Community    schedule 13.06.2014
comment
Кроме того, git предотвратил потерю изменений. Если вы запустите git status, вы увидите, что helloworld.sh теперь содержит неустановленные изменения. Состояние мастера не изменилось. - person pmr; 13.06.2014

Поскольку вы не зафиксировали свои изменения в первой ветке, когда вы переключили свою ветку, она сохранила изменения. Думайте о любых незафиксированных изменениях как о фиксации поверх текущей истории изменений, которая еще не была применена к определенной ветке. Эффект от этого заключается в том, что любая ветка, на которую вы переходите, где нет проблем с применением изменений к ветке, отображается как модификация ветки.

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

person css    schedule 13.06.2014
comment
Грязная рабочая копия никоим образом не похожа на фиксацию и не очень хороший способ понять, почему изменения в файле остаются в рабочей копии при переключении ветвей. . - person ; 13.06.2014