Git - робота над неправильною гілкою - як скопіювати зміни в існуючу гілку теми


333

Я працюю над проектом, але, на жаль, я забув перейти на своє відділення, і як такий працюю над майстром

Як я можу скопіювати роботу (3 файли), яку я зробив тут, від майстра, до своєї гілки (називається, наприклад, відділення123 ), не звертаючись до майстра?

Відповіді:


540

Звучить як все, що вам потрібно:

git stash
git checkout branch123
git stash apply

Тоді вам слід повернутися до власної гілки, не торкаючись до ведучої гілки.


6
Гаразд, я запустив це, але коли я переключаюсь на головний (git checkout master) і запускаю статус git, ті самі файли все ще "модифікуються" - це очікується?
Олексій

5
Насправді вам не доведеться зберігати, якщо відмінності між вашою поточною гілкою (головним) та темою (відділення123) відсутні в жодному з файлів, які ви змінили локально. 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" (або будь-яке невикористане ім'я, яке ви вибрали) з головного. Перевірені файли тепер перевірятимуться в temp, а не в master.
  3. перевірити зміни в temp (майстер недоторканий)
  4. Зараз все зареєстровано, і можна перевірити існуючу гілку. Ознайомтеся з потрібною гілкою (гілка, з якої я хотів зробити зміни, для початку) 3.5 Git Rebase
  5. злиття темп до потрібної гілки. Тепер зміни в правильній галузі.
  6. видаліть тимчасову гілку, оскільки вона більше не потрібна

EDIT: Я дізнався, що вам доведеться виконати ребазування (git rebase --onto) тимчасової гілки перед виконанням об'єднання. Інакше зміни в master будуть включені в об'єднання. Додатковий крок 3.5 вище. Детальніше про ребауз дивіться тут: https://git-scm.com/book/en/v2/Git-Branching-Rebasing


Чи можете ви детальніше розглянути свою відповідь, додавши трохи більше опису про рішення, яке ви надаєте?
аборисон

Дякуємо за ваш відгук. Рішення є досить простим, але дотримується того самого принципу, що і рішення "приховувати", за винятком того, що замість скриньки використовується тимчасова гілка. Це зручніше принаймні для користувачів Visual Studio, оскільки пристрій не підтримується плагіном GIT
Pasi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.