Да , это возможно, а не сложно. Краткая версия: 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
и снова начали работать над ним.
Важным моментом является то, что вы должны редактировать историю филиалов, как это, в своих собственных репозиториях, а не публичных, которые могли бы извлечь другие люди. Если вы нажмете это на публичный репозиторий, из которого люди выходят, тогда им придется переупаковать все их изменения, и лучше не делать так, чтобы они делали это, если это абсолютно необходимо.
Когда я был знаком с git и попал в аналогичные ситуации, я обнаружил, что «gitk -all» очень полезен для того, чтобы видеть, как связаны коммиты и ветви, а также выполнять некоторые операции с графическим интерфейсом. – ndim
Это был не тот факт, что мне нужно было визуально видеть отношения (любовь gitk - all & tortoisegit, чтобы визуализировать вещи кстати), но я предположил, что для фиксации 1, 2 и 3 нужно быть на ветке * aBranch *, I должен * начинать * с * aBranch *, делая фиксацию 1 (надеюсь, у меня есть смысл кому-то :). Теперь я понимаю, насколько глупо это. –