いづいづブログ

アジャイルコーチになりたい札幌在住SEです。アジャイル札幌スタッフ&ScrumFestSapporo実行委員。Like:パクチー/激辛/牡蠣/猫/初期仏教

Gitをコマンドから操作する #2 サルわか発展編

Gitについて学んだことの自分用メモ。主にGitをコマンドから実行する方法について学んだ。 参考サイトはここの発展編
自分向けのメモなのでまとめかたは雑。そのうちきれいに。

ブランチ

統合ブランチとトピックブランチという二種類のブランチを使った運用方法について。

統合ブランチ

統合ブランチとは、リリース可能な状態を常に維持しておくブランチで木の幹のようなイメージ。通常はmasterブランチを統合ブランチとして使用し、Jenkins等のCIツールを使用した自動ビルドやテストもこのブランチを使って行う。

バグ修正など何か変更を行う際は、この統合ブランチを分岐元としてトピックブランチを作成する際は作成してから対応を行う (直接統合ブランチを変更してしまうと「リリース可能な状態を常に維持しておく」というルールから逸脱してしまうため)。

トピックブランチ

トピックブランチとは、機能追加やバグ修正といったある課題に関する作業を行うために作成するブランチ。木の枝のようなイメージ。複数の課題に関する作業を同時に行う時は、その数だけトピックブランチを作成する。

HEAD

HEADとは現在使用しているブランチの先頭を表す(デフォルトではmasterの先頭を指している)。HEADが移動することで使用するブランチが変更される。

ブランチの統合

ブランチの統合には、mergeを使う方法とrebaseを使う方法がある。

けど、文字よりも図を見たほうが圧倒的に理解しやすいのでここを見るとよい。

merge

mergeを使用すると、複数の履歴の流れを合流させることができる。 mergeにはfast-forward(早送り)マージをする方法としない方法がある。

fast-forwardマージ

masterブランチとそこから分岐したブランチBがあるとした場合、 Bがmasterでの変更をすべて含むときに行われるマージをfast-forwardマージという。*1

つまりブランチBの分岐後に、元ブランチ(masterブランチ)において変更がないときに行われるマージのことである。

この場合元ブランチをブランチBの先頭へ移動すれば良いだけなので非常に簡単に統合することができるが、ブランチBで変更が別ブランチとして残らないので履歴の追跡がしにくくなる。

non fast-forwardマージ

masterブランチとそこから分岐したブランチBがあるとした場合、 masterブランチとブランチBそれぞれに変更が入っていてfast-forwardマージができない場合はnon fast-forwardマージを行うことになる。 non fast-forwardを行うと、新しくマージコミットを作成して合流させる。

non fast-forwardマージはオプションで選択できるので、fast-forwardマージが可能な場合でもあえてnon fast-forwardマージを行うということもできる。 non fast-forwardマージのメリットはブランチがそのまま残るので、そのブランチで行った作業の特定が容易になるところ。

rebase

masterブランチとそこから分岐したブランチBがあるとした場合で、ブランチBをmasterブランチにrebaseすると、ブランチBの履歴がmasterブランチの後ろに付け替えられる。そのため履歴は一本化される

この時ブランチBとmasterブランチで競合が発生する可能性があるため、競合はそれぞれ修正する必要がある。

また、rebaseしただけだとmasterの先頭の位置はそのままなので、masterブランチからブランチBをマージして、ブランチBの先頭まで移動する必要がある。

ブランチ作成

git branch コマンドにブランチ名を指定するとブランチを作成できる。以下の例では"issue1"というブランチを作成。
ブランチ名を指定しない場合はブランチの一覧が表示される。

$ git branch issue1
$ git branch
  issue1
* master

ブランチ切り替え

ブランチを切り替えるにはcheckoutコマンドでチェックアウトする。

$ git checkout issue1
Switched to branch 'issue1'

ブランチのマージ

ここではissue1ブランチをmasterにマージする。マージするにはmergeコマンドを使う。
mergeコマンドで指定したブランチが、HEADの指しているブランチに取り込まれるので最初にmaster(マージ先になるブランチ)をチェックアウトし、その後mergeコマンドで"issue1"ブランチを指定して実行する。

$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.

masterブランチにいることを確認。

$ git branch
  issue1
* master

mergeを実行。

$ git merge issue1
Updating fcc386a..161ad06
Fast-forward
 myfile.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 myfile.txt

ブランチ削除

brauchコマンドに-dオプションを付けて実行。

$ git branch -d <branchname>

リモートリポジトリにあるブランチを削除するにはpushコマンドに--deleteをつける。

$ git push --delete origin issue1
To https://github.com/izumii19/gitTutorial.git
 - [deleted]         issue1

*1:デフォルトの設定はfast-forwardマージになっている。