Переместите существующую, незафиксированную работу на новую ветку в Git

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

Как перенести существующие незафиксированные изменения в новую ветку и reset мой текущий?

Я хочу reset мою текущую ветку, сохраняя существующую работу над новой функцией.

2540
задан Dane O'Connor 08 сент. '09 в 18:57
источник поделиться
5 ответов

Используйте следующее:

git checkout -b <new-branch>

Это оставит вашу текущую ветку как есть, создаст и проверит новую ветку и сохранит все ваши изменения. Затем вы можете совершить фиксацию с помощью:

git add <files>

и передайте новую ветку с помощью:

git commit -m "<Brief description of this commit>"

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

У вас нет reset исходной ветки, она остается такой, какая есть. Последняя фиксация на <old-branch> будет по-прежнему одинаковой. Поэтому вы checkout -b и затем зафиксируете.

2999
ответ дан knittl 08 сент. '09 в 18:59
источник поделиться

В качестве альтернативы:

  • Сохраните текущие изменения в темпе:

    $ git stash

  • Создайте новую ветку на основе этого тайника и переключитесь на новую ветку:

    $ git stash branch <new-branch> stash@{0}

Совет. Используйте клавишу табуляции, чтобы уменьшить ввод имени кошелька.

257
ответ дан Robin Qiu 19 июня '15 в 3:18
источник поделиться

Если вы делали коммиты на своей основной ветке во время кодировки, но теперь вы хотите переместить эти коммиты в другую ветку:

  1. Скопируйте текущую историю на новую ветку, внеся также любые незафиксированные изменения:

    git checkout -b <new-feature-branch>
    
  2. Теперь заставьте исходную "грязную" ветвь откатить: (без переключения на нее)

    git branch -f <previous-branch> <earlier-commit-id>
    

    Например:

    git branch -f master origin/master
    

    или если вы сделали 4 фиксации:

    git branch -f master HEAD~4
    

Предупреждение. Похоже, что git branch -f master origin/master сбросит информацию отслеживания для этой ветки. Поэтому, если вы сконфигурировали master ветвь, чтобы нажать ее куда-то, кроме origin/master эта конфигурация будет потеряна.

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

37
ответ дан joeytwiddle 12 февр. '16 в 10:44
источник поделиться

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

git cherry-pick <commitID>

Здесь вы можете многое сделать с помощью cherry-pick, как описано здесь, но это может быть прецедентом для вас.

16
ответ дан password 30 нояб. '15 в 23:58
источник поделиться

Общий сценарий следующий: я забыл создать новый филиал для новой функции и выполнял всю работу в старой ветки функции. Я выполнил всю "старую" работу в мастер-ветке, и хочу, чтобы моя новая ветвь развивалась от "мастера". Я не сделал ни одной фиксации своей новой работы. Вот структура ветки: "master" → "Old_feature"

git stash 
git checkout master
git checkout -b "New_branch"
git stash apply
1
ответ дан Alex Burov 13 авг. '18 в 19:07
источник поделиться

Другие вопросы по меткам