Table of Contents
Repository全体を任意の過去commit-id地点に戻す
下記のようなcommit historyが存在し, 現在 main
ブランチの F123456
地点にHEADが存在するとします.
gitGraph
commit id:"A123456"
commit id:"B123456"
branch develop
commit id:"C123456"
commit id:"D123456"
checkout main
merge develop id:"E123456"
commit id: "F123456[HEAD]"
想定シナリオ
develop
branchマージ後に, 重大なバグが見つかりチームで以下のような対処で合意した
main
ブランチをdevelop
branchマージ前, つまりB123456
時点へ開発履歴を残したまま戻すdevelop
ブランチのD123456
時点でバグが混在してしまったことがわかってるので,D123456
から新しくHOTFIX
ブランチを作成し, バグ修正を実施するHOTFIX
ブランチでバグ修正が完了したら,develop
ブランチの最新にマージし, 結合テストを実施- 結合テストが通った後, 再び
main
ブランチへマージ
上記手順(3), (4)は,作業実施後に git merge
または Pull Requestを用いれば良いだけです. この記事では(1), (2)を git commandでどのように実行するかを紹介します.
git revert
: 任意の時点まで指定ブランチ環境を戻す
git revert
は, 過去のcommit-idを打ち消す形で新しいcommitを実行するコマンドです.
git reset
は過去commitを取り消す(= 歴史から消し去る)形で過去時点の状態を復元しますが, git revert
はあくまで, 過去のcommitを打ち消すcommitを実行するため, 歴史自体は残るという差分があります.
Syntax
特定の1つ commit-id
を打ち消したい場合
1
% git revert commit-id
連続した commit-id
を打ち消したい場合
1
% git revert older-commit-id..newer-commit-id
older-commit-id
以降(older-commit-id
は打ち消しに含まれない)からnewer-commit-id
まで(newer-commit-id
は打ち消し対象)commitが打ち消される
older-commit-id
を含む形でrevertしたい場合は
1
% git revert older-commit-id^..newer-commit-id
Option: --no-commit
git revert
は打ち消しcommitを実行するコマンドなので, デフォルトでは打ち消しのたびにcommit-messageの画面が立ち上がります. 単一のcommit-idを打ち消したい場合は問題ないですが, 複数を打ち消す場合はまとめてcommitをまとめたいニーズがあると思います.
1
2
3
4
5
## longer option
% git revert --no-commit
## short option
% git revert -n
と実行するとcommitの打ち消しをindexまでに留めてくれます(= 打ち消しのファイル修正 + git add
までの状態). その後, git commit
を実行する必要がありますが, 自分が意図した部分まで戻れているかcommitする前に確認できるメリットがあります.
間違ったrevert
を実行してしまったと気づいたときは
1
% git revert --abort
B123456
時点へ戻したい
gitGraph
commit id:"A123456"
commit id:"B123456"
branch develop
commit id:"C123456"
commit id:"D123456"
checkout main
merge develop id:"E123456"
commit id: "F123456[HEAD]"
上記の状態のとき, B123456
時点へ戻す方法として
1
2
% git revert B123456..HEAD --no-commit
% git commit -m "REVERT: revert to B123456 because of bug detection, #ISSUE 123"
または
HEAD~1
: E123456HEAD~2
: B123456
に対応するので HEAD
を用いる場合だと
1
2
% git revert HEAD~2..HEAD --no-commit
% git commit -m "REVERT: revert to B123456 because of bug detection, #ISSUE 123"
git switch
: 任意のcommit-id時点から新しくブランチを作成
commit-idを指定してbranch作成
D123456
から新しくHOTFIX
ブランチを作成したいと明確な場合は
1
% git switch -c HOTFIX D123456
detached HEADの活用
場合によってはブランチは作成したくないが, 任意のcommit-id時点での状態を確認したいケースがあります. この場合, detached HEADな状態をあえて作り出して, その時の状態を確認するということが手法の1つとしてあります.
定義: detached HEAD
通常は,
- HEADはブランチを参照
- ブランチがcommit-idを参照
という順番になっていますが, detached HEADとはHEADがcommit-idを直接参照してしまっている状態を意味します.
detached HEAD状態のときに, git branch
を叩くと
1
2
3
4
% git branch
* (HEAD detached at dfe91d6)
main
develop
上記のように確認できます.
意図的にdetached HEAD状態を作り出したいときは
1
% `git switch -d <commit-id>`
今回の場合は
1
% git switch -d D123456
References
(注意:GitHub Accountが必要となります)