Во-первых, обратите внимание, что требуемый TestBranch просто указывает на текущий коммит 3; вам не нужно ничего делать, кроме git branch TestBranch <commit 3>
, чтобы сделать это. Помните, что ветки - это просто указатели на коммиты. Это должно ответить на ваш вопрос о SHA1 коммитов 2 и 3. Вы не изменили эти коммиты вообще, поэтому их SHA1, конечно, одинаковы.
Чтобы получить текущую ветку (master) там, где вы хотите (коммиты 1, 4, 5), вы действительно сделаете ребаз. Это очень простой случай для его интерактивного режима. Сначала запустите:
git rebase -i <commit 1> master # -i is a synonym for --interactive
Git запустит ваш редактор и покажет вам все коммиты, начиная с коммита 1 в вашей основной ветке (2,3,4,5), вместе с некоторыми подсказками о том, что делать. Вам просто нужно удалить строки для коммитов 2 и 3, затем сохранить и выйти. Затем он применяет то, что осталось (4 и 5), оставляя вас с тем, что вы хотите. Конечно, если коммиты 4 и 5 зависели от коммита 2 или 3, вы получите конфликты слияния, когда git попытается применить свои патчи во время ребазинга.
Обратите внимание, что это изменит изменения SHA1 коммитов 4 и 5, поскольку SHA1 коммита зависит от его родителя. Это будет мешать любому, кто потянул эту ветку. (Вас предупредили.) Ваш фактический конечный результат будет более точно описан так:
- 1 - 4' - 5' (HEAD, master)
\
2 - 3 (TestBranch)
Коммиты 4 'и 5' имеют те же различия, что и коммиты 4 и 5, но имеют разных родителей, поэтому они являются разными коммитами.