Git - работа с неправильной веткой - как скопировать изменения в ветку существующей темы

333

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

Как я могу скопировать работу (3 файла), которую я сделал здесь, из master, в мою ветку (называемую, например, branch123 ), не подходя к master?

Alex
источник

Ответы:

540

Похоже, все, что вам нужно, это следующее:

git stash
git checkout branch123
git stash apply

Тогда вы должны вернуться в свою собственную ветку, не касаясь главной ветви.

gnab
источник
6
Хорошо, я запустил это, но когда я переключаюсь обратно на master (мастер git checkout) и запускаю git status, те же файлы все еще «модифицированы» - это ожидается?
Алекс
5
На самом деле вам может не понадобиться копить, если различия между вашей текущей веткой (master) и веткой темы (branch123) отсутствуют ни в одном из файлов, которые вы изменили локально. Git позволит вам просто проверить ветку темы в этом случае.
Каскабель
3
@ Алекс: Да, это ожидаемо. Это не связано с коммитами. stashсохраняет локальные модификации, а затем stash applyвозвращает их обратно.
Каскабель
6
как я могу "избавиться" от них из главной ветки .. чтобы оставить это чистым?
Алекс
7
git reset --hard HEADи вы вернулись к последнему коммиту, который вы сделали в своей основной ветке.
Гнаб
46

Принятый ответ является наиболее полным, но есть особый случай, когда вы можете упростить. Если файлы, которые вы изменили в рабочем каталоге, идентичны в обоих, masterи branch123вы можете просто сделать

git checkout branch123

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

Как уже упоминали другие люди в комментариях, если вы branch123еще не существует, вы можете сделать

git checkout -b branch123

На основании того, что я нашел здесь .

Рассел Диркс
источник
3
Или, если вы хотите создать новую ветку,git checkout -b newbranch
Фил Митчелл
2
Это работает лучше для меня, чем копить, и это намного проще. Спасибо!
Матиас
31
Нет, это не работает. Git покажет вам это сообщение: «зафиксируйте ваши изменения или спрячьте их, прежде чем вы сможете переключать ветки».
dsharew
1
@DegenSharew: Да, вы правы в некоторых случаях, а именно, если файлы, которые вы изменили в рабочем каталоге, не идентичны в masterи branch123. Смотрите мой отредактированный ответ.
Рассел Диркс
1
Это отлично сработало для меня. У меня еще не было ветки, поэтому я сделал это: git checkout -b newbranchname. Мои изменения обнаружились в этой ветке самостоятельно.
dex3703
6

git stash это то, что вам нужно.

полное объяснение можно найти в Git-Tools-Stashing

Роуи Гавирель
источник
0

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

Этот сценарий работает по крайней мере с плагином VS 2015 Git, но, скорее всего, будет работать с любым инструментом Git.

  1. оформить заказ и внести изменения в файлы в мастере (ups !, неправильная ветка)
  2. создайте новую ветку "temp" (или любое другое неиспользуемое имя) из master. Извлеченные файлы теперь будут извлечены в temp, а не в master.
  3. проверить изменения в temp (мастер не тронут)
  4. Теперь все проверено, и есть возможность проверить существующую ветку. Проверьте нужную ветку (ветку, в которую я хотел внести изменения для начала) 3.5 Git Rebase
  5. объединить темп с нужной веткой. Теперь изменения в правильной ветке.
  6. удалите временную ветку, так как она больше не нужна

РЕДАКТИРОВАТЬ: я обнаружил, что вам придется выполнить rebase (git rebase --onto) временную ветвь перед выполнением слияния. В противном случае изменения в основной записи будут включены в слияние. Дополнительный шаг 3.5 выше. Подробнее о ребазе читайте здесь: https://git-scm.com/book/en/v2/Git-Branching-Rebasing.

Pasi
источник
Не могли бы вы более подробно изложить свой ответ, добавив немного больше описания предлагаемого вами решения?
abarisone
Спасибо за ваш отзыв. Решение довольно простое, хотя и следует тому же принципу, что и решение «stash», за исключением того, что вместо stash используется временная ветвь. Это более удобно, по крайней мере, для пользователей Visual Studio, так как stash не поддерживается плагином GIT
Pasi