Як вирішити git, кажучи: "Введіть свої зміни або схойте їх, перш ніж ви зможете об'єднатися"?


761

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

помилка: Ваші локальні зміни до таких файлів будуть перезаписані об'єднанням:

wp-content / w3tc-config / master.php

Будь ласка, введіть свої зміни або сховіть їх, перш ніж ви зможете об'єднатись.

Так я побіг,

git checkout -- wp-content/w3tc-config/master.php

і спробував ще раз, і я отримую те саме повідомлення. Я припускаю, що w3tcщось змінило у конфігураційному файлі на сервері. Мені все одно, чи локальна або віддалена копія надходить на сервер (я вважаю, що віддалена - найкраща), я просто хочу мати можливість об'єднати решту змін (оновлення плагінів).

Будь-які ідеї?



11
Це більш чітке запитання з більш детальною інформацією та кращою відповіддю. Я думаю, що цінно тримати це навколо. Так, перший технічно запитували спочатку, але усунення цього ускладнить людям пошук відповідей, які вони шукають.
— Jo Sprague

Відповіді:


1299

Ви не можете злитися з локальними модифікаціями. Git захищає вас від втрати потенційно важливих змін.

У вас є три варіанти:

  • Здійсніть зміни, використовуючи

    git commit -m "My message"
    
  • Заховай це.

    Stashing діє як стек, куди ви можете натиснути зміни, і ви переймете їх у зворотному порядку.

    Щоб приховати, введіть

    git stash
    

    Зробіть злиття, а потім витягніть скриньку:

    git stash pop
    
  • Відмовтеся від місцевих змін

    за допомогою git reset --hard
    абоgit checkout -t -f remote/branch

    Або: Відкиньте локальні зміни для певного файлу

    використовуючи git checkout filename


104
Ви також можете відкинути локальні зміни для певного файлу, виконавши: ім'я файлу git checkout
— ckb

6
Дякую. Я додам до цього, якщо ви, git reset --hardможливо, також захочете видалити незатребувані файли за допомогоюgit clean -dfx
— Jo Sprague

13
За замовчуванням git stashне зберігаються файли, для яких немає історії. Отже, якщо у вас є файли, які ви ще не додали, але які були б перезаписані або "створені" об'єднанням, злиття все одно заблокується. У цій ситуації ви можете використовувати і git stash -uдля зберігання непосланих файлів. Або ви можете просто видалити їх!
— joeytwiddle

25
біг git clean -dfxбув жахливою ідеєю. Видалено кілька файлів .gitignored, які мені справді потрібні.
— ezuk

5
Я зіткнувся з ситуацією, коли користувач, після цього git reset --hard, все-таки змінився без змін!
— Амедей Ван Гассе

83
git stash
git pull <remote name> <remote branch name> (or) switch branch
git stash apply --index

Перша команда тимчасово зберігає ваші зміни у сховці та видаляє їх із робочого каталогу.

Друга команда перемикає гілки.

Третя команда відновлює зміни, які ви зберегли в сховищі ( --indexопція корисна, щоб переконатися, що поетапні файли все ще зберігаються).


1
stackoverflow.com/questions/15286075/… , також може бути корисним
— vikramvi

2
щоб пояснити точку @ vikramvi: ми також можемо використовувати git stash popзамість git stash apply. Перший видаляє його з сховища, а другий зберігає його там
— Анупам,

27

Ви можете спробувати один із наступних методів:

ребаза

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

git pull origin master -r

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

Це еквівалентно: checkout master, fetchі rebase origin/masterкоманда Git.

Це потенційно небезпечний режим роботи. Він переписує історію, яка не робить нічого доброго, коли ви вже опублікували цю історію. Не використовуйте цю опцію, якщо ви git-rebase(1)уважно не прочитали .


перевіряти

Якщо вас не хвилюють ваші локальні зміни, ви можете перейти до іншої гілки тимчасово (з силою) та повернути її назад, наприклад

git checkout origin/master -f
git checkout master -f

скинути

Якщо вас не цікавлять ваші локальні зміни, спробуйте відновити його до HEAD (початковий стан), наприклад

git reset HEAD --hard

Якщо вище не допоможе, це можуть бути правила у вашому файлі нормалізації git ( .gitattributes), тож краще виконати те, що він говорить. Або ваша файлова система не підтримує дозволи, тому вам потрібно вимкнути filemodeконфігурацію git.

Пов'язане: Як змусити "git pull" перезаписати локальні файли?


1
Не працює: я все одно отримую те саме повідомлення, як "спершу сховайте зміни". Коли я ввожу "git stash", а потім "git pull" -> "помилка: у вас збережені зміни. Зробіть першу скриньку".
— Незадовго

@ trinity420 Чи можуть це бути ваші файлові дозволи, перевірте, git statusякі зміни ви маєте після того, як зберігати. Якщо жодна відповідь не допоможе, спробуйте додати нове запитання.
— kenorb

дякую, але моя проблема вирішена, спробував усе тут, нічого не вийшло, потім натиснув "зробити зміни", "об'єднати" в PHPStorm, а потім я зняв зміни, і це спрацювало ..
— trinity420


13

Тож ситуація, в яку я зіткнувся, була така:

Помилка: Ваші локальні зміни в наступні файли будуть замінені об'єднанням: wp-content / w3tc-config / master.php Будь ласка, введіть свої зміни або схойте їх, перш ніж ви зможете об'єднатись.

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

remote: error: Ваші локальні зміни до наступних файлів будуть перезаписані злиттям: some / file.ext Будь ласка, введіть свої зміни або схойте їх, перш ніж ви зможете об'єднатись.

Те, що відбувалося, було (я думаю, не на 100% позитивним) гак прийому повідомлень git починав запускатись і викручуватися через зміни руху у сховищі віддаленого сервера, яких теоретично не слід було чіпати.

Тож, що я закінчив, простеживши гачок після отримання та виявивши це, потрібно було перейти до віддаленого сховища на сервері, і там відбулася зміна (чого не було в моєму локальному сховищі, що, власне, сказав, що він збігався, ніяких змін, нічого не потрібно робити, до цього часу і т. д.) Тож, на локальному рівні не було змін на сервері, я потім зробив а, git checkout -- some/file.extа потім локальні та віддалені сховища насправді відповідали, і я міг продовжуйте працювати та розгортати. Не зовсім впевнений, як виникла така ситуація, хоча пару десятків розробників плюс зміни ІТ можуть мати щось із цим.


2
Це питання чи відповідь?
— stdcall

2
@stdcall - Трохи обох. Коли я зіткнувся з цією ситуацією, як описано в питанні, саме це мені довелося зробити, щоб виправити це. Це, безумовно, не було нормальним рішенням git, і з питання, схоже, це могло бути та ж аномальна ситуація (тобто налаштування змін на сервері, але локальний не має змін). Якщо хтось більше має уявлення про те, чому (або як) це сталося, я б вітаю будь-яке розуміння.
— Майк

7

ПОПЕРЕДЖЕННЯ: Це видалить незатребувані файли, тому це не чудова відповідь на це питання.

У моєму випадку я не хотів зберігати файли, тому це працювало для мене:

Git 2.11 і новіші:

git clean  -d  -fx .

Старіші Git:

git clean  -d  -fx ""

Довідка: http://www.kernel.org/pub/software/scm/git/docs/git-clean.html

  • -x означає, що ігноровані файли також видаляються, а також файли, невідомі для git.

  • -d означає видалити не відстежувані каталоги на додаток до відслідковуваних файлів.

  • -f потрібно, щоб змусити його працювати.


4

Щоб зберігати записи ваших новостворених файлів, вирішуючи цю проблему:

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

  1. Поетапно змінюйте місцеві зміни. (не вчиняють). Потрібна постановка для створення виправлення нових створених файлів (оскільки вони ще не відстежуються)

git add .

  1. Створіть виправлення для збереження запису

git diff --cached > mypatch.patch

  1. Відкиньте локальні зміни та видаліть нові локальні файли

git reset --hard

  1. Потягніть зміни

git pull

  1. Нанесіть свій пластир

git apply mypatch.patch

Git об'єднає зміни та створить .rej-файли для змін, які не об'єднуються.

Як пропонує Ану, якщо у вас виникли проблеми із застосуванням виправлення, спробуйте:

git apply --reject --whitespace=fix mypatch.patch Ця відповідь git: patch не застосовує детально обговорити це питання

Насолоджуйтесь своєю подальшою роботою над своєю функцією та виконайте місцеві зміни, коли закінчите.


Я хотів підштовхнути частину коду з новими змінами, тому зробив: 1. створив виправлення з моєї локальної гілки розробки 2. зробив жорстке скидання 3. витягнути нові зміни з головного в розробник (щоб уникнути будь-яких конфліктів злиття) 4 . зробила невелику зміну в моєму локальному розробнику 5. перенесла на віддалений Dev 6. застосовано патч назад -> Отримала помилку:, у error: patch failed: yourfile.py:33 error: yourfile.py: patch does not applyмене все ще є mypatch.patch, але не знаю, чому це не застосовується, і я втратив зміни !
— Ана

Я отримав це, правильна команда була git apply --reject --whitespace=fix mypatch.patch, я повернув свої зміни назад феу !!! [Завдяки] ( stackoverflow.com/a/15375869/6484358 )
— Ану

1
Ану, команда git apply mypatch.patch правильно застосовувати патч, це те, що я весь час використовую, може виникнути якась проблема із самим створеним патчем, і ви ніколи не втрачаєте змін, якщо у вас патч в руках, це містить усі консолідовані зміни.
— Manpreet

2

Просити взяти на себе зобов’язання перед витягненням

  • git stash
  • git pull origin << назва гілки >>

При необхідності :

  • застосувати git stash

1
Використовуйте git stash, коли ви хочете записати поточний стан робочого каталогу та індексу, але хочете повернутися до чистого робочого каталогу. Команда зберігає ваші локальні модифікації і повертає робочий каталог, щоб він відповідав команді HEAD.
— Пушпак Шарма

2

Для мене тільки git reset --hardпрацював.

Здійснення зобов’язань не було варіантом, оскільки не було чого робити.

Сшивання не було варіантом, тому що не було що приховувати.

Схоже, це могло бути з виключених файлів у .git/info/excludeта git update-index --assume-unchanged <file>редагуванні деяких файлів.


0

У моєму випадку я створив резервну копію, а потім видалив файл, на який скаржився Git, скоїв, тоді я зміг нарешті перевірити іншу гілку.

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



0

Я спробував першу відповідь: git stashз найвищим балом, але повідомлення про помилку все-таки спливе, і тоді я знайшов цю статтю, щоб здійснити зміни, а не приховувати "Небажаний комітет"

і повідомлення про помилку остаточно зникло:

1: git add .

2: git commit -m "this is an additional commit"

3: git checkout the-other-file-name

тоді це спрацювало. сподіваюся, що ця відповідь допоможе. :)


0

Якщо ви використовуєте розширення Git, ви маєте змогу знайти ваші локальні зміни у Working directoryнаведеному нижче:

введіть тут опис зображення

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

введіть тут опис зображення

Коли ви знайшли якісь неспроможні зміни:

Виберіть рядок з Working directory, перейдіть на Diff вкладці правою кнопкою миші по рядках з олівцем (або +чи -значок), виберіть Скидання в першу здійснити або вчиняє чи притон або що ви хочете з ним робити.


0

Для мене це спрацювало:

git reset --hard

і потім

git pull origin <*current branch>

після того

git checkout <*branch>


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