2010-02-02 3 views
24

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

У меня есть ветка master, и я создал ветвь функции profiles, где я выполняю определенную работу с профилями. Во время работы над профилями я изменил 5 или 6 файлов и добавил еще 5 или 6 новых файлов. Мне нужно было вернуться к ветке master, чтобы исправить ошибку и заметил все новые файлы и измененные файлы там, где они есть. Я предполагаю, что это имеет смысл, так как git не собирается удалять ненужные файлы из ветки master и возвращать их для моей ветки profiles, так как они, по сути, не отслеживаются. Но как насчет изменений в существующих файлах. Почему они появляются в мастер-ветке.

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

Любая помощь приветствуется. Спасибо

ответ

33

«Я еще не готов совершать изменения на местном уровне».

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

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

Я часто делаю:

git add .; git commit -a -m 'WIP' 

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

git add .; git commit --amend 

обновить свой «WIP» на месте. Когда я, наконец, готов к действительной фиксации, я просто:

git reset --soft HEAD~; git reset 

и теперь я могу тщательно контролировать, какова будет окончательная фиксация.

+1

У меня ужасная память и мне нравится использовать git, чтобы увидеть, где я нахожусь на моей работе (и с магией ее еще проще, и включен в мой рабочий процесс). В самом деле, вы решение имеет смысл. Просто делайте это чаще. Просто нужно немного настроить мой рабочий процесс. спасибо – Clarence

+2

Только для уточнения, есть ли какая-либо предполагаемая разница между 'git reset --soft HEAD ~; git reset' и 'git reset HEAD ^'? Насколько я могу судить, они оба сбрасывают HEAD и индекс родительской части «WIP», готовую сделать реальную фиксацию с использованием некоторых или всех изменений рабочего дерева, но я, возможно, пропустил тонкость. –

+2

@Charles Bailey: «--soft не затрагивает индексный файл или рабочее дерево вообще, но требует, чтобы они были в хорошем состоянии. Это оставляет все ваши измененные файлы« Изменения должны быть зафиксированы », поскольку статус git Это." если вы используете «git reset HEAD ^», вы не получите этого фатального: не можете выполнить мягкий сброс в середине слияния. – maletin

5

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

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

Вы правы в отношении наилучшего подхода, хотя, по-моему, переключение ветвей в моем опыте является одним из наиболее распространенных видов использования git stash.

3

Похоже, вы создали ветку с git branch profiles, но не переключились на нее, так что вы остались в master и получили изменения файла, когда вы совершили фиксацию.

После создания ветки необходимо явно переключиться на нее с помощью git checkout (просто создайте новую ветку на лету и переключитесь на нее за один шаг, используя git checkout -b).

Если у вас есть изменения, которые вы не хотите потерять (или совершить в текущей ветке), но вместо того, чтобы поместить в другой ветви, сделайте следующее:

git add -A 
git stash 
git checkout <other branch> 
git stash pop 

Более подробную информацию о git stash доступна из git-scm.com

Смежные вопросы