Git revert - это слияние, но опция no -m не была предоставлена ​​[duplicate]

Имейте в виду, что независимо от сценария причина всегда одинакова в .NET:

Вы пытаетесь использовать ссылочную переменную, значение которой Nothing / null. Если для ссылочной переменной значение Nothing / null, это означает, что на самом деле оно не содержит ссылку на экземпляр любого объекта, который существует в куче.

Вы либо никогда не присваивали какую-либо переменную, никогда не создавали экземпляр значения, присвоенного переменной, или вы вручную устанавливали переменную, равную Nothing / null, или вы вызывали функцию, которая установите для этой переменной значение Nothing / null.

110
задан Greg Bacon 11 May 2011 в 22:54
поделиться

3 ответа

По умолчанию git revert отказывается возвращать фиксацию слияния, поскольку то, что на самом деле означает, является двусмысленным. Я предполагаю, что ваш HEAD на самом деле является фиксацией слияния.

Если вы хотите отменить фиксацию слияния, вы должны указать, какой родительский элемент слияния вы хотите рассматривать как основную магистраль, т.е. к которому вы хотите вернуться.

Часто это будет родительский номер один, например, если вы были на master и сделали git merge unwanted, а затем решили вернуть слияние unwanted. Первым родителем будет ваша ветвь pre-merge master, а второй родитель будет концом unwanted.

В этом случае вы можете сделать:

git revert -m 1 HEAD
118
ответ дан CB Bailey 25 August 2018 в 20:10
поделиться

Скажите, что другой парень создал панель поверх foo, но вы создали baz тем временем, а затем слились, дав историю

$ git lola
*   2582152 (HEAD, master) Merge branch 'otherguy'
|\  
| * c7256de (otherguy) bar
* | b7e7176 baz
|/  
* 9968f79 foo

. Примечание: git lola является нестандартным, но полезным псевдонимом.

Нет кубиков с git revert:

$ git revert HEAD
fatal: Commit 2582152... is a merge but no -m option was given.

Чарльз Бейли дал отличный ответ , как обычно. Использование git revert, как в

$ git revert --no-edit -m 1 HEAD
[master e900aad] Revert "Merge branch 'otherguy'"
 0 files changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 bar

, эффективно удаляет bar и создает историю

$ git lola
* e900aad (HEAD, master) Revert "Merge branch 'otherguy'"
*   2582152 Merge branch 'otherguy'
|\  
| * c7256de (otherguy) bar
* | b7e7176 baz
|/  
* 9968f79 foo

Но я подозреваю, что вы хотите выбросить слияние:

$ git reset --hard HEAD^
HEAD is now at b7e7176 baz

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

Как описано в руководстве git rev-parse

<rev>^, например HEAD ^, v1.5.1^0 Суффикс ^ к параметру ревизии означает первый родитель этого объекта commit. ^<n> означает n -го родителя ( i.e. <rev>^ эквивалентно <rev>^1). В качестве специального правила <rev>^0 означает сам commit и используется, когда <rev> является именем объекта тега, который ссылается на объект фиксации.

, поэтому перед вызовом git reset, HEAD^ (или HEAD^1) был b7e7176, а HEAD^2 был c7256de, , т.е. , соответственно первый и второй родители слияния.

Будьте осторожны с git reset --hard, потому что он может уничтожить работу.

36
ответ дан Community 25 August 2018 в 20:10
поделиться

У меня была эта проблема, решение заключалось в том, чтобы посмотреть на график фиксации (используя 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, то есть тот, который я хочу, чтобы выбрать cherry-pick.

4
ответ дан shmish111 25 August 2018 в 20:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: