Git: Помилка "Не вдається" сквош "без попереднього коміту" під час перебазування


96

У тексті завдань git rebase -i HEAD~2:

pick 56bcce7 Closes #2774
pick e43ceba Lint.py: Replace deprecated link

# Rebase 684f917..e43ceba onto 684f917 (2 command(s))
#
...

Тепер, коли я намагаюся стиснути перший ( 56bcce7) і вибрати другий, додавши перед першим "s", я отримую таку помилку:

Cannot 'squash' without a previous commit

Хтось може пояснити мені, що це означає, і як я це можу зробити?

Я хочу стиснути перший коміт ( 56bcce7) та "вибрати та переформулювати" другий ( e43ceba) коміт


1
Змініть HEAD ~ 2 на HEAD ~ 3, якщо ви дійсно хочете кабачок.
ElpieKay,

1
І можливо, використовуйте --root, якщо HEAD ~ 2 - це ваш перший коміт: stackoverflow.com/a/598788/2444812
Sybille Peters

Відповіді:


81

Інтерактивне перебазування представляє коміти у зворотному порядку, до якого ви звикли під час використання git log. git rebase -iповторно відтворює вибрані коміти в точному порядку (зверху вниз), вони вказані у збереженому файлі інструкцій щодо перебазування. Під час стиснення коміт, вибраний для стиснення, поєднується з комітом, який передує йому у (відредагованому) списку, тобто комітом із попереднього рядка. У вашому випадку - попереднього коміту для 56bcce7. Ви повинні зробити одне з наступного

  • git rebase -i HEAD~3(Якщо ви хочете , щоб розчавити 56bcce7в 684f917)
  • Якщо ви маєте в виду поєднувати 56bcce7з e43ceba, і e43cebaне залежить від 56bcce7, а потім просто змінити їх порядок:

    r e43ceba Lint.py: Replace deprecated link
    s 56bcce7 Closes #2774
    

    ОНОВЛЕННЯ : Відповідь Гаса нижче пропонує кращий спосіб зробити те ж саме, не змінюючи порядок двох комітів:

    r 56bcce7 Closes #2774
    s e43ceba Lint.py: Replace deprecated link
    

    Це призведе до стиснення / об’єднання двох комітів в один. Коли інтерактивна база даних запитує переформульоване повідомлення коміту для 56bcce7, надайте повідомлення коміту, яке описує об'єднання 56bcce7та e43ceba.


1
Я хочу , щоб розчавити 56bcce7 в e43ceba. Отже, як мені зробити Крок 1 тут?
Dawny33

83

У мене була подібна проблема, яку я вирішив наступним чином:

Це група комітів, яку я хотів розчавити:

1 s 01cc5a08 Removes open div
2 s a2b6eecf Restores old fonts
3 s 603479ff Cleans left out div
4 pick 5afdbc33 Update: show logo on landing page
5 s 04c1cb13 change version of dev and prod from 1 to 2
6 s bbe6a8f8 Update: show logo on landing page if they have one
7 s c0d6008a Adds check for C users

Як бачите, я хотів ні. 4, але 1, 2 і 3 не мали жодного попереднього комітету, щоб втиснутись . Звідси Cannot 'squash' без попередньої помилки коміту .

Моє рішення було використовувати rопцію для# r, reword = use commit, but edit the commit message

Тож мій список комітів виглядав так:

1 r 01cc5a08 Removes open div
2 s a2b6eecf Restores old fonts
3 s 603479ff Cleans left out div
4 s 5afdbc33 Update: show logo on landing page
5 s 04c1cb13 change version of dev and prod from 1 to 2
6 s bbe6a8f8 Update: show logo on landing page if they have one
7 s c0d6008a Adds check for C users

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

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


2
як і я, якщо у вас з’явилася помилка, оскільки ви не вибрали жодного коміту для переформулювання або вибору та отримання згаданої помилки (щодо питання), вам потрібно буде зробити git rebase --edit-todoта виправити посилання на цю відповідь, а потім зробитиgit rebase --continue
old-monk

Ця відповідь була короткою і
суттєвою

16

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

1 pick 01mn9h78 The lastest commit
2 pick a2b6pcfr A commit before the latest
3 pick 093479uf An old commit i made a while back

Тепер, якщо ви скажете git rebase -i HEAD~3і зробите щось подібне

1 pick 01mn9h78 The lastest commit
2 s a2b6pcfr A commit before the latest
3 s 093479uf An old commit i made a while back

Це призведе до помилки:

помилка: неможливо "сквош" без попереднього коміту. Ви можете виправити це за допомогою "git rebase --edit-todo", а потім запустити "git rebase --continue". Або ви можете скасувати перебазування за допомогою 'git rebase --abort'.

Рішення:

Змінюючи комміти, вам слід стиснути останні коміти до старих, а не навпаки, отже, у прикладі це буде приблизно так:

1 s 01mn9h78 The lastest commit
2 s a2b6pcfr A commit before the latest
3 pick 093479uf An old commit i made a while back

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


5
Дякую - я не часто змушую коміти, і порада вибрати найстаріший коміт - це те, що допомогло мені пройти непомітну помилку git.
0x574F4F54

3

Сквош із зворотною логікою . На наступному кроці ви зможете вибрати потрібне повідомлення про коміт.

  • pickперший коміт, для якого ви не хочете повідомляти коміт.
  • squashабо fixupкоміти, які ви хочете об’єднати, до тих, що містять повідомлення про коміт, яке ви насправді бажали.
pick 56bcce7 Closes #2774
squash e43ceba Lint.py: Replace deprecated link
  • підтвердити зміну ( :x)
  • видаліть повідомлення (і) коміту, яке ви не хочете, і залиште лише повідомлення з коміту, яке ви бажаєте (у цьому випадку Lint.py: Replace deprecated link:).
  • підтвердити вибір ( :x)

Сподіваюся, комусь це зрозуміліше ✌🏽


1

Найкраще буде просто сказати в інтерактивному редакторі, що містить коміти, git завжди сквош знизу вгору, і слід залишити запис "вибрати" вгорі, щоб отримувати сквоші знизу.


1

Я просто спробував такий підхід.

git log -n3

Це покаже останні 3 коміти, які дадуть мені уявлення про те, що є останнім комітом і який з них виконувався раніше. Зараз зазначено перебазування,

git rebase -i HEAD ~ 3

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

виберіть commit_id

Для інших двох ідентифікаторів комітів змініть їх на,

сквош commit_id

або просто,

s commit_id


0

Я також вже зараз зустрічався з цією проблемою, це просто необережно. Ви можете вирішити проблему, як наступне: коли ви намагаєтесь стиснути перший (56bcce7) і вибрати другий, вам слід додати "s" перед другим рядком, але не перший. Ви також можете звернутися до наступного веб-сайту: http://backlogtool.com/git-guide/en/stepup/stepup7_5.html


1
Привіт ! Було б краще, якби ви перевірили Як створити мінімальний, повний та перевіряється приклад для майбутніх зусиль у Stack overflow. -Дякую
Момін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.