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

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

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

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

Ответ 1

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

git checkout -b <new-branch>

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

git add <files>

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

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

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

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

Ответ 2

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

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

    $ git stash

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

    $ git stash branch <new-branch> [email protected]{0}

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

git cherry-pick <commitID>

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

Ответ 6

Я использовал @Robin answer & перечисление всего, что я сделал,

git status                               <-- review/list uncommitted changes
git stash                                <-- stash uncommitted changes
git stash branch <new-branch> [email protected]{1}  <-- create a branch from stash
git add .                                <-- add local changes
git status                               <-- review the status; ready to commit
git commit -m "local changes ..."        <-- commit the changes
git branch --list                        <-- see list of branches incl the one created above
git status                               <-- nothing to commit, working tree (new-branch) is clean
git checkout <old-branch>                <-- switch back

! Если в репо более одного тайника, посмотрите, какой из них применить к новой ветке:

git stash list  
  [email protected]{0}: WIP on ...  
  [email protected]{1}: WIP on ...

и осмотреть индивидуальный тайник,

git stash show [email protected]{1}

Или проверить все тайники одновременно:

git stash list -p

Ответ 7

На самом деле есть действительно простой способ сделать это с помощью GitHub Desktop, теперь я не думаю, что это была функция раньше.

Все, что вам нужно сделать, - это переключиться на новую ветку в GitHub Desktop, и она предложит вам оставить свои изменения в текущей ветке (которая будет спрятана) или перенести ваши изменения с вами в новую ветку. Просто выберите второй вариант, чтобы внести изменения в новую ветку. Затем вы можете зафиксировать как обычно.

GitHub Desktop

Ответ 8

Это может быть полезно для всех, кто использует инструменты для GIT

Команда

Переключить ветку - она переместит ваши изменения в новую ветку. Затем вы можете зафиксировать изменения.

 $ git checkout -b <new-branch>

TortoiseGit

Щелкните правой кнопкой мыши по вашему хранилищу и затем используйте TortoiseGit-> Switch/Checkout

enter image description here enter image description here

SourceTree

Используйте кнопку "Оформить заказ" для переключения ветки. Вы увидите кнопку "Оформить заказ" вверху после нажатия на ветку. Изменения из текущей ветки будут применены автоматически. Тогда вы можете их зафиксировать.

enter image description here