Измененные файлы в ветке git перетекают в другую ветку - PullRequest
44 голосов
/ 29 октября 2008

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

Например:

Состояние git в ветке git-build:

# On branch git-build
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   cvsup_current
#

Переключиться на основную ветку

[root@redbull builder_scripts (git-build)]# git co master
M       builder_scripts/cvsup_current
Switched to branch "master"

git status в главной ветке

[root@redbull builder_scripts (master)]# git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   cvsup_current
#

Почему этот файл отображается как измененный в основной ветке, даже если он был изменен в ветви git-build?

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

Кто-нибудь получил подсказку?

Ответы [ 5 ]

59 голосов
/ 29 октября 2008

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

Необходимо помнить, что файл был не изменен в ветке git-build. Он был изменен только в вашей рабочей копии.

Только когда вы фиксируете изменения вносятся обратно в ту ветку, которую вы отметили

39 голосов
/ 29 октября 2008

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

git stash #work saved
git checkout master
#edit files
git commit
git checkout git-build
git stash apply #restore earlier work

git stash хранит стек изменений, так что вы можете безопасно хранить несколько контрольных точек. Вы также можете дать им имена / описания. Полная информация об использовании здесь .

12 голосов
/ 29 октября 2008

Это стандартное поведение git.

Вы можете использовать флаг -f , чтобы оформить заказ, если хотите, «очистить заказ».

9 голосов
/ 29 октября 2008

Измененные файлы не помещаются в репозиторий, пока вы не добавите и не подтвердите их. Если вы вернетесь к ветке темы и подтвердите файл, он не появится в основной ветке.

1 голос
/ 11 июня 2015
  • Это не так, как ветви git зависят друг от друга, но и они не иметь полной базы кода отдельно для каждой ветви.
  • Для каждого коммита Git хранит объект, который содержит указатель на изменения. Таким образом, каждая ветвь указывает на свой последний коммит, а HEAD указывает на ветвь, в которой вы находитесь.
  • Когда вы переключаете ветку, указатель HEAD указывает на это конкретный коммит филиала. Так что, если есть измененные файлы, Поведение по умолчанию - копировать их.

Вы можете сделать следующие вещи, чтобы преодолеть эту проблему.

  1. Используйте параметр -f, чтобы игнорировать изменения.

Если вы хотите сохранить изменения:

  1. Зафиксируйте изменения локально в той же ветке, а затем переключите ветви.
  2. Используйте git stash, переключите ветку, сделайте свою работу, вернитесь к оригинальная ветка и сделать git stash apply.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...