Создать ветку Git с текущими изменениями


851

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

Как я могу создать новую ветку и взять все эти изменения со мной, не пачкая мастер ?




4
Да, это дублирующие вопросы, но формулировка настолько отличается, что я думаю, что это полезно сохранить. Обратите внимание на ключевые слова здесь: branch current changesпротив existing uncommited branch. Любой, кто говорит по-английски, сразу увидит, что они одинаковы, но поисковые системы, вероятно, не будут. Сохраните этот вопрос.
Скотт Биггс

Ответы:


691

Если вы еще не сделали ни одного коммита, достаточно будет только (1: ветка) и (3: извлечение).
Или в одной команде:git checkout -b newBranch

Как упоминалось в git resetсправочной странице :

$ git branch topic/wip     # (1)
$ git reset --hard HEAD~3  # (2)  NOTE: use $git reset --soft HEAD~3 (explanation below)
$ git checkout topic/wip   # (3)
  1. Вы сделали некоторые коммиты, но понимаете, что они были преждевременны, чтобы быть в " master" ветке. Вы хотите продолжить полировать их в ветке темы, поэтому создайте topic/wipветку " " из текущей HEAD.
  2. Перемотайте masterветку, чтобы избавиться от этих трех коммитов.
  3. Переключитесь на " topic/wip" ветку и продолжайте работать.

Примечание: из-за «разрушительного» эффекта git reset --hardкоманды (она сбрасывает индекс и рабочее дерево. Любые изменения в отслеживаемых файлах в рабочем дереве, так как <commit>они отбрасываются), я бы предпочел:

$ git reset --soft HEAD~3  # (2)

Это позволит убедиться, что я не потеряю приватный файл (не добавленный в индекс). Вариант не будет касаться индексного файла , ни рабочего дерева на всех (но сбрасывает голова к , так же , как все режимы делают).
--soft<commit>


С Git 2.23+ , то новая командаgit switch создаст филиал в одной строке (с тем же рода reset --hard, так что берегитесь его действия):

git switch -f -c topic/wip HEAD~3

6
Вероятно, также стоит отметить, что это не будет хорошей идеей, если вы разместите тематический материал в своей основной ветке в репозитории, из которого извлекают другие люди. Или, по крайней мере, если вам нужно сделать перезагрузку, вам нужно будет сказать людям, что это то, что вы делаете, так что предупреждения от их следующего нажатия не слишком шокируют.
Эндрю Уокер

39
Примечание для будущих читателей: читайте снизу вверх (или обязательно прочитайте все это). git reset --hardуничтожит ваши изменения, и если они еще не зафиксированы, они не подлежат восстановлению! Возможно, вам просто нужноgit checkout -b …
Конрад Мейер

3
@ConradMeyer Хороший вопрос. Я отредактировал ответ и поставил git checkout -bпервый.
VonC

5
Почему тема / ветка ?? почему не просто фирменное имя, есть ли особая причина для этого наименования? просто интересуюсь.
Сэм Стоилинга

1
@ Это просто соглашение об именах пространств имен (способ легко классифицировать ветви, используя иерархические имена ветвей для определения пространств имен): stackoverflow.com/a/2527436/6309 . Например, для вопросов: randyfay.com/content/… . Вам не нужно использовать иерархию при именовании ваших ветвей. topic_wipбудет работать тоже;)
VonC

269

Как указано в этом вопросе: Git: Создать ветку из непомеченных / незафиксированных изменений на master : stash не нужен.

Просто используйте:

git checkout -b topic/newbranch

Любая незавершенная работа будет перенесена в новую ветку.

Если вы попытаетесь нажать, вы получите следующее сообщение

Неустранимый: текущая функция ветвления / NEWBRANCH не имеет восходящей ветки. Чтобы протолкнуть текущую ветку и установить пульт в качестве восходящего, используйте

git push --set-upstream origin feature/feature/NEWBRANCH

Просто сделайте, как предложено, чтобы создать ветку удаленно:

git push --set-upstream origin feature/feature/NEWBRANCH


3
Вы получите ошибку «Нет вышестоящей ветви», только если вы нажмете на новую ветвь, а не при фиксации новой работы.
сэм

2
@sam Я изменил ответ соответственно
Ник Кеннеди

73

Следуй этим шагам:

  1. Создайте новую ветку:

    git branch newfeature
    
  2. Оформить заказ в новой ветке: (это не сбросит вашу работу.)

    git checkout newfeature
    
  3. Теперь зафиксируйте свою работу в этой новой ветке:

    git commit -s
    

Выполнение вышеописанных шагов позволит сохранить исходную ветку в чистоте, и вам не нужно делать никаких «git reset --hard».


3
Что '-s' делает на шаге 3?
Скотт Биггс

12
@ScottBiggs Это ненужно, но некоторые люди следуют этой практике. Это сокращение от "--signoff" и добавляет ваше имя пользователя в коммит для будущих людей, просматривающих журналы, чтобы знать, что вы потворствовали этому коммиту.
Фрэнк Брайс

5
Хороший ответ, но нет необходимости -sв шаге 3.
Мохаммед Али

Я узнал что-то новое из комментария, спасибо @FrankBryce
Kasparov92

30

Поскольку вы еще не сделали никаких коммитов, вы можете сохранить все свои изменения в тайнике, создать и переключиться на новую ветвь, а затем вставить эти изменения обратно в рабочее дерево:

git stash  # save local modifications to new stash
git checkout -b topic/newbranch
git stash pop  # apply stash and remove it from the stash list

9
или, как VonC указал «git checkout -b newbranch» и пропустил тайник
willcodejavaforfood

@Will: Я думал, что создание новой ветви перезапишет любые незафиксированные изменения, которые у вас были, но если это не так, да, вы можете пропустить тайник.
эфир

1
Я попробовал это, и это работало отлично, мерзавец очень вдумчивый и не будет перезаписывать любые локальные изменения
willcodejavaforfood

2
Я предполагаю, что это была опечатка, но только один на один, а git stash pushне команда. Вы, вероятно, хотели бы использовать git stashили git stash save. Если вы хотите включить неотслеживаемые файлы в тайник, используйте --include-untrackedопцию. Аналогичным образом, если вы хотите включить как неотслеживаемые, так и игнорируемые файлы в тайник, используйте --addвместо этого параметр.
Шесть

если вы уже создали ветку, это полезно.
Конечно,

13

Чтобы добавить новые изменения в новую ветку и нажать на удаленный:

git branch branch/name
git checkout branch/name
git push origin branch/name

Часто я забываю добавить исходную часть для push и запутываюсь, почему я не вижу новую ветку / commit в bitbucket

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.