Возврат к конкретному коммиту без потери истории
Я знаю, что этот тип вопроса имеет много дубликатов, но я хотел открыть новый, потому что во всех остальных вопросах я не нашел объяснения наилучшего способа сделать это так, как я хочу.
Я знаю, что могу вернуться и сохранить историю, выполнив:
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>
Это создаст новую фиксацию (с выбранным вами сообщением), которая восстановит ваше рабочее пространство до