2

Возникла ситуация, что мне необходимо откатить все изменения на ветке к моменту её создания, т.е. к моменту, когда была выполнена команда:

git checkout -B <имя_ветки>

Возможно ли это? Как это сделать?

UPD01. Цель откатится именно к тому состоянию, когда git начал понимать, что появилась новая ветка. Нет возможности пересоздать ветку.

anderson
  • 417
  • Т.е. при создании ветки так же создаётся коммит? В таком случае как узнать какой был первым? – anderson Feb 27 '18 at 11:21
  • "Т.е. при создании ветки так же создаётся коммит?" Нет, необязательно. Ветка всегда указывает на коммит. Несколько веток вполне могут указывать на один. Нет, информации о том, откуда ветка началась, git не хранит, только где заканчивается. –  Feb 27 '18 at 11:31
  • @D-side но откуда ветка началась все таки можно отследить. Например: https://stackoverflow.com/questions/18407526/git-how-to-find-first-commit-of-specific-branch – lazyproger Feb 27 '18 at 11:36
  • @lazyproger это для случая, когда известно, от чего было ответвление. В общем случае это не сработает, но на практике обычно хватает. –  Feb 27 '18 at 11:37
  • 1
    git log --graph найти hash коммита где была создана ветка, git revert #hash – Kostiantyn Okhotnyk Feb 27 '18 at 11:42
  • @D-side вообще если честно странная задача у автора, обычно хватает просто уйти с ветки и забыть про неё, но у автора походу слишком специфичная задача – lazyproger Feb 27 '18 at 11:44
  • Ветка запушена на сервер или мы говорим про локальное создание ветки? – A K Feb 27 '18 at 19:33

1 Answers1

2

термин «ветка» («branch») — явно неудачный (в контексте сущностей, которыми манипулирует программа git).

ведь под словом «ветка» мы обычно подразумеваем нечто, имеющее «начало»/«основание», (как минимум один) «конец» и «что-то между ними».

в программе же git сущность, обозначаемая этим термином, представляет собой всего лишь указатель на один-единственный коммит.

эти указатели вы можете (почти) произвольно создавать:

$ git branch имя-нового-указателя куда-будет-указывать

удалять:

$ git branch -d имя-существующего-указателя

и перемещать:

$ git branch -f имя-существующего-указателя куда-будет-указывать

эти действия (понятно, кроме удаления) программа git фиксирует внутри хранилища в файле logs/refs/heads/имя-указателя. пример такого файла:

$ cat .git/logs/refs/heads/new 
0000000000000000000000000000000000000000 3d1a162a716b9ea2a91026912cf1162bf30e348d автор <автор@компьютер> 1519736572 +0300  branch: Created from HEAD

3d1a1... — это хэш коммита, на который указывал в момент создания указатель («ветка», «branch») по имени new.


если указатель («ветку», «branch») создавали именно вы в своей локальной копии хранилища, и не выполняли (пока) «сборку мусора» ($ git gc), то запись, озаглавленная подобным текстом (branch: Created from) будет в упомянутом файле присутствовать (самой первой). тогда вы сможете переключить указатель на упомянутый в записи коммит:

$ git branch -f ваш-указатель хэш-коммита

если же такой записи не найдёте, то для поиска нужного коммита можно просмотреть всё «дерево» коммитов примерно такой командой:

$ git log --all --graph --decorate