2009-09-21 4 views
75

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

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

(Да, я знаю, что это не то, как git предназначен для работы, но это моя ситуация!) Любые идеи очень ценятся.

+1

похоже на . и hey, git отлично работает в вашем случае, я бы не сказал, что он не предназначен для такого рабочего процесса. это! – knittl

+0

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

ответ

132

Прежде всего переход к другой ветви, основанной на текущей ГОЛОВЕ выполняется следующим образом:

git checkout -b newbranch 

Фиксировать все изменения (не предполагая вновь добавленных файлов, в противном случае git add их):

git commit -a 

Вернитесь к главной ветви:

git checkout master 

ранее незнакомец все изменения произойдут на ветке newbranch, и мастер все равно будет находиться в состоянии, в котором он был без этих изменений.

+5

* Объяснение: * содержимое рабочего репозитория и поэтапные изменения не принадлежат ни одной ветви. Простое создание новой ветви с HEAD (последняя ревизия) достаточно для того, чтобы новая фиксация продолжалась только что созданная branch ''. –

+0

Спасибо, ребята, я думал, что переход на новую ветку может стереть изменения. Исходя из фона SVN, я не думал, что такое переключение возможно. Тестирование этого сейчас. – corydoras

+0

Идеально, действительно, как вы Git немного круто (: – corydoras

13

Вы всегда можете занести свои изменения.

git stash 
git checkout -b bravenewmaster 
git stash apply 

Также имейте в виду, что если вы поручаете к «неправильной» ветви, вы всегда можете переместить эту ветку обратно, потому что отрасль не что иное, как указатель на коммит.

+3

Зачем беспокоиться, если вы собираетесь немедленно повторно применить те же изменения? Вы также можете просто выполнить git checkout -b bravenewmaster. Это меньше печатает и не будет трогать все измененные файлы без необходимости. –

+1

Ну, я не пробовал, но я предположил, что 'git' по какой-то причине не позволяет' git checkout -b', когда есть изменения. В противном случае, почему вопрос? ;-) –

+0

На самом деле, для чего я могу сказать: «Я хочу эффективно отменить все эти изменения людей, но сохранить их в другой шанс, поэтому, если этот человек хочет, чтобы их изменения могли переключиться на эту ветку». нет разветвления и применения. –

13

Этот метод полезен:

git checkout -B <new_branch> <start point> 

Где:

  • <new_branch> ваша новая ветвь (например my_branch)
  • <start point> Ваш стартовый филиал (master в вашем случае)
  • -B создает новую ветку, начиная с <start point>, i f он уже существует, а затем перезагружает его (он не сбой как -b, когда ветвь уже существует)
  • иногда -m может быть полезно указать при переключении ветвей, это будет выполнять трехстороннее слияние между текущей ветвью, вашей рабочей содержимое дерева (полезно для сценариев).

См.: man git-checkout для получения более подробной информации.

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