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


128

Це питання схоже на це , але більш конкретне.

У мене є проект з двома відділеннями ( stagingі beta).

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

git checkout master

і робіть речі:

git add fileToAdd
git commit -m "bug fixed"

а потім я зливаюся з обома гілками:

git checkout staging
git merge master
git checkout beta
git merge beta

І не має значення, чи є інші файли на робочому дереві.

Але тепер, коли я намагаюся перейти на masterгілку, я отримую помилку :

error: Your local changes to the following files would be overwritten by checkout:
src/Pro/ConvocationBundle/Controller/DefaultController.php
Please, commit your changes or stash them before you can switch branches.
Aborting

Я подумав, що мені слід видалити файл із області постановки:

git reset HEAD src/Pro/ConvocationBundle/Controller/DefaultController.php

але я отримую ту ж помилку. Якщо я це git statusотримаюNo changes to commit


4
Ви пробували reset --hard? Якщо ви дійсно впевнені, що хочете скасувати свої зміни. Або використовуйте приховування, якщо цього не зробите.
кельт

@keltar - Ні. Я не хочу відмовлятися від змін. Просто тримайте їх на робочому дереві для подальшого вчинення
Маноло

1
Я не думаю, що ви можете перемикати гілки, зберігаючи неспроможні зміни, але я міг легко помилитися - не дуже моє поле. Спробуйте git add your-fileі вчинити.
кельт

@keltar - Я працював раніше таким чином. stagingЗараз я не хочу робити жодних змін .
Маноло

Можливо, ваш конфліктний файл не був змінений, коли ви намагалися це зробити раніше. У вас зміни, git повинні зберегти їх кудись, щоб відновити пізніше. Без комісій це неможливо. Але якщо ви насправді не хочете - використовуйте приховування, саме тому він існує.
кельт

Відповіді:


128

Ваша помилка з'являється, коли ви змінили файл, і гілка, на яку ви переходите, також має зміни для цього файлу (з останньої точки злиття).

Як я бачу, ваші варіанти - зробити фіксацію, а потім змінити цю комісію з додатковими змінами (ви можете змінювати коміти в git, доки вони не pushредагуються); або - використовувати скриньку:

git stash save your-file-name
git checkout master
# do whatever you had to do with master
git checkout staging
git stash pop

git stash saveстворить скриньку, яка містить ваші зміни, але вона не пов’язана з жодним комітетом чи навіть гілкою. git stash popбуде застосовано останню запис у сховищі до вашої поточної філії, відновивши збережені зміни та видаливши їх із сховища.


3
Дякую. Ви впевнені, що це не змінить моє робоче дерево (не додані файли)? Я не хочу втрачати свої зміни: - /
Маноло

На жаль, неправильно введено текст, addколи він насправді save.. оновлений. Тобто, для інших файлів? git stash saveбез параметра імені файлу, якщо ви хочете (і поверне їх до останнього стану), збережіть всі змінені файли. А наявність додаткової копії дерева каталогів ніколи не шкодить, але я завжди параноїчний з цього приводу.
кельт

Справа в тому, щоб зберегти всі модифіковані файли, крім того, який я хочу додати до masterгілки. Також варіантом можуть бути popзміни в іншій галузі?
Маноло

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

1
@Honey це не має нічого спільного з гілками, проблема - це неспроможні зміни. Checkout, за визначенням, повинен скинути ваші файли до стану master, але тим самим він втратить його поточний вміст, і оскільки цей вміст не вчинено, неможливо буде повернутися до цього стану пізніше, отже, помилка, тож ви пізніше не буде засмучений втраченими змінами.
кельт

151

Я зіткнувся з тією ж проблемою і вирішив її

git checkout -f branch

і його специфікація досить зрозуміла.

-f, - сила

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

Перевіряючи шляхи з індексу, не відмовляйтесь від неперевірених записів; натомість незаряджені записи ігноруються.


7
Коли мій git застряг (не було локальних змін, але все-таки ця помилка), це рішення допомогло мені!
lukyer

5
Дякую, ти врятував мій екран від того, щоб пробити кулак через нього.
Сова

3
Я змінив свої зміни таким чином
Jacek Dziurdzikowski,

1
Так, ви втратите зміни, зробивши це, це повинно мати великий застереження.
Олександр Міллс

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

12

Ви можете змусити оформити свою філію, якщо не хочете вносити свої місцеві зміни.

git checkout -f branch_name

1
Це sudoне потрібно, воно лише порушить дозволи файлів. Це та сама команда git, яку написала @kiki_yu рік тому, але це ще гірше.
kenorb

2
Я змінив свої зміни таким чином
Яцек Джурджиковскі,

2
@JacekDziurdzikowski Отже, ви двічі втратили свої зміни (див. Коментар до відповіді kiki_yu), обидва, застосувавши рішення, в яких явно згадувалося, що відмова від місцевих змін була самою метою . Порушено мій детектор сарказму чи ... ти серйозно?
RomainValeri

@RomainValeri Хм, я думаю, це був мій спосіб попередити інших, які є початківцями з git (вони повинні бути новачками, якщо читати цей пост), щоб бути готовими попрощатися з будь-якими внесеними змінами. Я думав, що час, коли зміни, здійснені в одній гілці, повинні залишитися на цій гілці, поки я не перевіряю її знову. Підказка новачкам, які теж думають так: використовуйте git stash :)
Яцек Джурджиковскі

Дублікат відповіді без жодної причини. У першій відповіді є ще більше інформації.
MAChitgarha

9

Я зіткнувся з тією ж проблемою і вирішив її

git checkout -f відділення

Ну, будьте обережні з -fвимикачем. Якщо ви користуєтесь -fперемикачем, ви втратите будь-які неспроможні зміни . Хоча можуть бути деякі випадки використання, коли це корисно використовувати -f, у більшості випадків вам можуть знадобитися stashзміни, а потім switchгілки. stashingПроцедура описана вище.


0

Ви можете взяти на себе зобов'язання в поточній гілці, перейти до іншої гілки та, нарешті, вибрати вишню (замість злиття).


Це може бути корисніше, якщо ви дасте більше пояснень щодо цього.
MAChitgarha

-1

Якщо ви отримуєте це, намагаючись перевірити іншу галузь:

my-mac:myGHProject ~$ git checkout other-branch
error: Your local changes to the following files would be overwritten by checkout:
    src/main/resources/reference.conf

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

my-mac:myGHProject ~$ git branch
  * my-local-branch
  * develop    

my-mac:myGHProject ~$ git status
On branch my-local-branch
   Changes not staged for commit:
   (use "git add <file>..." to update what will be committed)
   (use "git checkout -- <file>..." to discard changes in working directory)
 modified:   src/main/resources/reference.conf

my-mac:myGHProject ~$ git add src/main/resources/reference.conf

my-mac:myGHProject ~$ git commit -m "updates on some config"
  [my-local-branch] updates on some config
  1 file changed, 131 insertions(+), 85 deletions(-)

Тепер, коли ви це зробили, ви можете перевірити іншу гілку і досить легко переходити туди-назад.

my-mac:myGHProject ~$ git checkout other-branch

my-mac:myGHProject ~$ git status
  On branch other-branch

my-mac:myGHProject ~$ git checkout my-local-branch
  Switched to branch 'my-local-branch'

Просто переконайтеся, що ви перебуваєте на правій гілці та натискаєте на праву гілку, коли ви запускаєте команду git push origin $ {branch}. Примітка: якщо ваш проект підключений безпосередньо до Intellij, ви можете помітити, що ви змінили свою філію в правому нижньому куті головного вікна.

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