Да, это возможно, и не сложно. Краткая версия: git branch aBranch
для создания новой ветви, git stash
для сохранения любых незафиксированных изменений и git reset --hard 1
для сброса master
в фиксацию, которую вы хотели бы, и при необходимости git stash pop
, чтобы применить эти незафиксированные изменения к вашей текущей рабочей копии, если они были предназначены для новой ветви master
.
Вот полное объяснение с диаграммами, чтобы вы могли следовать за ними. Далее я буду обозначать текущую ветвь (HEAD) с помощью *
.
0--1 *master
0--1--2 *master
0--1--2--3 *master
Создать новую ветку aBranch
, указывающую на текущий коммит:
$ git branch aBranch
0--1--2--3 *master aBranch
Если у вас есть какие-либо изменения в рабочей копии, которые еще не были зафиксированы, сохраните их с тайником (это важно, так как git reset --hard
уничтожит все ваши незафиксированные изменения):
$ git stash
0--1--2--3 *master aBranch
\- 4 stash
Теперь сбросьте master
обратно к ревизии, в которой вы хотите. Я использую 1
ниже в качестве заполнителя; вы можете захотеть использовать SHA-1 или что-то вроде origin/master
, если вы хотите сбросить его до версии, в которой находилась ветка master
восходящего потока до того, как вы сделали свои коммиты:
$ git reset --hard 1
0--1--2--3 aBranch
\ \- 4 stash
\- *master
Если у вас были незафиксированные изменения в вашей рабочей копии, которые вы спрятали, и вы хотите применить их к master
, вы можете использовать git stash apply
или git stash pop
(apply
оставит тайник записанным как коммит ; pop
очистит тайник).
$ git stash pop
0--1--2--3 aBranch
\- *master (with stashed changes now back in your working copy)
Теперь вы находитесь на master
и сброситесь на коммит 1, именно так, как вы хотели. Новые коммиты попадут в ветку master
.
0--1--2--3 aBranch
\-4 *master
0--1--2--3 aBranch
\-4--5 *master
Обратите внимание, что если ваша рабочая копия чистая (ничего не сообщается git status
), вам не нужна команда git stash
. Если вы хотите применить свои изменения к aBranch
вместо master
, вы просто используете git stash pop
, когда в следующий раз вернетесь к aBranch
и снова начнете работать над ним.
Один важный момент, который следует иметь в виду, заключается в том, что вы должны редактировать историю веток, подобную этой, в своих личных репозиториях, а не в общедоступных, из которых другие пользователи могли бы извлечь. Если вы отправите это в общедоступный репозиторий, из которого люди извлекают данные, им придется перебазировать все свои изменения, и лучше не заставлять их делать это без крайней необходимости.