git

git switch: 任意の過去commitに戻り, 新たにbranchを作成する

How to use git command 14/N

公開日: 2021-05-14
更新日: 2024-03-27

  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マージ後に, 重大なバグが見つかりチームで以下のような対処で合意した

  1. mainブランチを develop branchマージ前, つまり B123456時点へ開発履歴を残したまま戻す
  2. developブランチの D123456 時点でバグが混在してしまったことがわかってるので, D123456から新しくHOTFIXブランチを作成し, バグ修正を実施する
  3. HOTFIXブランチでバグ修正が完了したら, developブランチの最新にマージし, 結合テストを実施
  4. 結合テストが通った後, 再び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: E123456
  • HEAD~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



Share Buttons
Share on:

Feature Tags
Leave a Comment
(注意:GitHub Accountが必要となります)