Git(ギット)の基本的な使い方。Gitでの作業の一連の流れを解説。
Gitをマスタにマージするための一連の流れ
前回はGitの基本的な使い方やリポジトリの作成方法・リポジトリの概念を解説しましたが、今回は実際に現場で行われている作業のながれにそってコマンドを実行してGitの使い方について解説していきます。
実際の現場でのGitの扱い方は以下のようになっています。
- developブランチをローカルにチェックアウト
- 変更用のブランチを作成し、修正を加える。
- 2で加えた変更をローカルのリポジトリにコミット
- ローカルのリポジトリをリモートリポジトリにプッシュ
- プルリクエストを送る
masterとdevelopブランチについて
通常の現場では開発の際にあらかじめリポジトリをつくる際にmasterブランチとdevelopブランチを作成しておきます。(ここらへんは流派や現場の状況によっていくつかやり方があるので、必ずではないことは知っておいてください)
masterブランチは本番で実際に動かすコード群です。なので、実際の動作確認やレビューがすんでいないコードがmasterブランチに混じってしまうと非常にまずいことになるので、基本的にはそれぞれの開発者はまず変更をdevelopブランチに反映します。
そして、developブランチのコードを自分のPC内ではなく、テスト用のサーバにデプロイして他の開発者やプロダクトマネージャーに確認してもらい、問題なければmasterブランチにマージして開発完了という流れになります。
gitを扱う上では、masterブランチもdevelopブランチも同じブランチでただ名前が違うだけですが、gitでのバージョン管理の慣習上特別な意味をもつブランチですのでこの二つのブランチは覚えておくとよいでしょう。
1. developブランチをローカルからチェックアウト
開発を行う際開発者は最初にdevelopブランチから自分の修正用のブランチを作成します。
自分のローカルにdevelopブランチがない場合はリモートブランチからdevelopブランチを取得してきます。
git co -b develop orgin/develop
※ 以下はリモートにdevelopブランチがない場合の手順なので、ブランチがある場合は読み飛ばしていただいて結構です。
まだdevelopブランチがリモートに作成されていない場合は以下のようなエラーになります。
git co -b develop origin/develop
fatal: 'origin/develop' is not a commit and a branch 'develop' cannot be created from it
developブランチがない場合は以下のコマンドでブランチをローカルに作成します。
git branch develop # ブランチを作成するコマンド git branch [作成したいブランチ名]
ローカルブランチの一覧を確認する場合は、git branchコマンドを叩きます。
git branch
develop
* master
これでローカルにdevelopブランチが作成できたので、リモートにローカルの結果を反映します。
git co develop # developブランチに移動
$git push develop
ちなみにリモートにブランチがない状態でpushしようとすると以下のようなエラーになるので、 エラーメッセージにあるようなコマンドでないとブランチが作成できません。
git push
fatal: The current branch develop has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin develop
おとなしくエラーメッセージにしたがってコマンドを実行しましょう。
git push --set-upstream origin develop
Total 0 (delta 0), reused 0 (delta 0)
To https://github.com/webnari/git-sample.git
* [new branch] develop -> develop
Branch develop set up to track remote branch develop from origin.
これでリモートブランチにdevelopブランチが作成できました。 ちなみに、リモートブランチもふくめてブランチの一覧を取得したい場合は、-aオプションをつけることで、 リモートローカル含めたブランチの一覧を取得することができます。
git branch -a
* develop
master
remotes/origin/develop
remotes/origin/master
結果ではremotes/**のブランチがリモートのブランチになります。
2. 変更用のブランチを作成し、修正を加える。
今回のサンプルでは以下のようなサンプルを用意しました。
ls -1
README.md
main.rb
cat main.rb
puts 'Hello World'
main.rbはRubyのコードでHello Worldという文字列を表示するだけのコードです。
今回はこれをHello Japanという文字列に変えてみますが、コードを変更する前にまず自分の変更用のブランチを作成します。 自分の変更用のブランチはdevelopブランチを元にして作るので、自分が今git developにいることを確認しつつ
git co -b feature/fix-hello-world-word
git branch
develop
* feature/fix-hello-world-word
master
このコマンドでブランチを作成します。あたらしいブランチは
git co -b [任意のブランチ名]
で作成できます。
ブランチが作成できたら、早速コードを編集しましょう。コードの編集がおわるとリポジトリの差分が発生します。 差分が発生したファイルを確認するにはgit statusコマンドを使います。
$git status
On branch feature/fix-hello-world-word
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: main.rb
no changes added to commit (use "git add" and/or "git commit -a")
さきほどソースを編集したので差分が出ています。 "modified: main.rb" というのがそれです。 新規にファイルを追加した場合は、
git status
On branch feature/fix-hello-world-word
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: main.rb
Untracked files:
(use "git add <file>..." to include in what will be committed)
newfile.rb
no changes added to commit (use "git add" and/or "git commit -a")
以下のように"Untracked files:"に新しいファイルが表示されます。新しいファイルは新規で追加されているので、 Untracked files:(追跡されないファイル)に分類されます。
3. 変更をローカルのリポジトリにコミット
それでは、変更をローカルのリポジトリにコミットします。コミットのコマンドはgit commit ですが、 commitをする前に、変更したファイルをstagedな状態にしないといけないのでgit addをします。
git add main.rb
git status
On branch feature/fix-hello-world-word
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: main.rb
Untracked files:
(use "git add <file>..." to include in what will be committed)
newfile.rb
addしたので、状態が変更されました。 これをコミットします。コミット時にはコミットのコメントを残さないといけないので、 -m オプションのあとにコメントを渡してあげます。
git commit -m "Hello World を Hello Japanに変更"
これでコミットが完了しました。コミットの履歴はgit logで確認できます。
git log
commit 04fe346c5fe17d82df00b505afc6907c9f3e9ce6 (HEAD -> feature/fix-hello-world-word)
Author: webnari xxxxxxxxxxxxxxxx
Date: Sun Apr 15 16:30:01 2018 +0900
Hello World を Hello Japanに変更
コミットメッセージは具体的でわかりやすいものにしておくとチームの他の開発者やレビュー、将来の自分にも親切です。
新規に追加したファイルも同様です。
git add newfile.rb
$git commit -m "新規にファイルを追加"
4. ローカルのリポジトリをリモートリポジトリにプッシュ
ローカルリポジトリに変更はコミットできたので、次にローカルの変更をリモートに反映させます。 リモートに新しくブランチを作る時は、さきほどdevelopブランチを作成した時と同様に
git push --set-upstream origin feature/fix-hello-world-word
とします。
エラーなくpushが終わるのを確認したら、GitHubでブランチが作成されているか確認しましょう。
このようにGitHubの履歴をみても変更が確認できます。
プルリクエストを送る
自分の変更をリモートにプッシュできたら、多くの現場ではプルリクエストを送ります。 先ほど説明したように開発者の変更分は最初にdevelopブランチに取り込まれますのでdevelopブランチへのプルリクエストを送り、 レビュアーにレビューの依頼を行います。そして変更に問題がなければマージしてdevelopブランチに変更が反映されます。
プルリクエストは最初gitの機能だと勘違いする方が多いのですが、プルリクエストはGitHubなどGitのホスティングサービスの機能なので勘違いしないようにしましょう。プルリクエストはGitHubやBitBucketなどの画面から行います。
各ホスティングサービスでのプルリクエストの送り方は各自調べてやってみましょう。それぞれのサービスわかりやすくつくられているので、難なくできるはずです。
まとめ
今回は、実際の現場での運用をイメージしてそこで必要なコマンドを紹介しましたが、いかがったでしょうか?
まあ、これらは日々作業していれば繰り返し使うので自然と覚えてくるとは思うのですが、大事なのはコマンドを覚えるのではなく ちゃんと自分がどういう操作をしているのかや、どういう操作をしたいのかというのを意識してコマンドを扱うことだと思います。
コマンドをただ覚えるだけだと暗記ゲームになって辛いので、こういうことがしたいときはこのコマンドを使うというように覚えられると 難なく覚えられるはずです。
ここで、紹介したgitコマンドは最低限のもので、しらべてみるともっと便利なものや複雑なものもあるのでどんどんコマンドを覚えて Gitを使いこなせるようになりましょう!