git: Перемикайте гілку та ігноруйте будь-які зміни, не здійснюючи


318

Я працював над гіткою git і був готовий здійснити свої зміни, тому я взяв на себе зобов’язання з корисним повідомленням фіксації. Тоді я заочно вніс незначні зміни в код, які не варто зберігати. Я зараз хочу змінити гілки, але git дає мені,

помилка: у вас є місцеві зміни на "X"; не може перемикати гілки.

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


1
Я вважаю, що це відбувається лише тоді, коли вони вносяться до змін, але не здійснюються? git checkout чудово працює для зміни гілок, якщо ви ще не поставили файли ще за допомогою git add або подібного.
Джеремі Стіна

1
Привіт, Джеремі, що ти маєш на увазі під «постановкою»? Примушування користувача до введення файлу перед зміною гілок не здається чудовим робочим процесом. Наприклад, якщо я перебуваю в головному сховищі і швидко хочу перевірити щось у гілці. Я маю спочатку скопіювати код до майстра, навіть він код наполовину написаний! Ви хочете сказати, що дійсно у цій ситуації має бути можливість оформити відділення?
Даніель Фаррелл

@boyfarrell Ви можете використовувати "Git stash", щоб тимчасово зберегти зміни без зобов'язань.
Howiecamp

Зшивання між собою тісно пов'язаних зв'язань Як змусити "git pull" перезаписувати локальні файли?
користувач56reinstatemonica8

1
коли ви переходите на гілку, не вносячи змін у стару гілку, git намагається об'єднати зміни до файлів у новій гілці. Якщо об'єднання буде здійснено без будь-якого конфлікту, маятничі гілки будуть успішними, і ви можете побачити зміни в новій гілці. Але якщо відбудеться конфлікт, ви отримаєте, error: You have local changes to '<filename>'; cannot switch branches.і гілка не зміниться. ви можете зробити git checkout -m <branch-name>об'єднання конфліктів та оформлення замовлення у відділення та вирішення конфліктів самостійно або git checkout -f <branch-name>ігнорування змін.
samad montazeri

Відповіді:


400

Для зміни гілок вам потрібен чистий стан. Оформлення відділення буде дозволено, лише якщо це не вплине на "брудні файли" (як зауважує Чарльз Бейлі в коментарях).

В іншому випадку вам слід:

  • приховайте свою поточну зміну або
  • reset --hard HEAD (якщо ви не проти втратити ці незначні зміни) або
  • checkout -f (Під час перемикання гілок виконайте дії, навіть якщо індекс або робоче дерево відрізняється від HEAD. Це використовується для викидання локальних змін.)

Або, нещодавно:

Продовжуйте, навіть якщо індекс або робоче дерево відрізняється від HEAD.
І індекс, і робоче дерево відновлюються відповідно до цілі комутації.

Це відрізняється від того git switch -m <branch-name>, що запускає тристороннє злиття між поточною гілкою, вмістом вашого робочого дерева та новою гілкою: ви не втратите роботу, яка просувається таким чином.


34
"Вам потрібен чистий стан, щоб змінити гілки." справедливо лише в тому випадку, якщо зміна гілки впливає на "брудні файли".
CB Bailey

10
Для методу скриньки я набрав "git stash save", "git checkout otherbranch", потім нарешті "git stash pop".
Венкат Д.

1
В даний час я не бачу цього повідомлення про помилку, і зміни, зроблені на одній гілці, з’являються на іншій, коли я роблю "статус git". щось змінилося?
Шентіл А Кумар

2
Дякую. замовлення -f було те, що мені було потрібно. я зробив git скидання --hard git clean -f git checkout mybranch -f
nologo

1
Ось одна чудова річ, яку Git абсолютно помилився, порушивши основне визначення гілки. На відміну від гілки git означає два абсолютно різних робочих простору, розщеплених із сховища.
nehem

125

Якщо ви хочете скасувати зміни,

git checkout -- <file>
git checkout branch

Якщо ви хочете зберегти зміни,

git stash save
git checkout branch
git stash pop

10
Дійсно, що говорить Ромерун (для завершення): git stash save(коли працюєш у відділенні Y), тоді git checkout branchXроби щось git add/commit -mі т. Д. git checkout branchYІ git stash popповертай
скриньку

2
Можливо, так. У мене є ситуація, хоча я хочу зробити те, що говорить відповідь, якщо я це правильно розумію: приховуйте зміни, перейдіть з Y на X, а потім виберіть зміни та виконайте їх на X.
Бен Клейн

1
зауважте, що git stash saveтепер застаріло на користьgit stash push
Аргенто

Цей псевдонім спрощує випадок збереження змін при зміні гілок.
Том Хейл

62

ну так і має бути

git stash save
git checkout branch
// do something
git checkout oldbranch
git stash pop

5
Так, приховування є глобальним, а не галузевим, якщо я перехоплюю поп після перемикання гілки, я отримаю таку ж сховку, що й на іншій гілці
Aditya Mittal

6
Слід зазначити git stash, що за замовчуванням будеgit stash save
Чарлі-Грінман

Дякую, мені це дуже корисно
Говінд Кумар


16

Зауважте, що якщо ви об’єднали віддалені відділення або маєте місцеві комісії та хочете повернутися до віддаленої HEAD, ви повинні зробити:

git reset --hard origin/HEAD

HEAD поодинці посилатимуться лише на локальну фіксацію / злиття - я кілька разів забував, що коли скидаю і закінчую "ваш сховище X поступає вперед". .


9

Якщо ви внесли зміни до файлів, які Git також повинен змінити під час перемикання гілок, це не дозволить вам. Щоб відмовитись від робочих змін, використовуйте:

git reset --hard HEAD

Тоді ви зможете перемикати гілки.


9

Жоден із цих відповідей мені не допоміг, тому що у мене все ще були незафіксовані файли навіть після скидання та зберігання даних. Я повинен був зробити:

git reset --hard HEAD
git clean -d -f

4

перехід до нової гілки втрачає зміни:

git checkout -b YOUR_NEW_BRANCH_NAME --force

перехід до існуючої гілки втрачає зміни:

git checkout YOUR_BRANCH --force

4

Легка відповідь:

полягає в тому, щоб змусити оформити відділення

git checkout -f <branch_name>

Примусово перевіряючи гілку, повідомляє git скасувати всі внесені вами зміни в поточній гілці та оформити бажану.

або у випадку, якщо ви перевіряєте комісію

git checkout -f <commit-hash>


"думав, що я можу змінити гілки, не вчиняючи зобов'язання. Якщо так, то як я можу це налаштувати? Якщо ні, то як я вийду з цієї проблеми?"

Відповідь на це « Ні» , це буквально філософія Git, що ви відстежуєте всі зміни і що кожен вузол (тобто фіксація) повинен бути в курсі останніх змін, які ви внесли, якщо ви не Зрозуміло, зробили нове зобов'язання.


Ви вирішили зберегти зміни?

Потім приберіть їх за допомогою

git stash

а потім для видалення змін у потрібній гілці скористайтеся

git stash apply

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

git stash pop

Це еквівалент applyі тодіdrop


2

Закрийте термінал, видаліть папку, де знаходиться ваш проект, потім знову клонуйте проект і voilá.


2
git не розроблений для того, щоб змусити вас видалити проект і знову клонуватись! якщо ви хочете отримати останню версію від походження, ви просто reset --hard!
Ахмед Нор Джамал Ель-Дін

2

Якщо ви хочете зберегти зміни та змінити гілку в команді одного рядка

git stash && git checkout <branch_name> && git stash pop

1

Перемістіть невмілі зміни до нової гілки

Я створив .gitconfigпсевдонім для цього:

[alias]
spcosp = !"git stash push && git checkout \"$@\" && git stash pop --index #"

Щоб змінити new-branch-name, скористайтеся:

git spcosp new-branch-name

І будь-які зміни у файлі та індексах не зберігаються.


1

git checkout -f your_branch_name

git checkout -f your_branch_name

якщо у вас виникли проблеми із поверненням змін:

git checkout .

якщо ви хочете видалити незатрековані каталоги та файли:

git clean -fd

0

Щоб перейти до іншої гілки без внесення змін, коли git stash не працює. Ви можете скористатися командою нижче:

git checkout -f гілка-ім'я

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