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

2667

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

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

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

Теги:
git-branch
git-reset
git-stash

5 ответов

3148
Лучший ответ

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

git checkout -b <new-branch>

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

git add <files>

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

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

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

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

  • 12
    Просто чтобы убедиться, мне нужно зафиксировать незавершенную функцию ДО того, как я сброслю свою первоначальную ветку? Или эти незафиксированные файлы будут сохранены независимо от фиксации?
  • 174
    К вашему сведению: изменения в рабочем каталоге и внесенные в индекс изменения не относятся к ветви. git checkout -b <new branch> изменяется там, где эти изменения заканчиваются.
Показать ещё 16 комментариев
257

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

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

    $ git stash

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

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

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

  • 45
    Если другая ветвь уже существует, вы можете просто переключиться на нее с помощью checkout, а затем git stash apply .
  • 0
    Копить совсем не безопасно.
Показать ещё 13 комментариев
38

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

  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 эта конфигурация будет потеряна.

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

  • 5
    Это отвечает на вопрос, который немного отличается от того, что задал оператор. Я решил разместить этот ответ здесь, потому что это то, куда Google привел меня, когда я искал ответ. Актуальный вопрос, который касается этой ситуации , здесь .
16

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

git cherry-pick <commitID>

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

  • 2
    Хорошее решение для переноса частичных изменений в новую ветку ... так как вы можете зафиксировать то, что вы хотите сейчас, спрятать все другие изменения, проверить ветку, из которой вы хотите ветвиться, cherry-pick, которая фиксирует новую ветку, вернуться к исходной ветке, сделайте полный сброс назад коммита, затем сделайте трещотку, добавьте, зафиксируйте и пойте аллилуйя.
  • 0
    @Мередит, хаха, ты что-то в этом роде. Это здорово, если вы не планируете свои изменения заранее ... и кто это делает;)
1

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

git stash 
git checkout master
git checkout -b "New_branch"
git stash apply

Ещё вопросы

Сообщество Overcoder
Наверх
Меню