Git rebase - продовжуйте скарги навіть тоді, коли всі конфлікти злиття були вирішені


115

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

Я зробив ребауз проти майстра з моєї галузі:

git rebase master

і отримав таку помилку

 First, rewinding head to replay your work on top of it...
 Applying: checkstyled.
 Using index info to reconstruct a base tree...
 Falling back to patching base and 3-way merge...
 Auto-merging AssetsLoader.java
 CONFLICT (content): Merge conflict in AssetsLoader.java
 Failed to merge in the changes.
 Patch failed at 0001 checkstyled.

Тож я зайшов до свого улюбленого редактора, виправив конфлікт у 1 рядку, зберег файл і зробив статус git і отримав наступний вихід:

 # Not currently on any branch.
 # Changes to be committed:
 #   (use "git reset HEAD <file>..." to unstage)
 #
 #  modified:   PassengerContactHandler.java
 #
 # Unmerged paths:
 #   (use "git reset HEAD <file>..." to unstage)
 #   (use "git add/rm <file>..." as appropriate to mark resolution)
 #
 #  both modified:      AssetsLoader.java
 #

Я зробив git, додав AssetsLoader.java та статус git і отримав наступне:

 # Not currently on any branch.
 # Changes to be committed:
 #   (use "git reset HEAD <file>..." to unstage)
 #
 #  modified:   AssetsLoader.java
 #  modified:   PassengerContactHandler.java
 #

і коли я зробив git rebase - продовжую:

git rebase --continue
You must edit all merge conflicts and then
mark them as resolved using git add

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

тож я не впевнений: як мені діяти?

Редагувати: Чи може бути, що файл із вирішеним конфліктом точно такий, як оригінальна версія?

Велике спасибі, Лукасе

Редагувати, зі мною це просто сталося:

Щойно зі мною це сталося,

(307ac0d...)|REBASE)$ git status
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   assets/world/level1/Level-1.xml
#   modified:   George.java
#   modified:   DefaultPassenger.java
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   mb-art/originalAssets/27dec/

((307ac0d ...) | REBASE) $ git rebase - продовжити

You must edit all merge conflicts and then
mark them as resolved using git add

git - відвернення

git version 1.7.1

Це повний вихід git status, правда? Немає пропущеного розділу під ним?
Каскабель

git-rebaseніколи не слід повідомляти, що існують невирішені конфлікти, якщо таких немає. Якщо вам вдасться відтворити проблему у більш простому тестовому випадку, було б набагато простіше налагоджувати, але все ж, якщо ви не git statusповідомляєте про конфлікти, коли git rebase --continueце відбувається, і ваша версія Git поточна, ви можете спробувати надіслати електронний лист Git Dev список розсилки на git@vger.kernel.org з якомога більше діагностичної інформації.
Каскабель

1
Щойно зі мною це повторилося, (307ac0d ...) | ЗНАЧЕННЯ) $ git status # На даний момент не існує жодної гілки. # Зміни, які потрібно здійснити: # (використовуйте "git reset HEAD <file> ..." to untage) # # модифіковано: активи / world / level1 / Level-1.xml # модифіковано: George.java # модифіковано: DefaultPassenger.java # # Файли, що не відслідковуються: # (використовуйте "git add <file> ..." для включення в те, що буде зроблено) # # mb-art / originalAssets / 27dec /
Лукас

Я думаю, вам слід скористатися GITKRAKEN, це допоможе вам у вирішенні конфліктів
Nikhil Bhardwaj

Відповіді:


115

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

Трохи детальніше:

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

git add your/conflicted/file
git status

ви отримаєте (зазвичай зелений) рядок із зазначенням модифікованого файлу

змінено: ваш / конфліктний / файл

git rebase - продовження буде добре працювати в цій ситуації.

Однак іноді, вирішуючи конфлікт, ви видаляєте все з нового виправлення, зберігаючи лише код із гілки, на яку ви перезавантажувались. Тепер, коли ви додасте файл, він буде точно таким, як той, на який ви намагалися перезавантажити файли. у статусі git не відображатиметься зелена лінія із відображенням модифікованих файлів. Тепер, якщо ви

git rebase --continue

git буде скаржитися з

Немає змін - ви забули використовувати "git add"?

Те, що насправді хоче, щоб ти в цій ситуації робив, - це використовувати

git rebase --skip

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

змінено: ваш / конфліктний / файл

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

git rebase --skip

продовжувати.

У початковій публікації сказано, що це іноді працює:

git add -A
git rebase --continue
# works magically?

... але не покладайтеся на це (і не забудьте додавати залишки файлів у папки вашого сховища)


1
У мене, здавалося, було те саме питання і таке ж рішення, теж здавалося магічним!
bspink

У мене була така ж проблема, схоже, якщо ви переробили основу у відновлювану гілку та додали нові файли, а потім процес вирішення злиття вніс зміни до цих нових файлів, вам потрібно явно git додати їх ще раз.
Ібрагім

Не робіть цього, якщо ви не хочете відслідковувати всі непотрібні файли до вашого репо.
Джед Лінч

git add ...стає дійсно дратівливим набрати після зміни купи файлів з довгими шляхами. Чи git add --all-the-files-i-changedя можу бігати раніше git rebase continue?
jozxyqk

3
Будьте обережні, використовуючи команду git rebase --skip, ви можете втратити роботу (відредаговані файли)
Youness Marhrani


8

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

git rm <filename>  

2
Настільки простий, що може бути коментарем; настільки корисною, що це має бути відповідь. Дякую!
Лукас Ліма

4

Спробуйте виконати це у своєму командному рядку:

$ git mergetool

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


Подумав, що це може бути простіше, а також дозволить вам уникнути подібних ситуацій у майбутньому.
Баткінс

1
Ти врятував мій вечір. Хоча це простий інструмент, але я ніколи не зможу зрозуміти, як вирішити свої конфлікти без цього інструменту.
eonil

4

Після виправлення конфлікту переконайтеся, що змінені файли додані до поступових файлів. Це вирішило для мене проблему.


Це зробило для мене трюк. Я перевірив Sourcetree після того, як отримав повідомлення, описане в ОП, і одразу побачив два файли, згадані у вікні команди, як невідомі. Поставив файли, запустив "git rebase - продовжувати", і я повернувся назад.
Mass Dot Net

3

Ви пропустили конфлікт злиття в AssetsLoader.java. Відкрийте його та шукайте маркери конфлікту (">>>>", "====", "<<<<<"), а потім знову додайте git. Зробіть "git diff - стадією", якщо у вас є труднощі з його пошуку.


3
Я зробив греп на всіх відстежених файлах і не було жодних маркерів конфліктів.
Лукас

Чи git diff --stagedвиявляє щось корисне? Це вказує, які зміни ви збираєтесь здійснити для вирішення конфлікту (ів) злиття в цей момент ребазу. Повинно бути біт "ой, це не те, що я мав намір зробити, щоб вирішити цей" біт в одному з файлів.
Ефір

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

@Ether це зовсім не причина. Ви можете git addподати файл навіть із маркерами конфлікту. Адже такі файли можуть бути цілком законними!
fge

@Jefromi: га, добре знати! Я завжди припускав, що маркерів перевіряють, і потрібно було б - примусити його пройти, якщо це було б навмисно.
Ефір

3

У мене щойно була ця проблема, і хоча я думаю, що причин може бути кілька, ось моя ...

У мене був гак, який попередньо здійснив фіксацію, який відхилив зобов’язання за певних умов. Це добре при здійсненні вручну, оскільки він відображатиме висновок гака, і я можу або виправити його, або вирішити ігнорувати його, скориставшись програмою -komne-verify.

Проблема, здається, полягає в тому, що при повторному перезапуску, rebase --continue також зателефонує на гачок (для того, щоб здійснити останню кількість змін). Але ребаза не відображатиме висновок гака, він просто побачить, що він не вдався, а потім виплюне менш конкретну помилку: "Ви повинні відредагувати всі конфлікти злиття, а потім позначити їх як вирішені за допомогою git add"

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

Цікаво, що в той час, коли git rebase не відображає вихід з git hook, він приймає --no-verify, щоб обійти гачки.


1
У мене була схожа проблема. Ніщо інше тут не працювало для мене, але просто робити «git počin» і потім аборти, здавалося, магічно вирішили будь-яку розбіжність, і тоді я зміг успішно «git rebase - продовжувати».
patrickvacek

Тільки для запису, як я останнім часом боровся з подібним випуском, git rebaseприймає --no-verifyваріант. Однак він опускає лише pre-rebaseгачок, але ця опція не застосовується при наступних дзвінках до git commit.
pryrysiak

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

2

Після виправлення змін ви можете забути запустити "git add -A"

git add -A
git rebase --continue

1

Я просто натрапив на це питання. Я б не git rebase --skip тому, що git statusчітко відображаються модифікації, що зберігаються, які я хотів зберегти. Хоча у мене були додаткові файли, які з’явились несподівано. Я вирішив с

git checkout .

щоб видалити незменені зміни, тоді git rebase --continueвдалося.

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