ブランチの操作
事前準備
まずは、新しくディレクトリを作成。
そこに空のリポジトリを作成。
$ mkdir tutorial
$ cd tutorial
$ git init
tutorialディレクトリにmyfile.txtという名前でファイルを作成し、コミットします。
myfile.txtの中
現在
ブランチの作成
abcというブランチ作成
branchコマンドで作成可能。
$ git branch <branchname>
ここでは、abcという名前でブランチ作成
$ git branch abc
引数を指定せずにbranchコマンドを実行すると、ブランチの一覧を表示する。頭に * のついているのが現在のブランチ。
現在
ブランチを切り替える
新しく作成したabcブランチにコミットを追加するには、abcブランチにチェックアウトをします。
ブランチのチェックアウトはcheckoutコマンド
$ git checkout <branch>
現在
checkoutコマンドに -b オプションを指定して実行すると、ブランチの作成とチェックアウトをまとめて行うことができる。
$ git checkout -b <branch>
次に、abcブランチをチェックアウトした状態でコミット。
myfile.txtを編集
「セカンドGitコマンド」を追加
$ git add myfile.txt
$ git commit -m "セカンドの追加"
現在
ブランチをマージする
abcブランチに行った変更をmasterブランチに統合。
ブランチのマージはmergeコマンド
$ git merge <commit>
このコマンドでは、指定したブランチがHEADの指しているブランチに取り込まれます。masterブランチにabcを取り込むためには、まずはmasterブランチに移動(checkout)します
$ git checkout master
マージを行う前に一度myfile.txtを開いて確認
スタートGitコマンドになっているのでOK
マージを実行。
$ git merge abc
masterブランチの指すコミットがabcと同じ位置に移動。このマージはfast-forward(早送り)マージです。
myfile.txtファイルを開いて確認
スタートGit....セカンドGit...になっているのでマージ完了。
現在
ブランチを削除
abcブランチの内容はmasterに統合されたので次は削除します。
ブランチの削除は、branchコマンドに-dオプションを指定し実行。
$ git branch -d <branchname>
これで、abcブランチは削除されました。branchコマンドでブランチが削除されたかを確認。
現在
並行で作業する
次に、ブランチを2つ作成して並行で作業。
まずは、xxxブランチとyyyブランチを作成し、xxxブランチをチェックアウトします。
$ git branch xxx
$ git branch yyy
$ git checkout xxx
現在
次にxxxブランチのmyfile.txtを編集してコミット。
サードGitコマンドを追加
インデックス(ステージング)に格納しコミット
$ git add myfile.txt
$ git commit -m "サードを追加"
現在
次に、yyyyyyブランチをチェックアウト。
$ git checkout yyy
myfile.txtを開く。
フォースGitコマンドを追加
git addで追加してコミット。
$ git add myfile.txt
$ git commit -m "フォースの追加"
現在
次に、xxxブランチの変更と、yyyブランチでの変更をmasterに統合する。
まずは、masterブランチにチェックアウト➡xxxブランチをマージ。
$ git checkout master
$ git merge xxx
myfile.txt
masterブランチに「サードがGitコマンド」が追加される
現在 fast-forward(早送り)
次に、yyyブランチをマージ。
$ git merge yyy
自動マージに失敗と警告。同じ行を別の内容に変更していたため競合が発生。
myfile.txtは以下のようになる。
競合が発生した箇所は、Gitが差分を挿入します。
競合箇所を修正して改めてコミット
$ git add myfile.txt
$ git commit -m "yyyブランチをマージ"
今回のマージでは競合箇所を修正したため、その変更を記録するマージコミットが新たに作成。そして、masterの先頭はそこに移動。このようなマージはfast-forwardではないマージ、ということでnon fast-forwardマージと呼ばれる。
現在
rebaseでマージする
yyyブランチをマージするとき、yyyブランチをあらかじめrebaseしていれば履歴を一本化することもできる。
一旦、先程のマージを取り消す。
$ git reset --hard HEAD~
現在
yyyブランチをチェックアウトしてから、masterに対してrebaseを実行。
$ git checkout yyy
$ git rebase master
mergeの時と同じように、myfile.txtで競合が発生するので修正
rebaseの場合、競合箇所を修正した後はコミットではなく、rebaseコマンドに --continue オプションを指定して実行。もし、rebase自体を取り消す場合は --abort オプションを指定。
$ git add myfile.txt
$ git rebase --continue
現在
これで、masterブランチはyyyブランチをfast-fowardマージできようになる。
masterブランチをチェックアウトしてからマージを実行。
$ git checkout master
$ git merge yyy
myfile.txt
「フォースGitコマンド」追加されているのでOK
現在