Вишни выбрать коммит и сохранить оригинальный код SHA

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

3 ответа

Решение

Хеш git SHA вычисляется по разным частям информации:

  1. Дерево, к которому оно относится; в основном, текущее содержимое репозитория в ветке, в которой появляется коммит.
  2. SHA родительского коммита (ов).
  3. Сообщение коммита.
  4. Информация об авторе: имя, адрес электронной почты и отметка времени.
  5. Информация о коммитере: имя, адрес электронной почты и метка времени.

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

Хэш коммита SHA создается из состояния репозитория, используя всю историю до момента коммита (ветви не включены). Это означает, что вы не можете сохранить первоначальный хеш при сборке вишни, если вся история не совпадает, и в этом случае сбор вишни не будет иметь смысла.

В соответствии с вашими комментариями к другим ответам, я думаю, что вы просто хотите сбросить некоторые удаленные коммит Ты можешь использовать git reset --hard <SHA> сделать это. ВНИМАНИЕ: Это отменит все ваши (незафиксированные) изменения в рабочем каталоге, и все коммиты, сделанные вами в этой ветке, больше не будут доступны.

Если это не то, что вы хотите (или вы не уверены), пожалуйста, опишите более четко, что вы сделали и что вы хотите сделать или что вы пытаетесь достичь.

Перейдите в интерактивную перебазировку ("git rebase -i") и вставьте новую запись в конце с точной версией, которую вы хотите добавить в HEAD.

Пример:

Откройте интерактивный сеанс перебазирования:

$ git rebase -i HEAD~4

На экране теперь отображается [что-то вроде] это:

pick efdd0ece Linked how to make a pull requests in README
pick 790a3be8 adjust pytest pins to fix testing infra
pick 5bb90d8f drop 3.4 support
pick 839dc8ba v2.22.0
pick b97fb61a Print the type of the password instead of the password itself

Ваша текущая ГОЛОВА - последняя запись. Добавьте новую запись внизу (просто "выберите" и свою ревизию; описание не требуется) с точной ревизией, которую вы хотите добавить:

pick efdd0ece Linked how to make a pull requests in README
pick 790a3be8 adjust pytest pins to fix testing infra
pick 5bb90d8f drop 3.4 support
pick 839dc8ba v2.22.0
pick b97fb61a Print the type of the password instead of the password itself
pick 2a173c2a6491aae0772640ba7946a08315d18eb8

Сохранить и закрыть. Эта точная версия теперь будет вашей ГОЛОВКОЙ:

$ git log --oneline | head -n 6
2a173c2a Some commit
b97fb61a Print the type of the password instead of the password itself
839dc8ba v2.22.0
5bb90d8f drop 3.4 support
790a3be8 adjust pytest pins to fix testing infra
efdd0ece Linked how to make a pull requests in README

Как упоминалось в других ответах, вам все равно нужно соблюдать правила. Это работает только в очень узком случае, когда у вас одна и та же ветвь, родители и коммиттер (например, в процессе, ориентированном на проверку кода, когда у вас есть куча коммитов в очереди где-то, где разработчики могут подтолкнуть их и сбросьте их, не обязательно предварительно отправляя их в репозиторий); на самом деле только тогда, когда временные метки - единственное, что могло измениться. В этом случае вы можете принудительно установить идентичную ревизию, чтобы временные метки оставались неизменными.

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

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

Другие вопросы по тегам