いろいろ備忘録日記

主に .NET とか Go とか Python絡みのメモを公開しています。

git で ブランチ移動せずに マージ するやり方

概要

忘れないうちにメモメモ。今まで知りませんでした・・w

git で マージする際、通常はマージ先のブランチに checkout (switch) して

そこから git merge xxxx ってやると思いますが、ちょこちょこマージしながら

進めていきたいときもあります。そういうときに毎回 ブランチ を切り替えているとちょっとめんどくさい。。

そんなときは以下のようにすると移動せずにマージできます。ただし、Fast-Forward限定です。

$ git fetch . srcブランチ:destブランチ
# srcブランチは、今からマージしたいブランチ。
# destブランチは、マージを受け入れるブランチ。

. を指定しているのがミソですね。 通常 git fetch <remote> を示す部分を . にするとローカルをリモートとして設定するみたいな意味になります。

これで、FFマージが可能な場合はそのままマージができちゃいます。

stackoverflow.com

stackoverflow.com

試してみる

ちょっと試してみましょう。

$ cd $HOME
$ mkdir -p tmp/gittest && cd tmp/gittest

$ git init

$ echo 'helloworld' >> a.txt
$ git add .
$ git commit -m "Add a.txt"

$ git switch -c add-b
$ echo 'HELLOWORLD' >> b.txt
$ git add .
$ git commit -m "Add b.txt"

# ブランチを移動せずにマージしてみる
$ git branch
* add-b
  master
$ git fetch . add-b:master
From .
   35bb6ce..3688820  add-b      -> master

おー、ちゃんとできましたね。

では、今度は Fast-Forward マージができない状態で git fetch . src:dest するとどうなるかを確認

$ ls
a.txt b.txt
$ git branch
* master


# a.txt を master で、b.txt を upd-b ブランチで変更
$ git switch -c upd-b
$ sed -i -e 's/ELLO/ello/' b.txt
$ git add .
$ git commit -m "Upd b.txt"

$ git switch master
$ sed -i -e 's/ello/ELLO/' a.txt 
$ git add .
$ git commit -m "Upd a.txt"

# 再度、upd-b ブランチに戻る
$ git switch upd-b

# マージ実行
$ git fetch . upd-b:master
From .
 ! [rejected]        upd-b      -> master  (non-fast-forward)
#
# 予想通り、Fast-Forward マージにならないのでリジェクトされた。
#

# なので、masterブランチの差分を自身に先に適用してコミットラインをきれいに。
$ git rebase master
Successfully rebased and updated refs/heads/upd-b.
# これでコミットラインが一直線になったので、改めて実行
$ git fetch . upd-b:master
From .
   f9eea1e..3632a29  upd-b      -> master
#
# オッケイ
#

# master に切り替えて確認
$ git switch master
$ git log --oneline
3632a29 (HEAD -> master, upd-b) Upd b.txt
f9eea1e Upd a.txt
3688820 Add b.txt
35bb6ce Add a.txt
#
# オッケイ
#


#
# このリポジトリ、もういらないのでグッバイ
#
$ cd $HOME
$ rm -rf tmp/gittest

過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com

github.com