2013-09-09 2 views
3

Я использую bash по умолчанию, который поставляется с Git, я создал главную ветвь (не голый) и сделал из нее ветку (назовем ее ветвью new_feature).Объяснение того, как работает Git checkout

Я играю с ветвлением, и я добираюсь до точки, где я тестирую команду git checkout. Как я понял, команда checkout позволяет переключиться с одной ветви на другую. Кроме того, из того, что я понял, команда checkout не позволяет вам переключаться с одной ветви на другую, если рабочий каталог загрязнен (т. Е. Имеет неустановленные изменения).

Теперь у меня есть файл с именем index.html как в моей основной ветке, так и в моей ветке свойств. Оба файла в двух ветвях имеют одинаковый контент. Теперь вот что я сделал, и это смутило меня.

Я нахожусь в моей ветке свойств (в настоящее время оба файла имеют точный контент), если я отредактирую содержимое index.html, скажем, тег заголовка, и я не выполнил его, если я выдаю команду git checkout master, Git does позвольте мне переключиться на главную ветку, и что более интересно, так это если я выдаю команду git status в основной ветке, то неустановленные изменения, которые я сделал в ветви функции, копируются в главную ветку. Разве это не разрушительно?

То, что меня больше смутило, заключается в том, что в течение того времени, когда 2 файла на обеих ветвях, мастер и ветвь признаков, не имеют одного и того же содержимого, если я внутри ветки функции и редактирую содержимое файл index.html, скажем, тег заголовка, теперь, если я выдаю команду git checkout master, это не позволяет мне сделать переключатель, потому что он обнаружил, что мое рабочее дерево или каталог грязно.

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

Но если 2 файла на двух разных ветвях имеют различный контент, если вы находитесь на одной ветке, сделали редактирование этого файла и выпустите команду checkout, чтобы переключиться на другую ветку, Git не позволяет вам делать переключатель, потому что по какой-то причине он обнаруживает, что рабочее дерево загрязнено.

Является ли мое понимание правильным или неправильным? Также я могу немного пояснить, почему мое понимание неверно или правильно.

+1

Я капитализировал ваши предложения и исправил для вас правописание. «Coz» не является технически реальным словом, даже несмотря на то, что это неправильное написание и аббревиатура для «из-за». –

+1

@Cupcake Я почтительно предполагаю, что JPlus2 способен решить для себя/своего желаемого уровня формальности и правильности. Ваш шаг через десять минут и «исправление» текста поражает меня, как, ну, грубо и, честно говоря, высокомерно.(Да, я понимаю, что я подвергал себя аналогичному обвинению: P) Комментарий, поясняющий, что он/она будет более склонным воспринимать более серьезно и, следовательно, иметь больше шансов получить хороший ответ и предположить, что она/он отредактировал сам вопрос с этим, было бы более уместно, ИМХО. Приветствия. – Edward

+0

[SLaks имеет правильный ответ] (http://stackoverflow.com/a/18690485/1256452), но это может помочь, если вы думаете о git, позволяющем вам переносить изменения, которые вы начали «раньше», вы поняли, что находитесь на неправильной ветвью, к правильной ветке, выполнив «git checkout». Лично я думаю, что это было бы менее запутанным, если бы это была другая команда (например, «git oops-forget-to-switch-branch-ранее-do-it-now-if-safe»), но она * совершенно безопасна , сначала это немного удивительно, что он позволяет вам это делать. – torek

ответ

3

Неустановленные изменения не являются частью git.
git checkout не влияет на файлы, которые не находятся в git (независимо от того, являются ли они неустановленными изменениями или gitignored-файлами).

Во избежание потери данных git checkout предоставит вам ошибку, если необходимо изменить файл с неустановленными изменениями.

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

+0

Также, вероятно, следует упомянуть, что проверка не является «разрушительной» как таковой, потому что неустановленный код не был проверен ни на одной ветке. Это подразумевается и очевидно, как только вы это понимаете, но ОП беспокоился о том, что филиал функции сбивал его мастерскую ветвь, когда на самом деле такой вещи на самом деле не произошло. – slebetman

+0

Точно, что я имел в виду сальбетман, я волновался, если моя ветка свойств сбила мою ведущую ветку. Спасибо за ответ. @ Спасибо за ответ, я каким-то образом понял, что вы имеете в виду, последнее, хотя, почему git разрешил мне переключать ветку, если мой файл index.html как для содержимого главной, так и для основной ветви одинаковый, и Я редактирую index.html на ветке функций, и я переключаюсь на master, почему git разрешил это? это то, что меня больше всего смущает, извинения за хлопот. – Jplus2

+0

@ Jplus2: Поскольку они одинаковы, коммутационные ветви не влияют на этот файл. Поэтому git игнорирует ваши неустановленные изменения. В частности, пока вы не выполните git commit, ваши изменения не будут в какой-либо отрасли. – SLaks