Путаница в создании веток в git - PullRequest
1 голос
/ 29 ноября 2011

После внесения нескольких изменений в ветку master я решил работать с новой ветки. Я сделал git checkout -b new_branch_name, и новая ветка была создана и проверена. git status показал изменения, которые я внес в master.

Мне было любопытно, были ли мои изменения теперь в обеих ветках (master и new_branch_name) или просто new_branch_name. Поэтому я проверил master и заметил, что мои изменения тоже были там. Поэтому я отменил эти изменения с git checkout -- fileThatChanged. Изменения действительно исчезли с master.

К сожалению, проверка new_branch_name и запуск git status показали, что мои изменения были также отменены из этой ветви.

Я бы хотел понять, что случилось, и как я могу избежать этого в будущем.

Одним из решений является создание / извлечение новой ветки перед началом работы.

Ответы [ 4 ]

5 голосов
/ 29 ноября 2011

Вы никогда не фиксировали свои изменения ни в одной из веток. То есть, если вы сделали это:

$ git status

И увидел что-то вроде этого:

# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   myfile.txt
#

Изменения в «myfile.txt» не «существуют» ни в одной ветви - они есть только в вашей локальной рабочей копии. Они не попадают в ветку, пока вы не добавите их в хранилище.

Если бы в этот момент мне нужно было набрать:

$ git checkout myfile.txt

Это уничтожило бы мои изменения (и вернуло файл к тому, на что он был похож при последнем коммите в моей текущей ветке).

Если бы я хотел зафиксировать эти изменения в новой ветке, я мог бы сделать что-то вроде этого:

$ git checkout -b new_branch_name
$ git add myfile.txt
$ git commit -m "made some changes"
3 голосов
/ 29 ноября 2011

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

См. также:

git file transition

1 голос
/ 29 ноября 2011

Как говорит Жаворонок, эти изменения не были зафиксированы.

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

Когда вы закончите, вы можете использовать git stash pop для восстановления вашего рабочего каталога.

1 голос
/ 29 ноября 2011

Измененные изменения в вашем рабочем каталоге / индексе (то, что вы видите в состоянии git) не связаны с веткой, а являются общими. Поэтому, когда вы переключаете ветки, изменения все равно будут в новой ветке. Если вы отмените изменения, это будет видно при переключении веток. Вы должны либо зафиксировать, либо спрятать перед сменой ветки.

...