Путаница с Git Checkout - PullRequest
       10

Путаница с Git Checkout

3 голосов
/ 02 июля 2010

Я запутался в поведении git checkout. документация о git checkout гласит:

- объединить

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

Но я провел небольшой тест, который не ведет себя так, как сказано в жирной части. То есть:

  1. Я создаю GIT-репо
  2. создайте каталог и файл с некоторым содержимым и зафиксируйте его в главной ветке.
  3. Создать еще одну ветку "testbranch"
  4. изменить содержимое файла в мастере. Но не совершал.
  5. переключен на «тестбранк».
  6. Теперь измененные и неподтвержденные изменения из главной ветви приходят в тестовую ветвь!

Разве не должно было произойти сбой, если у меня есть локальные изменения и я хочу переключиться на ветку?

Ниже приведен список команд для воспроизведения этого поведения:

sabya@SABYA-PC e:/test/merge_test
$ git init
Initialized empty Git repository in E:/test/merge_test/.git/

sabya@SABYA-PC e:/test/merge_test (master)
$ mkdir src

sabya@SABYA-PC e:/test/merge_test (master)
$ echo "Hello World" > src/a.txt

sabya@SABYA-PC e:/test/merge_test (master)
$ cat src/a.txt
Hello World

sabya@SABYA-PC e:/test/merge_test (master)
$ git add src

sabya@SABYA-PC e:/test/merge_test (master)
$ git commit -m "say hello"
[master (root-commit) 939f6e0] say hello
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 src/a.txt

sabya@SABYA-PC e:/test/merge_test (master)
$ git branch testbranch

sabya@SABYA-PC e:/test/merge_test (master)
$ echo "Changed content" > src/a.txt

sabya@SABYA-PC e:/test/merge_test (master)
$ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   src/a.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

sabya@SABYA-PC e:/test/merge_test (master)
$ git checkout testbranch
M       src/a.txt
Switched to branch 'testbranch'

sabya@SABYA-PC e:/test/merge_test (testbranch)
$ cat src/a.txt
Changed content

Может кто-нибудь объяснить это?

Ниже вывод моей версии git:

sabya@SABYA-PC e:/test/merge_test (testbranch)
$ git --version
git version 1.7.0.2.msysgit.0

Ответы [ 2 ]

5 голосов
/ 02 июля 2010

Ключом является " разница между текущей веткой и ветвью, на которую вы переключаетесь "

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

Пример

git init
vim file
# hack hack hack
git add .
git commit -m "1"
git checkout -b branch
vim file
# hack hack hack
git commit -a -m "2"
git checkout master
vim file
# hack hack hack
git checkout branch

Здесь у вас должна быть ошибка.

3 голосов
/ 02 июля 2010

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

sabya@SABYA-PC e:/test/merge_test (master)
$ git checkout testbranch
M       src/a.txt
Switched to branch 'testbranch'

Обратите внимание, как написано M src/a.txt?M обозначает измененный файл.

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

...