Чому git revert скаржиться на пропущений варіант -m?


185

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

фатально: Команда <SHA1> - це злиття, але опція -m не була надана.

Що це означає? Коли я злився і скористався, я скористався параметром -m, щоб сказати "Злився з <ім'ям користувача>".

Що я тут роблю неправильно?

Відповіді:


217

За замовчуванням git revertвідмовляється повернути комісію злиття, оскільки це насправді означає неоднозначно. Я припускаю, що ви HEADнасправді є об'єктом злиття.

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

Часто це буде батьківським номером номер один, наприклад, якщо ви ввійшли masterі зробили, git merge unwantedа потім вирішили скасувати злиття unwanted. Перший з батьків буде вашою masterгілкою перед об'єднанням, а другий з батьків - підказкою unwanted.

У цьому випадку ви можете зробити:

git revert -m 1 HEAD

4
Добре, дякую. Мені було простіше просто змінити два файли, на які впливає злиття, а потім здійснити деякі інші зміни.
icnhzabot

43
Де я можу знайти інформацію, чи потрібно використовувати -m1 або -m2, ...?
Патрік Корнеліссен

34
git cat-file -p [MERGE_COMMIT_ID]покаже материнські гілки в порядку. Перший з них був би -m 1другим, другий -m 2.
nostromo

2
git revert [HASH] -m 2говорить мені на гілці 1.x-1.x нічого не потрібно робити, робочий каталог чистий, але моя фіксація не повернена.
Дженламптон

3
Отже, якщо мені потрібно повернути минулі 10 злиття (що цілком ймовірно, оскільки git автоматично зливає кожен раз, коли я втягую зміни від іншого розробника), я повинен робити це для кожного злиття? Отож, чому прихильники git настільки захоплюються перезаписом, оскільки повернення в основному марне?
Нейтрино

46

Скажіть, що інший хлопець створив бар поверх foo, але ви тим часом створили baz, а потім злилися, даючи історію

$ git lola
* 2582152 (HEAD, master) Об'єднання гілки 'otherguy'
| \  
| * c7256de (otherguy) бар
* | b7e7176 baz
| /  
* 9968f79 foo

Примітка: git lola - це нестандартний, але корисний псевдонім.

Без кісток з git revert:

$ git revert HEAD
фатально: Команда 2582152 ... є об'єднанням, але не було задано жодного варіанту.

Чарльз Бейлі дав чудову відповідь, як завжди. Використовуючи git revertяк в

$ git revert --no-edit -m 1 ГЛАВА
[master e900aad] Скасувати "Об'єднання гілки" otherguy ""
 0 файлів змінено, 0 вставок (+), 0 видалень (-)
 режим видалення 100644 бар

ефективно видаляє barта створює історію

$ git lola
* e900aad (HEAD, master) Скасувати "Об'єднання гілки" otherguy ""
* 2582152 Об’єднати відділення 'otherguy'
| \  
| * c7256de (otherguy) бар
* | b7e7176 baz
| /  
* 9968f79 foo

Але я підозрюю, що ви хочете відкинути комісію злиття:

$ git скидання - тверда голова ^
HEAD зараз на рівні b7e7176 баз

$ git lola
* b7e7176 (HEAD, master) baz
| * c7256de (otherguy) бар
| /  
* 9968f79 foo

Як зазначено в git rev-parseпосібнику

<rev>^, наприклад HEAD ^,v1.5.1^0
суфікс ^до параметра ревізії означає перший батьківський об'єкт цього об'єкта. ^<n>означає n -го батьків ( тобто <rev>^ еквівалентно <rev>^1). Як спеціальне правило, <rev>^0означає саме фіксація і використовується, коли <rev>це ім'я об'єкта тега, який посилається на об'єкт фіксації.

тому перед тим, як викликати git reset, HEAD^(або HEAD^1) був b7e7176 і HEAD^2був c7256de, тобто відповідно перший і другий батьки комісії злиття.

Будьте обережні, git reset --hardоскільки це може знищити роботу.


3
Це змішаний, заплутаний, потрясли світ. За винятком Лоли. Дякую мільйон за цей фантастичний псевдонім.
Барні

Простий спосіб додати lolaдо своїх команд git:git config --global alias.lola "log --graph --decorate --pretty=oneline --abbrev-commit --all"
D. Gibbs

8

У мене була ця проблема. Рішенням було подивитися графік фіксації (за допомогою gitk) і побачити, що у мене є наступне:

*   commit I want to cherry-pick (x)
|\  
| * branch I want to cherry-pick to (y)
* | 
|/  
* common parent (x)

Тепер я розумію, що хочу зробити

git cherry-pick -m 2 mycommitsha

Це тому, -m 1що злиття базується на загальному батьківському місці, де, як -m 2злиття, засноване на гілці y, це те, до якого я хочу вишу.


1
Можливо, тому, що це не пов’язано git-revert, з чим це питання.
pnomolos

1
Я думаю, що це питання стосується -mваріанту, а не виключно про git merge. Тобто, міркування щодо використання цього -mваріанту, здавалося б, подібні для ревертів та вишень. Якщо це неправда, повідомте нас про це. Оскільки я не знайшов жодних інших питань, які б стосувалися конкретного використання вишні, дякую за цю відповідь, яка, ймовірно, призвела до google, щоб допомогти мені знайти це питання та корисну, відповідну дискусію!
nealmcb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.