この記事は、Gitのブランチ管理の基本操作について解説します。ブランチの一覧表示や作成、切り替え、マージの方法を説明します。ブランチのマージ時に発生する競合の解決方法についても述べています。競合解決にはマージツールの使用が推奨です。その設定方法も紹介しています。不要になったブランチの削除方法についても触れています。この記事を通じて、Gitのブランチ管理とGitのマージ操作に関する知識とスキルを身につけることができます。
目次
ブランチの一覧表示 (git branch)
git branchでブランチの一覧を表示できます。
1 2 3 4 |
~/LocalRepos/TestProject (master) $ git branch b1 b2 * master |
ブランチの作成 (git branch <ブランチ名>)
git branch <ブランチ名>でブランチの作成を行うことができます。
1 2 3 4 5 6 7 8 9 |
~/LocalRepos/TestProject (master) $ git branch b1 ~/LocalRepos/TestProject (master) $ git branch b2 ~/LocalRepos/TestProject (master) $ git log --all --oneline --graph --decorate * 230c45a (HEAD -> master, b2, b1) 2 commit * a148201 1 commit ~/LocalRepos/TestProject (master) $ git branch b1 b2 * master |
ブランチの切り替え (git checkout <ブランチ名>)
git checkoutでブランチの切り替えを行うことができます。
1 2 3 4 5 6 7 8 9 |
~/LocalRepos/TestProject (master) $ git checkout b1 Switched to branch 'b1' ~/LocalRepos/TestProject (b1) $ git log --all --oneline --graph --decorate * 230c45a (HEAD -> b1, master, b2) 2 commit * a148201 1 commit ~/LocalRepos/TestProject (b1) $ git branch * b1 b2 master |
また、git switch -c <ブランチ名>でブランチを作成と切り替えを同時に行うことができます。
1 2 3 4 5 6 7 8 9 10 |
~/LocalRepos/TestProject (b1) $ git switch -c b3 Switched to a new branch 'b3' ~/LocalRepos/TestProject (b3) $ git log --all --oneline --graph --decorate * 230c45a (HEAD -> b3, master, b2, b1) 2 commit * a148201 1 commit ~/LocalRepos/TestProject (b3) $ git branch b1 b2 * b3 master |
現在いるブランチにマージ先のブランチをマージ (git merge <マージ先のブランチ名>)
git merge <マージ先のブランチ名>でブランチをマージすることができます。
競合が発生した場合は競合を解決しなければなりません。以下は手動で解決する方法の一つの例になります。
ただし、基本的には次で紹介するgit mergetoolを使った競合の解決の方がおそらく簡単だと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
~/LocalRepos/TestProject (master) $ git merge b1 Auto-merging file3.txt CONFLICT (add/add): Merge conflict in file3.txt Automatic merge failed; fix conflicts and then commit the result. ~/LocalRepos/TestProject (master|MERGING) $ ls file1.txt file2.txt file3.txt ~/LocalRepos/TestProject (master|MERGING) $ git status ブランチ master You have unmerged paths. (fix conflicts and run "git commit") (use "git merge --abort" to abort the merge) Unmerged paths: (use "git add <file>..." to mark resolution) both added: file3.txt no changes added to commit (use "git add" and/or "git commit -a") ~/LocalRepos/TestProject (master|MERGING) $ cat file3.txt <<<<<<< HEAD line1-1 ======= line1-2 >>>>>>> b1 ~/LocalRepos/TestProject (master|MERGING) $ vi file3.txt ~/LocalRepos/TestProject (master|MERGING) $ git add file3.txt ~/LocalRepos/TestProject (master|MERGING) $ git commit -m '3 merge commit' [master 84f88dd] 3 merge commit ~/LocalRepos/TestProject (master) $ git log --all --oneline --graph --decorate * 84f88dd (HEAD -> master) 3 merge commit |\ | * 5cf2223 (b1) 3-2 commit * | ff4c2e5 3 commit |/ * 230c45a (b3, b2) 2 commit * a148201 1 commit |
競合の解決を中止(git merge --abort)
競合の解決の中止を説明するためにマージする直前のコミットにコミットを戻したいと思います。
この方法でコミットを戻すとマージしたコミットに戻ることはできなくなるため、コミットの破棄と同等になり、git gcを使ったときにそのデータは削除される対象になるでしょう。
1 2 3 4 5 6 7 8 |
~/LocalRepos/TestProject (master) $ git reset --hard ff4c2e5 HEAD is now at ff4c2e5 3 commit ~/LocalRepos/TestProject (master) $ git log --all --oneline --graph --decorate * 5cf2223 (b1) 3-2 commit | * ff4c2e5 (HEAD -> master) 3 commit |/ * 230c45a (b3, b2) 2 commit * a148201 1 commit |
同じようにブランチを指定してマージします。マージの競合はgit merge --abortで競合の解決を中止することができます。
1 2 3 4 5 6 7 8 9 10 11 |
~/LocalRepos/TestProject (master) $ git merge b1 Auto-merging file3.txt CONFLICT (add/add): Merge conflict in file3.txt Automatic merge failed; fix conflicts and then commit the result. ~/LocalRepos/TestProject (master|MERGING) $ git merge --abort ~/LocalRepos/TestProject (master) $ git log --all --oneline --graph --decorate * 5cf2223 (b1) 3-2 commit | * ff4c2e5 (HEAD -> master) 3 commit |/ * 230c45a (b3, b2) 2 commit * a148201 1 commit |
競合内容をマージツールを使って解決(git mergetool)
git mergetoolを使うと競合内容を設定したマージツールで解決できます。
設定は
1 |
git config merge.tool <tool> |
で設定できます。必要なら--globalオプション等を使います。
または、設定を利用せずにgit mergetoolに-tオプションでツールを指定することもできます。
git mergetoolを使うとバックアップファイルとして.origがついたファイルが作成されます。バックアップを作成したくない場合は
1 |
git config mergetool.keepBackup false |
にします。
例ではマージツールにvimdiffを設定し、バックアップは作成しない設定をしています。vimdiffはかなり癖の強いマージツールなのでもし設定を行うならもっと使いやすいマージツールを設定したほうが良いかもしれません。
1 2 |
~/LocalRepos/TestProject (master) $ git config merge.tool vimdiff ~/LocalRepos/TestProject (master) $ git config mergetool.keepBackup false |
マージする例は以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
~/LocalRepos/TestProject (master) $ git merge b1 Auto-merging file3.txt CONFLICT (add/add): Merge conflict in file3.txt Automatic merge failed; fix conflicts and then commit the result. ~/LocalRepos/TestProject (master|MERGING) $ git mergetool Merging: file3.txt Normal merge conflict for 'file3.txt': {local}: created file {remote}: created file 3 個のファイルが編集を控えています ~/LocalRepos/TestProject (master|MERGING) $ git commit -m '3 merge commit' [master 66fb2ee] 3 merge commit ~/LocalRepos/TestProject (master) $ git log --all --oneline --graph --decorate * 66fb2ee (HEAD -> master) 3 merge commit |\ | * 5cf2223 (b1) 3-2 commit * | ff4c2e5 3 commit |/ * 230c45a (b3, b2) 2 commit * a148201 1 commit ~/LocalRepos/TestProject (master) $ ls file1.txt file2.txt file3.txt |
マージツールがPATHに設定されていない場合やコマンドの引数を指定したい場合は
1 2 |
mergetool.<tool>.path mergetool.<tool>.cmd |
の設定が参考になります。詳しくは
1 |
man git mergetool |
で確認できます。
マージツール (vimdiff,opendiff,WinMerge等)
マージツールは外部ツールなので、様々な選択肢があります。ここでは、vimdiffを利用しましたが、LinuxではGUIのマージツールとしてMeldがあります。また、MacOSではFileMerge(opendiff)が、WindowsではWinMergeがGUIのマージツールとしてあります。
あらかじめ使いやすいマージツールを設定しておくとマージ作業が楽になるでしょう。
ブランチの削除 (git branch -d <ブランチ名>)
マージ等でブランチが必要なくなったら、git branch -d <ブランチ名>でブランチを削除できます。
1 2 3 4 5 6 7 8 9 10 |
~/LocalRepos/TestProject (master) $ git branch -d b1 Deleted branch b1 (was 5cf2223). ~/LocalRepos/TestProject (master) $ git log --all --oneline --graph --decorate * 66fb2ee (HEAD -> master) 3 merge commit |\ | * 5cf2223 3-2 commit * | ff4c2e5 3 commit |/ * 230c45a (b3, b2) 2 commit * a148201 1 commit |