Goalist Developers Blog

Gitがやばい!(2/3)

いよいよGitのやばさの続きですね。

前回の「Gitがやばい(1/3)」では基本コマンド、status, commit, addなど、そして便利なgitignoreの書き方などの最低限の知識を説明しました。

今回はよくある状況 1) 一回リリースしてからも開発が続く状況 2)他の人と一緒に開発を行ってる設定

には必ず必要となる、Gitのブランチ・マージなどの本格的なバージョニング部分に触れたいと思います。

では、始めましょう。

Level 2: branch, merge, fetch, pull,

「Gitがやばい(1/3)」で作ったプロジェクトをこちらにも使うと思います。

Branch

まずはbranchを作りましょう git branch new-branch “new-branch”の代わりに好きな名前を書くと、新しいブランチがその名前で作成されます。このやり方で、新しいブランチが現在のブランチと同じコミット履歴・ローカルのファイルの状況などになります。

git branch (パラメータなし) で現在、ローカルで置かれてるブランチが見れます。

f:id:c-pattamada:20180808183042p:plain

*が付いてるのが現在checkoutされてるブランチ。

git checkout new-branch で新しく作成したブランチに移動しましょう。

ちなみに、新しいブランチを作成して、それをcheckoutするための短い書き方もあって、それはgit checkout -b new-branchです。-bのフラグを入れることによって、checkoutが新しいブランチを作成してからcheckoutすることになります。

git logを打ちますと、このような出力が見られます。

f:id:c-pattamada:20180808183053p:plain

Masterとnew-branchのコミット履歴があります。現在は一緒です。 もう一つのコミットを作成しましょう

$cat > file.txt
some_text
$git add .
$git commit -m "another commit"
$git log

f:id:c-pattamada:20180808183103p:plain

追加のコミットがnew-branchの履歴だけにあって、masterがまだRevert "最初のファイル作成、と.gitIgnore"のコミットに残ってますね。

図をかくやり方もありまして

o-o <- master \ o <- new-branch

merge

これで終わりでしたら、mergeができます。それも、やり方が二つあって、一つはローカルでマージすること、もう一つはオンライン(remote)でマージする方法。ローカルの場合には、masterをcheckoutし、git merge new-branchでうまく行きます(conflictがない場合) 自分ならほとんどオンラインでマージしますので、そのやり方を説明します。

まずはnew-branchをpushしましょう。やり方覚えていますか? git push -u origin new-branch

そして、オンラインのリポジトリを確認しますと…

f:id:c-pattamada:20180808183121p:plain

(ちなみに、このリポはhttps://github.com/vortexkd/git-tutorial で見れます)

ここでプルリクを出して、次の画面でマージしましょう。

f:id:c-pattamada:20180808183331p:plain

(緑のボタンを押したら...)

f:id:c-pattamada:20180808183359p:plain

さて、これで、ローカル環境にない編集をremoteで行いました。

それはどうやってローカル環境に持ってくるのでしょうか?

fetch

まずは、ローカルでmasterをチェックアウトをし、statusを確認しましょう

f:id:c-pattamada:20180808183429p:plain

ここではremoteのマージが見えない?!あれれ、?

はい、それはremoteの情報はまだremoteにしかなくて、ローカルにそれをみるために’fetch’を行いましょう git fetch

f:id:c-pattamada:20180808183639p:plain

もう一回確認しますと、ちゃんとありますね。うえに”Your branch is behind 'origin/master' by 2 commits, and can be fast-forwarded.”と書いてあるのがその通知です。

ローカルでpull, merge,などの処理を行いたい場合にはまずfetchを実装した方がいいでしょう。「知らない間にremoteが更新されてるかもしれません。(共同開発の場合)

pull

では、remoteの編集をローカルに持って行きましょう git pull !

f:id:c-pattamada:20180808183458p:plain

すみません、間違いました。

こちらです。

f:id:c-pattamada:20180808183710p:plain

お疲れ様です! これで、gitのbranch, merge, fetchとpullも使えるようになりましたね!