перемещение измененных файлов в другую ветку для регистрации - PullRequest
358 голосов
/ 28 августа 2011

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

Ответы [ 5 ]

616 голосов
/ 28 августа 2011

git stash ваш друг.

Если вы еще не сделали коммит, просто запустите git stash.Это сохранит все ваши изменения.

Переключитесь на ветку, в которую вы хотите внести изменения, и запустите git stash pop.

Существует множество вариантов использования git stash.Это, безусловно, одна из наиболее полезных причин.

Пример:

# work on some code
git stash
git checkout correct-branch
git stash pop
221 голосов
/ 28 августа 2011

Если вы еще не зафиксировали свои изменения , просто используйте git checkout, чтобы перейти к новой ветви, а затем зафиксировать их как обычно - изменения в файлах не привязаны к конкретной ветви, пока вы не подтвердите их..

Если вы уже уже зафиксировали свои изменения:

  1. Введите git log и запомните SHA коммита, который вы хотите переместить.
  2. Проверьте ветвь, в которую вы хотите переместить коммит.
  3. Введите git cherry-pick SHA, заменяя SHA сверху.
  4. Вернитесь к исходной ветке.
  5. Использованиеgit reset HEAD~1 для сброса обратно до фиксации с неверной ветвью.

cherry-pick берет данный коммит и применяет его к текущему извлеченному заголовку, что позволяет вам скопировать коммит вновый филиал.

34 голосов
/ 20 ноября 2014

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

git stash
git stash branch new-branch

Согласно документации gash stash :

филиал <branchname> [<stash>]

Создает и извлекает новую ветвь с именем <branchname>, начиная с коммит, при котором <stash> был изначально создан, применяет изменения записываются в новое рабочее дерево и индекс.

10 голосов
/ 30 января 2018

К сожалению, это происходит со мной довольно регулярно, и я использую git stash, если я осознал свою ошибку до git commit и использую git cherry-pick, в противном случае обе команды довольно хорошо объясняются в других ответах

Iхотите добавить пояснение для git checkout targetBranch: , эта команда сохранит ваш рабочий каталог и промежуточный снимок, только если targetBranch имеет ту же историю, что и ваша текущая ветвь

Если у вас нетВы уже зафиксировали свои изменения, просто используйте git checkout, чтобы перейти к новой ветви , а затем зафиксируйте их как обычно

@ Заявление Амбер не ложно, когда вы переходите к newBranch , git checkout -b newBranch, создан новый указатель, который указывает на тот же коммит, что и ваша текущая ветвь.
Фактически, если у вас есть другая ветвь, которая делится историей с вашей текущей ветвью(оба указывают на один и тот же коммит) вы можете «переместить свои изменения» на git checkout targetBranch

Однако, как правило, разные ветви означают разную историю, и Git wiЯ не позволю вам переключаться между этими ветками с грязным рабочим каталогом или промежуточной областью.в этом случае вы можете сделать git checkout -f targetBranch (очистить и выбросить изменения) или git stage + git checkout targetBranch (очистить и сохранить изменения), просто запуск git checkout targetBranch выдаст ошибку:

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

1 голос
/ 01 апреля 2019

A мягкий сброс git вернет зафиксированные изменения в ваш индекс. Затем проверьте ветку, которую вы намеревались зафиксировать. Затем git commit с новым сообщением фиксации.

  1. git reset --soft <commit>

  2. git checkout <branch>

  3. git commit -m "Commit message goes here"

С git docs :

git reset [<mode>] [<commit>] Эта форма сбрасывает текущий заголовок ветви и, возможно, обновляет индекс (сбрасывает его в дерево о) и рабочее дерево в зависимости от. Если есть опущен, по умолчанию - смешанный. Должно быть одно из следующего:

--soft Не касается файла индекса или рабочего дерева вообще (но сбрасывает заголовок в, как это делают все режимы). Это оставляет все ваши измененные файлы "Изменения будут зафиксированы", как будет указано состояние git это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...