ブランチの目的
作業を分岐することで、並行して複数の機能を開発するためにあるのがブランチ。
ブランチの仕組み
ブランチとは、コミットを指し示すポインタのこと。コミットすると、指し示しているコミットが、最新のコミットに移動する。
HEADとは
HEADとは今自分が作業しているブランチを指し示している。
ブランチを新規作成する
$ git branch <ブランチ名>
このコマンドは、ブランチを作成するだけで、ブランチの切り替えは行わない。
ブランチの一覧を表示する
$ git branch
# リモートリポジトリにあるブランチも表示する
$ git branch -a
*(アスタリスク)のついているブランチが、現在自分がいるブランチである。
ブランチを切り替える
$ git checkout <ブランチ名>
# featureブランチを作って切り替えることを考える
$ git branch feature
$ git checkout feature
# これは以下のコマンドと同じ
$ git checkout -b feature
ブランチを実践してみよう
branch_test
ディレクトリを作り、最初のコミットをする。
$ mkdir branch_test
$ cd branch_test
$ git init
Initialized empty Git repository in /home/username/branch_test/.git/
$ echo init > init.html
$ git add .
$ git commit -m 'create init.html'
[master (root-commit) c3d069a] create init.html
1 file changed, 1 insertion(+)
create mode 100644 init.html
$ git log --oneline
c3d069a (HEAD -> master, feature) create init.html
feature
ブランチを切る。
$ git branch feature
$ git branch
feature
* master
今、master
とfeature
が存在し、master
にいることが確認できた。
次にmaster
ブランチでファイルを作成しコミットする。
$ echo master > master.html
$ git add .
$ git commit -m 'create master.html'
GitHubで適当にリポジトリを作り、この変更をプッシュしておこう。
$ git remote add origin <URL>
$ git push origin master
次に、feature
ブランチに切り替えて新規ファイルを作成し、同様にコミット、プッシュしよう。
$ git checkout feature
Switched to branch 'feature'
$ echo feature > feature.html
$ git add .
$ git commit -m 'create feature.html'
[feature e980fc5] create feature.html
1 file changed, 1 insertion(+)
create mode 100644 feature.html
$ git push origin feature
最後にブラウザでGitHubを開き、ブランチを切り替えてみよう。存在するファイルがmaster
とfeature
で異なることが確認出来たら成功。
マージとは
他の人の変更内容を取り込む作業のこと。具体的には、2つのブランチを1つのブランチに統合すること。
マージの種類
- Fast Foward
- ブランチが枝分かれしていなかったときは、片方のブランチがもう片方のブランチを指すようになる。新たなコミットは作成されない。
- Auto Merge
- ブランチが枝分かれしていた場合、マージコミットという新しいコミットが作られる。マージコミットは親コミットを2つ持つ。
- Conflict
- 同じファイルの同じ行に対して異なる編集を行ったときなどに生じる、どちらのブランチを優先すればよいのか解決できない状態。
マージする
$ git merge <ブランチ名>
$ git merge <リモート名/ブランチ名>
ブランチを実践してみようの続きから始めよう。
# masterブランチに切り替える
$ git checkout master
# マージする
$ git merge feature
# ファイル一覧を見てみる
$ ls
feature.html init.html master.html
master.html
とfeature.html
が同時に存在することが確認できた。
コンフリクトの解消
コンフリクトが起こった場合、git status
コマンドで当該ファイルを調べることができる。ファイルを開くと、以下のような記述がある。
<<<<<<< HEAD
~
=============
~
>>>>>>> NEW
HEADは現在いるブランチを示す。また、NEWには取り込もうとしているブランチの名前が入る。
上の記述を消し、正しい内容に修正した後、新たにコミットすることでコンフリクトを解消できる。
コンフリクトの防止策
- 複数人で同じファイルを変更しない
- pullやmergeをする前に、commitやstashをしておく
- プルするときは、現在いるブランチを確認する
ブランチを変更・削除する
今いるブランチの名前を変更する場合、
$ git branch -m <新ブランチ名>
ブランチを削除する場合
$ git branch -d <ブランチ名>
# 未マージのブランチを強制削除する場合
$ git branch -D <ブランチ名>
ブランチの実用的な使い方
masterブランチをリリース用にとっておき、開発はいくつかのトピックブランチを作成して進める。