ブランチの操作

事前準備

まずは、新しくディレクトリを作成。

そこに空のリポジトリを作成。

$ mkdir tutorial
$ cd tutorial
$ git init

f:id:mkyosuke:20191221001407p:plain

tutorialディレクトリにmyfile.txtという名前でファイルを作成し、コミットします。

f:id:mkyosuke:20191221001548p:plain

myfile.txtの中

f:id:mkyosuke:20191223155705p:plain



現在

f:id:mkyosuke:20191221001954p:plain

 

ブランチの作成

 abcというブランチ作成

branchコマンドで作成可能。

$ git branch <branchname>

ここでは、abcという名前でブランチ作成

$ git branch abc

引数を指定せずにbranchコマンドを実行すると、ブランチの一覧を表示する。頭に * のついているのが現在のブランチ。

f:id:mkyosuke:20191221002517p:plain

現在

f:id:mkyosuke:20191221002639p:plain

 

ブランチを切り替える

 新しく作成したabcブランチにコミットを追加するには、abcブランチにチェックアウトをします。

 

ブランチのチェックアウトはcheckoutコマンド

$ git checkout <branch>

f:id:mkyosuke:20191221003022p:plain

現在

f:id:mkyosuke:20191221003122p:plain

checkoutコマンドに -b オプションを指定して実行すると、ブランチの作成とチェックアウトをまとめて行うことができる。

$ git checkout -b <branch>

 

次に、abcブランチをチェックアウトした状態でコミット。

myfile.txtを編集

「セカンドGitコマンド」を追加

f:id:mkyosuke:20191223160015p:plain

$ git add myfile.txt
$ git commit -m "セカンドの追加"

 

現在

f:id:mkyosuke:20191221004035p:plain

 

f:id:mkyosuke:20191223160531p:plain

ブランチをマージする

 abcブランチに行った変更をmasterブランチに統合。

ブランチのマージはmergeコマンド

$ git merge <commit>

このコマンドでは、指定したブランチがHEADの指しているブランチに取り込まれます。masterブランチにabcを取り込むためには、まずはmasterブランチに移動(checkout)します

$ git checkout master

f:id:mkyosuke:20191221004429p:plain

マージを行う前に一度myfile.txtを開いて確認

f:id:mkyosuke:20191223160712p:plain

スタートGitコマンドになっているのでOK

マージを実行。

$ git merge abc

f:id:mkyosuke:20191221004828p:plain

masterブランチの指すコミットがabcと同じ位置に移動。このマージはfast-forward(早送り)マージです。

myfile.txtファイルを開いて確認

f:id:mkyosuke:20191223160842p:plain



スタートGit....セカンドGit...になっているのでマージ完了。

現在

f:id:mkyosuke:20191221005316p:plain

 

ブランチを削除

 abcブランチの内容はmasterに統合されたので次は削除します。

ブランチの削除は、branchコマンドに-dオプションを指定し実行。

$ git branch -d <branchname>

f:id:mkyosuke:20191221005643p:plain

これで、abcブランチは削除されました。branchコマンドでブランチが削除されたかを確認。

f:id:mkyosuke:20191221005749p:plain

現在

f:id:mkyosuke:20191221005849p:plain

 

並行で作業する

次に、ブランチを2つ作成して並行で作業。

まずは、xxxブランチとyyyブランチを作成し、xxxブランチをチェックアウトします。

$ git branch xxx
$ git branch yyy
$ git checkout xxx

f:id:mkyosuke:20191221010310p:plain

現在

f:id:mkyosuke:20191221010606p:plain

次にxxxブランチのmyfile.txtを編集してコミット。

サードGitコマンドを追加

f:id:mkyosuke:20191223161612p:plain



インデックス(ステージング)に格納しコミット

$ git add myfile.txt
$ git commit -m "サードを追加"

f:id:mkyosuke:20191223161735p:plain

現在

f:id:mkyosuke:20191221011231p:plain

次に、yyyyyyブランチをチェックアウト。

$ git checkout yyy

f:id:mkyosuke:20191221011428p:plain

myfile.txtを開く。

f:id:mkyosuke:20191223161900p:plain

フォースGitコマンドを追加

f:id:mkyosuke:20191223162151p:plain

git addで追加してコミット。

$ git add myfile.txt
$ git commit -m "フォースの追加"

f:id:mkyosuke:20191223162336p:plain

現在

f:id:mkyosuke:20191221012516p:plain

 次に、xxxブランチの変更と、yyyブランチでの変更をmasterに統合する。

まずは、masterブランチにチェックアウト➡xxxブランチをマージ。

$ git checkout master
$ git merge xxx

f:id:mkyosuke:20191223143603p:plain

myfile.txt

masterブランチに「サードがGitコマンド」が追加される

f:id:mkyosuke:20191223162627p:plain

現在 fast-forward(早送り)

f:id:mkyosuke:20191223141940p:plain

次に、yyyブランチをマージ。

$ git merge yyy

f:id:mkyosuke:20191223143831p:plain

自動マージに失敗と警告。同じ行を別の内容に変更していたため競合が発生。

myfile.txtは以下のようになる。

競合が発生した箇所は、Gitが差分を挿入します。

f:id:mkyosuke:20191223164022p:plain

競合箇所を修正して改めてコミット

f:id:mkyosuke:20191223164204p:plain

$ git add myfile.txt
$ git commit -m "yyyブランチをマージ"

f:id:mkyosuke:20191223164838p:plain

今回のマージでは競合箇所を修正したため、その変更を記録するマージコミットが新たに作成。そして、masterの先頭はそこに移動。このようなマージはfast-forwardではないマージ、ということでnon fast-forwardマージと呼ばれる。

現在

f:id:mkyosuke:20191223150708p:plain

 

rebaseでマージする

 yyyブランチをマージするとき、yyyブランチをあらかじめrebaseしていれば履歴を一本化することもできる。

一旦、先程のマージを取り消す。

$ git reset --hard HEAD~

 

現在

f:id:mkyosuke:20191223152002p:plain

yyyブランチをチェックアウトしてから、masterに対してrebaseを実行。

$ git checkout yyy
$ git rebase master

f:id:mkyosuke:20191223170350p:plain

mergeの時と同じように、myfile.txtで競合が発生するので修正

f:id:mkyosuke:20191223170141p:plain

rebaseの場合、競合箇所を修正した後はコミットではなく、rebaseコマンドに --continue オプションを指定して実行。もし、rebase自体を取り消す場合は --abort オプションを指定。

$ git add myfile.txt
$ git rebase --continue

f:id:mkyosuke:20191223171121p:plain

現在

これで、masterブランチはyyyブランチをfast-fowardマージできようになる。

f:id:mkyosuke:20191223171307p:plain

masterブランチをチェックアウトしてからマージを実行。

$ git checkout master
$ git merge yyy

f:id:mkyosuke:20191223171803p:plain

myfile.txt

f:id:mkyosuke:20191223172043p:plain

「フォースGitコマンド」追加されているのでOK

現在

f:id:mkyosuke:20191223172224p:plain