Posted at

Gitでbranchを動かさずに他のbranchのrevisionを変更する

More than 1 year has passed since last update.

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