Git: Разве изменения не должны оставаться в пределах их ветви? - PullRequest
1 голос
/ 09 июня 2011

Я относительно новичок в использовании Git.Вот что я сделал до сих пор:

$ git branch
* master

$ git status
# On branch master
nothing to commit (working directory clean)

$ git branch mywork
$ git checkout mywork
$ git branch
* mywork
  master

...modify some files...

$ git status
# On branch mywork
# 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:   file1.html
#   modified:   file2.html
#
no changes added to commit (use "git add" and/or "git commit -a")

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

$ git checkout master
M   file1.html
M   file2.html
Switched to branch '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:   file1.html
#   modified:   file2.html
#
no changes added to commit (use "git add" and/or "git commit -a")

Я что-то не так делаю?Или я неправильно понимаю, как я использую Git?

Ответы [ 4 ]

4 голосов
/ 09 июня 2011

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

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

git status различает индекс и рабочий каталог следующим образом.

  • Changes to be committed: указывает на изменения в индексе
  • Changed but not updated: указывает на изменения в рабочем каталоге файлов, которые уже были добавлены в хранилище (и впоследствии не игнорируются)
  • Untracked files: указывает на измененияв рабочем каталоге к файлам, которые не уже добавлены в репозиторий

Если у вас есть несколько изменений, которые вы хотите сохранить на данный момент, но которые не гарантируютих собственная ветвь, используйте git stash.Это механизм git для создания чрезвычайно легкой ветки с одним коммитом.Со страницы man (выделено мое):

Используйте git stash, если вы хотите записать текущее состояние рабочего каталога и индекса , но хочу вернуться в чистый рабочий каталог.Команда сохраняет ваши локальные изменения и возвращает рабочий каталог в соответствие с HEAD commit.

3 голосов
/ 09 июня 2011

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

Использование:

git checkout mywork
# Modify files

git add . # Adds all edited files to the repository
git commit -m "Message about the changes"

git checkout master

Вы можете найти много информации о Git на The Git Book

1 голос
/ 09 июня 2011

В несколько более простых английских, чем в других (правильных) ответах: git checkout не топает файлы, о которых не знает. Поскольку вы не сделали git add для file1.html и file2.html, git не знает о них и поэтому не удаляет их при смене веток.

Если бы вы набрали add и commit их на ветке mywork, они бы ушли, когда вы проверите мастера, и вернулись, когда вы проверили мою работу.

1 голос
/ 09 июня 2011

потому что вы не зафиксировали их в ветке mywork.как только вы подтвердите их и извлечете основную ветку, вы не увидите, что изменения

вы найдете этот ТАК очень полезный пост

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...