переміщення змінених файлів до іншої гілки для реєстрації


422

Це часто трапляється зі мною: я пишу якийсь код, переходжу до перевірки змін, а потім розумію, що я не в належному відділенні, щоб перевірити ці зміни. Однак я не можу перейти до іншої гілки без зміни змін. Чи є спосіб перемістити зміни до іншої гілки, щоб перевірити там?

Відповіді:


751

git stash твій друг.

Якщо ви ще не взяли на себе зобов’язання, просто запустіть git stash. Це вбереже всі ваші зміни.

Перейдіть до гілки, на якій потрібно зміни, і запустіть git stash pop.

Існує багато застосувань для зберігання в git. Це, безумовно, одна з більш корисних причин.

Приклад:

# work on some code
git stash
git checkout correct-branch
git stash pop

122
Не потрібно зберігати зміни без змін, вони йдуть з вами, коли ви перевіряєте відділення. Стек - це більше для довготривалого зберігання тимчасових речей (речі, які ви хочете закінчити та вчинити пізніше, але вам потрібно зробити щось інше зараз).
Tekkub

2
Я це розумію. Тож я маю приховувати, перемикати відділення, а потім C:\kf [develop +0 ~4 -0]> git checkout feature/customers<br/> error: Your local changes to the following files would be overwritten by checkout:<br/> AspWebApp.vNext/global.asa<br/> RestApi/Web.config<br/> Please, commit your changes or stash them before you can switch branches.<br/> Aborting
вискакувати

3
@Tekkub "більш тривалий термін зберігання тимчасових речей", який говорить дуже незручно, інший момент використовувати приховування - це штовхає його в стек, тому якщо ви не хочете, щоб він переносив і працював над чимось іншим, це корисно таким чином . Так, вам не потрібно, але ви просто відчуваєте себе більш чистими та контролюючими.
Афійон

браво дитино! слід додати, що ви повинні зробити, якщо ви
домовились

2
@Tekkub Це справедливо лише в тому випадку, якщо гілка, на яку ви переходите, відповідає поточній гілці, на якій ви перебуваєте. Якщо, наприклад, ви випадково працюєте над галуззю prod і вам потрібно перейти на гілку етапу, але етап змінився в таймі часу, це єдиний спосіб зробити перемикання.
danielson317

248

Якщо ви ще не здійснили зміни , просто git checkoutперейдіть до нової гілки, а потім виконайте їх нормальне внесення. Зміни у файлах не прив’язуються до певної гілки, поки ви їх не зробите.

Якщо б уже зафіксували зміни:

  1. Введіть git logі запам’ятайте SHA комісії, яку ви хочете перемістити.
  2. Ознайомтеся з відділенням, на яке потрібно перемістити комісію.
  3. Введіть git cherry-pick SHAверхню заміну SHA.
  4. Поверніться до початкового відділення
  5. Використовуйте git reset HEAD~1для скидання назад перед фіксацією неправильної гілки.

cherry-pick приймає задану комісію і застосовує її до наразі зареєстрованої голови, що дозволяє вам скопіювати зобов’язання у новий відділення.


9
Тут вам навіть не потрібно вбирати вишню. git reset HEAD~N --softа потім git checkout -bперемістити всі нині невитрачений код нової галузі.
Аарон

19
зміни до файлів не прив’язані до певної гілки, поки ви не скористаєтесь ними. <- це. Це вирішило для мене таємницю. Дякую.
Цхаллачка

8
Я отримую таку помилку при спробі переключення гілок: "локальні зміни в наступні файли будуть перезаписані під замовлення". Отже, не здається, що я можу перейти до іншої гілки та нормально виконувати свої зобов'язання.
Міша

3
@Mischa це не працює, якщо ви переходите між двома гілками, які мають різну історію
watashiSHUN

1
@Aaron, що набагато приємніше (для сценарію після завершення)! Будь ласка, зробіть окрему відповідь.
Джектоз

16

На жаль, це трапляється і зі мною досить регулярно, і я використовую, git stashякщо раніше зрозумів свою помилку git commitі використовую git cherry-pickінакше, обидві команди пояснюються досить добре в інших відповідях

Я хочу додати пояснення щодо git checkout targetBranch: ця команда збереже ваш робочий каталог та поетапний знімок лише у тому випадку, якщо targetBranch має ту саму історію, що і ваша поточна гілка

Якщо ви ще не здійснили своїх змін, просто використовуйте git checkout, щоб перейти до нової гілки, а потім виконати їх нормально

Заява @ Amber не є хибною, коли ви переходите до newBranch , git checkout -b newBranchстворюється новий покажчик, який вказує на те саме, що і ваш поточний відділ.
Насправді, якщо у вас виникла інша гілка, яка ділиться історією з вашою поточною філією (обидві точки в одному і тому ж фіксації), ви можете "перемістити свої зміни"git checkout targetBranch

Однак зазвичай різні гілки означають різну історію, і Git не дозволить вам перемикатися між цими гілками з брудною робочою директорією або областю постановки. у такому випадку ви можете виконати git checkout -f targetBranch(чисті та викидні зміни) або git stage+ git checkout targetBranch(очистити та зберегти зміни), просто запущений git checkout targetBranchбуде видавати помилку:

Помилка: Ваші локальні зміни в наступні файли будуть перезаписані під замовлення: ... Введіть свої зміни або сховіть їх, перш ніж перемикати гілки. Аборти


5

М'який скидання мерзотник помістить зафіксовані зміни назад в свій індекс. Далі, огляньте відділення, яке ви мали намір здійснити. Потім git počin з новим повідомленням фіксування.

  1. git reset --soft <commit>

  2. git checkout <branch>

  3. git commit -m "Commit message goes here"

З git docs :

git reset [<mode>] [<commit>]Ця форма скидає поточну голову гілки та, можливо, оновлює індекс (скидання його на дерево дерева) та робоче дерево залежно від. Якщо пропущено, за замовчуванням - змішано. Обов'язковою має бути одна з наступних дій:

--softНе торкається файлу індексу або робочого дерева (але скидає голову, як і всі режими). Після цього всі змінені файли залишаються "Змінами, які потрібно здійснити", як додано статус git.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.