Имейте в виду, что независимо от сценария причина всегда одинакова в .NET:
Вы пытаетесь использовать ссылочную переменную, значение которой
Nothing
/null
. Если для ссылочной переменной значениеNothing
/null
, это означает, что на самом деле оно не содержит ссылку на экземпляр любого объекта, который существует в куче.Вы либо никогда не присваивали какую-либо переменную, никогда не создавали экземпляр значения, присвоенного переменной, или вы вручную устанавливали переменную, равную
blockquote>Nothing
/null
, или вы вызывали функцию, которая установите для этой переменной значениеNothing
/null
.
По умолчанию git revert
отказывается возвращать фиксацию слияния, поскольку то, что на самом деле означает, является двусмысленным. Я предполагаю, что ваш HEAD
на самом деле является фиксацией слияния.
Если вы хотите отменить фиксацию слияния, вы должны указать, какой родительский элемент слияния вы хотите рассматривать как основную магистраль, т.е. к которому вы хотите вернуться.
Часто это будет родительский номер один, например, если вы были на master
и сделали git merge unwanted
, а затем решили вернуть слияние unwanted
. Первым родителем будет ваша ветвь pre-merge master
, а второй родитель будет концом unwanted
.
В этом случае вы можете сделать:
git revert -m 1 HEAD
Скажите, что другой парень создал панель поверх 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
blockquote>
<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
, потому что он может уничтожить работу.
У меня была эта проблема, решение заключалось в том, чтобы посмотреть на график фиксации (используя 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.