Подтвердить что ты не робот

Git ветвь перехода без отбрасывания локальных изменений

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

Как мы можем заставить git переключать ветки , не отбрасывая локальные изменения.

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

  • Резервное копирование репо
  • git reset --hard
  • git checkout right-branch
  • Восстановить изменения
  • git commit -m "changes"
4b9b3361

Ответ 1

Есть множество разных способов, в зависимости от того, как далеко вы находитесь и на какой ветке (ах) вы хотите их получить.

Давайте возьмем классическую ошибку:

$ git checkout master
... pause for coffee, etc ...
... return, edit a bunch of stuff, then: oops, wanted to be on develop

Итак, теперь вы хотите, чтобы эти изменения, которые вы еще не приверженные master, чтобы быть на develop.

  1. Если у вас еще нет develop, метод тривиален:

    $ git checkout -b develop
    

    Это создает новую ветку develop начиная с того места, где вы сейчас находитесь. Теперь вы можете делать коммиты, и все новое находится в стадии develop.

  2. У вас есть develop. Посмотрим, позволит ли Git переключаться, ничего не делая:

    $ git checkout develop
    

    Это либо удастся, либо пожаловаться. Если это удастся, отлично! Просто зафиксируй. Если нет (error: Your local changes to the following files would be overwritten...), у вас все еще есть много вариантов.

    Самым простым из них, вероятно, является git stash (как говорили все другие респонденты, побившие меня, нажав post). Запустите git stash save или git stash push, 1 или просто простой git stash который короток для save/push:

    $ git stash
    

    Это фиксирует ваш код (да, он действительно делает некоторые коммиты), используя странный не-ответкительный метод. Коммиты, которые он делает, не "включены" в какую-либо ветку, но теперь безопасно хранятся в репозитории, так что теперь вы можете переключать ветки, а затем "применять" тайник:

    $ git checkout develop
    Switched to branch 'develop'
    $ git stash apply
    

    Если все идет хорошо, и вам нравятся результаты, вам следует сделать git stash drop stash. Это удаляет ссылку на странные не-ветвящиеся коммиты. (Они все еще находятся в хранилище и иногда могут быть получены в чрезвычайной ситуации, но для большинства целей вы должны считать, что они ушли в этот момент.)

Шаг apply выполняет слияние спрятанных изменений с использованием мощного базового механизма слияния Git, то же самое, что используется при слиянии веток. Это означает, что вы можете получить "конфликты слияния", если ветка, над которой вы работали по ошибке, достаточно отличается от ветки, над которой вы работали. Поэтому рекомендуется тщательно проверить результаты, прежде чем предполагать, что тайник применен без ошибок, даже если сам Git не обнаружил каких-либо конфликтов слияния.

Многие люди используют git stash pop, что является сокращением для git stash apply && git stash drop. Это хорошо, насколько это возможно, но это означает, что если приложение приводит к путанице, и вы решаете, что не хотите идти по этому пути, вы не сможете легко вернуть тайник обратно. Поэтому я рекомендую apply отдельную apply, проверять результаты, drop только если/когда выполнено (Это, конечно, вводит еще один момент, когда вы можете сделать еще один перерыв на кофе и забыть о том, что вы делали, вернуться и сделать что-то не так, так что это не идеальное лекарство.)


1save в git stash save - старый глагол для создания нового хранилища. Git версии 2.13 представил новый глагол, чтобы сделать вещи более совместимыми с pop и добавить больше опций в команду создания. Git версии 2.16 формально не поддерживает старый глагол (хотя он все еще работает в Git 2.23, которая является последней версией на момент редактирования).

Ответ 2

Используйте git stash

git stash

Он подталкивает изменения в стек. Когда вы хотите вернуть их, используйте

 git stash apply

Вы даже можете вытащить отдельные предметы. Чтобы полностью сдуть трюк:

 git stash clear

Ответ 3

  • git stash, чтобы сохранить ваши неустановленные изменения.
  • git stash list, чтобы отобразить сохраненные невыполненные запинки.
  • git stash apply [email protected]{x}, где x может быть 0,1,2..no штампов, которые вы сделали

Ответ 4

Вы можете:

  • Используйте git stash для отложенных изменений или,

  • Создайте еще одну ветку и зафиксируйте там свои изменения, а затем слейте эту ветку в свой рабочий каталог