LoginSignup
3
2

More than 5 years have passed since last update.

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

Posted at

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
3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2