@albertalexandrov

Как из ситуации start получить ситуацию end?

Привет всем!

Прошу подсказать, как с помощью команд в git из ситуации start (рис. 15) сделать ситуацию end (рис. 16)?

5bab274d97d8a682943899.jpeg

Сам я решил эту задачу с использованием временной ветки от коммита С3 так:
1. Переключаюсь на коммит С3 и создаю временную ветку TEMP:
$ git checkout C3
$ git checkout –b TEMP

3. Выполнить изменения и коммичу:
$ git commit –am “C10”

4. Переключаюсь на ветку F3 и выполняю rebase на TEMP (решаю конфликты, если есть):
$ git checkout F3
$ git rebase TEMP

5. Ветка TEMP будет указывать на коммит С10, F3 – на С9’:

5bab28bf442f5088957478.png

Поэтому переносим ветку TEMP на коммит C9’:
$ git branch –f TEMP C9’

6. Удаляем ветку TEMP:
$ git branch –d TEMP

7. Переносим коммит C4:
$ git cherry-pick C4
  • Вопрос задан
  • 261 просмотр
Решения вопроса 1
sergey-kuznetsov
@sergey-kuznetsov Куратор тега Git
Автоматизатор
Другой вариант:
git checkout F1^ # переместить HEAD на C3
git commit –m "C10" # добавить коммит
git rebase --onto HEAD master F3 # пересадить сюда кусок ветки F3
git cherry-pick F1 # скопировать коммит С4 с вершины ветки F1

Ничего лишнего и обошлось без временной ветки и без возни с хешами – только имена веток в командах. Алгоритм на четыре шага короче.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
dlnsk
@dlnsk
ПК Партнер 01.01 -> ПК Поиск -> IBM PC
Варианты есть. Я придумал вот такой, довольно экстравагантный:
$ git checkout F1
$ git reset --hard HEAD^ (первые две команды можно заменить на git checkout -B F1 C3)
$ git commit –am “C10”
$ git checkout F3
$ git rebase F1
$ git cherry-pick C4
$ git checkout -B F1 C4

И все ветки будут на своих местах.
Скажете, что я на втором шаге удалил C4... ну да, удалил! ;) Только это ничего не меняет, все будет работать.
Просто нужно помнить что удаляя коммиты и двигая ветки вы в реальности ничего не удаляете (если, конечно, не запустите сборку мусора). Т.е. мы, например, легко можем восстановить утерянные коммиты C8 и C9 если выполним
$ git checkout -b test C9
Ну а если вы уже забыли что именно удалили, то git reflog вам в помощь.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы