Контекст: я работаю над мастером, добавляя простую функцию. Через несколько минут я понимаю, что это было не так просто, и лучше было бы заняться новой веткой.
Это всегда случается со мной, и я понятия не имею, как переключиться на другую ветку и взять все эти незафиксированные изменения со мной, оставив главную ветвь чистой. Я предполагал git stash && git stash branch new_branch
бы просто выполнить это, но вот что я получаю:
~/test $ git status
# On branch master
nothing to commit (working directory clean)
~/test $ echo "hello!" > testing
~/test $ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: testing
#
no changes added to commit (use "git add" and/or "git commit -a")
~/test $ git stash
Saved working directory and index state WIP on master: 4402b8c testing
HEAD is now at 4402b8c testing
~/test $ git status
# On branch master
nothing to commit (working directory clean)
~/test $ git stash branch new_branch
Switched to a new branch 'new_branch'
# On branch new_branch
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: testing
#
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (db1b9a3391a82d86c9fdd26dab095ba9b820e35b)
~/test $ git s
# On branch new_branch
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: testing
#
no changes added to commit (use "git add" and/or "git commit -a")
~/test $ git checkout master
M testing
Switched to branch 'master'
~/test $ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: testing
#
no changes added to commit (use "git add" and/or "git commit -a")
Знаете ли вы, есть ли способ сделать это?
Ответы:
Не надо копить.
не трогает ваши локальные изменения. Он просто создает ветку из текущего заголовка и устанавливает там заголовок. Так что я думаю, это то, что вы хотите.
--- Изменить, чтобы объяснить результат проверки мастера ---
Вы смущены, потому
checkout master
что не отменяете ваши изменения?Поскольку изменения носят только локальный характер, git не хочет, чтобы вы потеряли их слишком легко. При смене ветки git не перезаписывает ваши локальные изменения. Результат вашего
checkout master
:, что означает, что ваши рабочие файлы не чистые. git изменил HEAD, но не переписал ваши локальные файлы. Вот почему ваш последний статус все еще показывает ваши локальные изменения, хотя вы включены
master
.Если вы действительно хотите отменить локальные изменения, вы должны принудительно оформить заказ
-f
.Поскольку ваши изменения никогда не были зафиксированы, вы их потеряете.
Попытайтесь вернуться в свою ветку, зафиксируйте изменения, затем снова проверьте мастер.
Вы должны получить
M
сообщение после первой проверки, но не послеcheckout master
, иgit status
не показывать измененные файлы.Редактировать, чтобы убрать путаницу с рабочим каталогом (локальные файлы).
В ответ на ваш первый комментарий, локальные изменения просто ... ну, локальные. Git не сохраняет их автоматически, вы должны сообщить об этом, чтобы сохранить их на потом. Если вы внесете изменения и не будете явно фиксировать или хранить их, git не будет их версиями. Если вы измените HEAD (
checkout master
), локальные изменения не будут перезаписаны, поскольку не сохранены.источник
git checkout
руководства git говорится: «Обновляет файлы в рабочем дереве, чтобы они соответствовали версии в индексе или указанном дереве». Это предполагает, что ваши изменения в вашей файловой системе будут УТВЕРЖДЕНЫ после этого. Без шансов вернуть их. Даже если вы скажете, что они не будут, это все равно оставляет очень плохое предчувствие. Я не доверяю этому вообще . Либо документация действительно плохая, либо поведение git по умолчанию действительно опасно. Не нужно полагаться на какую-то «автоматическую» эвристику, чтобы обнаружить, что в этом случае вы не хотите терять свои изменения.checkout
не вступает в конфликт с вашими локальными изменениями, оформление заказа работает и оставляет локальные изменения в покое. Я понимаю, что плохое предчувствие, хотя на странице руководства может быть сказано «Обновляет неизмененные файлы в рабочем дереве». С другой стороны, Git не слишком легко теряет локальные изменения.git checkout
либо позволяет вашим локальным изменениям в одиночку, либо отказывается в случае конфликта.git checkout <other_branch> -f
. Вы потеряете свои локальные изменения без предупреждения.Пытаться:
источник
Вы можете сделать две вещи:
или
(
git checkout -
<- тире - это ярлык для предыдущей ветви, на которой вы были)(
git stash -u
<--u
означает, что он также принимает неустановленные изменения)источник
Если вы используете клиент GitHub для Windows (как и я), и вы находитесь в ситуации внесения незафиксированных изменений, которые вы хотите переместить в новую ветку, вы можете просто «Создать новую ветку» через клиент GitHub. Он переключится на вновь созданную ветку и сохранит ваши изменения.
источник
Если вы хотите, чтобы текущие незафиксированные изменения в текущей ветви переместились в новую ветку, используйте следующую команду, чтобы создать новую ветку и автоматически скопировать незафиксированные изменения.
Это создаст новую ветку из вашей текущей ветки (при условии, что она является основной), скопирует незафиксированные изменения и переключится на новую ветку.
Зафиксируйте ваши изменения в новой ветке.
Поскольку создается новая ветвь, перед ее отправкой на удаленный сервер необходимо установить восходящий поток. Используйте приведенную ниже команду, чтобы установить восходящий поток и передать его на удаленный доступ.
Как только вы нажмете эту команду, на удаленном будет создана новая ветка, а ваша новая локальная ветвь будет удалена.
Теперь, если вы хотите удалить свои незафиксированные изменения из основной ветки, используйте:
Это исключит любые незавершенные локальные изменения при оформлении заказа.
источник
В последнем клиенте GitHub для Windows , если у вас есть незафиксированные изменения, и выберите создание новой ветви.
Он подскажет вам, как справиться с этим точным сценарием:
То же самое относится, если вы просто переключаете ветку тоже.
источник