Как я могу удалить фиксацию в ветке удаленного голого репозитория?

описание проблемы

Я попал в gitpickle. Это изображение иллюстрирует ситуацию, в которую я себя поставил:

Коммит разработчиков

Неудивительно, что теперь я не могу нажать зеленые коммиты, потому что обновления без быстрой перемотки вперед отклоняются. На удаленном компьютере я попытался проверить ветку dev, чтобы выполнить команду git reset --hard HEAD~1, чтобы стереть фиксацию на удаленном компьютере, но это голое репо, поэтому я не могу проверить ветку dev. Текущая ветвь всегда является «ведущей». Моя цель — просто удалить красную фиксацию на удаленном компьютере, чтобы я мог нажать зеленые фиксации.

Вопрос

Как я могу удалить красную фиксацию в удаленной ветке dev без проверки ветки dev на удаленном компьютере?

Заметки

  • Я не хочу форсировать толчок, потому что другие репозитории тянут с пульта, и я не хочу их ломать. Тем не менее, я знаю, что никто еще не вытащил из удаленного, поэтому я могу просто удалить красный коммит.
  • Теперь я вижу, что в будущем мне следует использовать команду git revert, когда коммит, который необходимо отменить, уже был отправлен.
  • У меня также есть главная ветка, выпускные ветки и различные ветки функций, которые я не упомянул, чтобы упростить образ. Дайте мне знать, если они актуальны, и я добавлю их.

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

Я просмотрел эти вопросы (и многие другие), но я не думаю, что они касаются моего текущего вопроса, потому что либо я не вижу, как я могу применить их решения для удаления фиксации на удаленном компьютере, либо они не работа для голых репозиториев.

Что означает отклонение обновлений без быстрой перемотки Git?
Как отменить последние фиксации в Git?
Как могу ли я перемотать ветку вперед, не проверяя ее
Перебазировать ветку, не проверяя ее


person skrrgwasme    schedule 10.03.2015    source источник


Ответы (1)


Я не хочу форсировать толчок, потому что другие репозитории тянут с пульта, и я не хочу их ломать. Тем не менее, я знаю, что никто еще не вытащил из удаленного, поэтому я могу просто удалить красный коммит.

Силовое нажатие по-прежнему именно то, что вы хотите сделать здесь. Принудительное нажатие не ломает удаленный репозиторий волшебным образом для всех вовлеченных сторон; вместо этого при нажатии с флагом force вы просто говорите Git обновить указатель ветки, даже если это означает, что необходимо внести изменения без быстрой перемотки вперед.

Представьте, что это ваша ситуация на вашем (голом) пульте:

A -- B -- C -- D
               ↑
             master

Имейте в виду, что ветки — это просто указатели на коммиты в истории репозитория. Теперь вы хотите отправить коммит E, который имеет C в качестве родителя, поэтому на первом этапе вы просто передаете коммит:

            /-- E
           /
A -- B -- C -- D
               ↑
             master

Теперь вы также указываете удаленному модулю обновить свою ветку master, чтобы она указывала на E. В обычной ситуации Git откажется это делать, потому что master нельзя перемотать вперед на E. Таким образом, вместо этого вам придется принудительно нажать, чтобы Git проигнорировал этот факт. Итак, удаленный репозиторий будет выглядеть так:

              master
                ↓
            /-- E
           /
A -- B -- C -- D

Таким образом, если какая-либо другая ветвь не указывает на D (прямо или косвенно), этот коммит теперь «потерян» и в конечном итоге будет удален сборщиком мусора.

Обычно вы хотите избежать этого, потому что каждый, кто знает коммит D (и имеет локальную ветку, указывающую на него), будет иметь проблемы с новым удаленным. Например. если бы мой старый локальный master указывал на D, мне пришлось бы вручную сбросить свою ветку, чтобы master вместо этого указывал на E. Поэтому обычно правило состоит в том, чтобы никогда не удалять ничего (технически мы удаляем D из истории), которое мы когда-то нажали.

Однако, если вы уверены, что никто никогда не получал D, то в этом нет ничего плохого. Те, у кого никогда не было D, не поймут, что D исчезли, и не подумают, что master всегда было таким. А все остальные коммиты, существовавшие до принудительного нажатия и все еще существующие позже, ничего в ситуации не меняют. Учитываются только те коммиты, которые «удалены» вашим принудительным нажатием.

person poke    schedule 11.03.2015
comment
Если вы уверены, что кто-то еще вытащил коммиты, то принудительное нажатие — это именно то, что вам нужно сделать. - person Noufal Ibrahim; 11.03.2015