Возврат к конкретному коммиту без потери истории

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

Я знаю, что могу вернуться и сохранить историю, выполнив:

git reset --soft c14809fa

Я хочу вернуть development ветвь и держи историю на другой ветке.

Если я оформить заказ development в новую ветку, прежде чем я верну коммиты - например

git checkout -b beforeRevert

Чем я вернусь обратно в ветку разработки и сделаю откровение (потому что я хочу продолжить работу с данными из коммитов, к которым я возвращался)

Другая ветвь, beforeRevert ветвь, сохранит всю историю и данные "до возврата", которые когда-нибудь снова будут использоваться, но не будут включены в текущую development ветка? Или возвращение на development ветка каким-то образом повлияет на beforeRevert ветка?

5 ответов

Если вы уверены, что ни мягкий сброс, ни создание нескольких веток не подойдут для вашего случая использования, вы можете сделать

git diff HEAD commit_hash_to_go_to | git apply

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

ПРИМЕЧАНИЕ: это просто изменяет файлы и помечает их как измененные. Это НЕ изменяет историю коммитов и не создает новые коммиты.

Как вы говорите, проще всего было бы просто создать новую ветку, в которой HEAD есть, а затем вернуться development на коммит, с которого вы хотите возобновить работу:

git checkout development   # Make HEAD point to the 'development' branch
git branch beforeRevert    # Create a new branch reference pointing to HEAD
git reset --hard c14809fa  # Move HEAD, the index and your working copy to c14809fa

Вот графическое представление того, что произойдет:

    Step 1               Step 2                  Step 3

            develop    develop, beforeRevert   develop   beforeRevert
           /                    /             /         /
A-B-C-D-E-F          A-B-C-D-E-F             A-B-C-D-E-F
          ^                    ^             ^
         HEAD                 HEAD          HEAD

Здесь важно то, что HEAD всегда указывает на development ветвь, так что это ветвь, которая перемещается при запуске git reset --hard c14809fa, Новый beforeRevert ветвь все еще будет указывать на то, где HEAD был до возвращения.

Не отменяйте свои изменения, просто вернитесь к предыдущему коммиту и затем извлеките новую ветку оттуда.

git checkout development
git checkout c14809fa
git checkout -b newBranch

Таким образом, вы можете посетить ветку "Разработка", чтобы увидеть старые изменения и историю, и вы можете внести дальнейшие изменения в "NewBranch"

Вы можете переименовать ветки, если хотите наоборот -

git branch -m <oldname> <newname>

Нашел ответ здесь

      git reset --hard oldestCommitHash
git reset --soft mostRecentCommitHash #
git commit
  • Это сохранит вашу историю, но вернет вас в то же состояние, что и oldCommitHash.
  • Обратите внимание#после того, как MostRecentCommitHash является намеренным и должен присутствовать

git merge <old commit>

Это создаст новую фиксацию (с выбранным вами сообщением), которая восстановит ваше рабочее пространство до

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