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


333

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

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

Ответы:


540

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

git stash
git checkout branch123
git stash apply

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


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


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.


Не могли бы вы более подробно изложить свой ответ, добавив немного больше описания предлагаемого вами решения?
abarisone

Спасибо за ваш отзыв. Решение довольно простое, хотя и следует тому же принципу, что и решение «stash», за исключением того, что вместо stash используется временная ветвь. Это более удобно, по крайней мере, для пользователей Visual Studio, так как stash не поддерживается плагином GIT
Pasi
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.