gitで現在のbranchから移動せずに他のbranchのrevisionする方法を調べました。
例えば、現在のブランチでテスト等を動かしていて、他のbranchにチェックアウト
したくはないけど、mergeしたいbranchがあるので、その更新の準備をしておきたい。
というときに使う機会があるかもしれません。
例えば以下のようなコミットツリーがあったとします。
* 888cfeb dd511805 change readme (HEAD -> my_branch)
| * e07568b Foo fixed:feature (origin/master, origin/HEAD)
| * 669b7ae Foo add feature (master)
|/
* e96f285 dd511805 first commit
この状態でmasterのbranchのrevisionを変更する場合には、以下の手順が良く行われると思います。
$ git checkout master
$ git rebase origin/master master
しかし、この手順で作業を行うと作業後のbranchがmasterに変更されてしまいます(checkoutしているので当然ですね)。
$ git branch
my_branch
* master
branchを変更せずに他のbranchを変更する場合は以下のコマンドを実行します。
git branch -f <対象となるbranch名> <revisionハッシュ>
今回の例では以下の処理になります。
git branch -f master e07568b
* 888cfeb dd511805 change readme (HEAD -> my_branch)
| * e07568b Foo fixed:feature (HEAD -> master, origin/master, origin/HEAD)
| * 669b7ae Foo add feature
|/
* e96f285 dd511805 first commit
また以下の方法でも変更することが出来ます。
git update-ref -m "reset: Reset master to e07568b" refs/heads/master e07568b
どちらでも結果としては変わりませんが、.git/logs/refs/heads/masterに表示される
メッセージは任意のものになるか、自動で記入されるかの違いは存在します。
$ tail .git/logs/refs/heads/master
669b7ae7b522da6795f74405bb0a5b25e25ccf66 e07568b9e9a90c748d042b946bf36464b7a40439 dd511805 <dd511805@example.com> 1488286020 +0900 branch: Reset to e07568b
669b7ae7b522da6795f74405bb0a5b25e25ccf66 e07568b9e9a90c748d042b946bf36464b7a40439 dd511805 <dd511805@example.com> 1488286092 +0900 reset: Reset master to e07568b