初めてgitを使って見る(Bitbucket編)Part2

前回に引き続きgitについてまとめます。
今回は複数人でソースコードの管理をするときにどのようにするのかというのをテーマにまとめていきます。

【仮想的にもう一つの作業場所を確保】
そのために、今回は仮想的にもう一人の作業場所を作成します。
今まで使っていたローカルリポジトリの他のどこかにフォルダを作成してください。
フォルダの作成は
・右クリック->新規フォルダ
・mkdir フォルダ名
のどちらでも構いません。

そして、作ったフォルダをgitのローカルレポジトリにしましょう。
今回は、前回のようにgit initのようなことはせずに、今あるリモートリポジトリからコピーする形で作成します。
Bitbucketのページの左側にある「アクション」の下にあるクローンをクリックしてください。
すると以下のようなコマンドが出てくると思います。それをコピーして貼り付けてください。
git clone https://ユーザ名@bitbucket.org/ユーザ名/リモートリポジトリ名.git
これで、リモートリポジトリを基にした作業場所がローカルに作成されます。
この時点でリモートとローカルはリンクもしているので大丈夫です。
おそらく先ほど作ったフォルダの中にリモートレポジトリと同じ名前のフォルダがあると思うのでcdコマンドで移動しておきましょう。

※これからの作業では、ターミナルは一つではなく2つ起動しておいて、「cdコマンド」でそれぞれのディレクトリに移動しておきましょう。

【複数人でプッシュすることで生じる「競合」】

複数人でソースコードを管理する際にどのような問題が起きてしまうのか、簡単に体験してみましょう。
これから解説するにあたって、
・最初にadd/commit/pushした方のフォルダで作業してる人をA
・先ほどリモートレポジトリから作ったフォルダで作業してる人をB
として解説します。
では、まずAさんの方で1つファイルの内容を書き換えてみましょう。
その後add/commit/pushをしてみましょう。
問題なくpushできたはずです。問題はここからです。
次にBさんの方で先ほどと同じ名前のファイルの内容を書き換えてみましょう。
その後、add/commit/pushをしてみましょう。
うまくいかなかったと思います。

To https://ユーザ名@bitbucket.org/ユーザ名/git_1107.git

! [rejected]        master -> master (fetch first)

error: failed to push some refs to 'https://ユーザ名@bitbucket.org/ユーザ名/git_1107.git'

hint: Updates were rejected because the remote contains work that you do

hint: not have locally. This is usually caused by another repository pushing

hint: to the same ref. You may want to first integrate the remote changes

hint: (e.g., 'git pull ...') before pushing again.

hint: See the 'Note about fast-forwards' in 'git push --help' for details.


これが「競合」です。
もしかしたら「なんでこんなことが起こるの!!」「さっとプッシュさせろ!」と思った方もいるかもしれません。
でも考えてみてください、これでBさんの変更がリモートレポジトリの方に登録されてしまうとAさんの変更がなかったことになってしまいます。
それを防ぐためにこの競合ということが起きます。

【競合を解決するための機能「ブランチ」】
では、どのようにすればこのうまくいくのでしょうか。
そこで出てくるブランチというものです。
ブランチとは日本語で「枝」を意味しています。競合を避けるためにはまず作業員それぞれが枝を持ち、それを結合させることで1つのファイルにするというイメージを持っていただけるといいです。
<ブランチの作成>
ここからはA/B同時に作業を進めていきます。
まずAさんの方でtest_aというブランチを作成します。ブランチの作成には
git branch test_a
というコマンドを実行すれば大丈夫です。

次にBさんの方でtest_bというブランチを作成します。
git branch test_b
これでお互いが作業するためのブランチが完成しました。
<ブランチの切り替え>
ブランチは作成しただけでも使っていることにはなりません。作業する前にブランチの切り替えを行わなければなりません。
ブランチの切り替えには
git checkout ブランチ名
というコマンドを実行します。
そのため
Aさんは
git checkout test_a
Bさんは
git checkout test_b
というコマンドを実行してブランチの切り替えをしましょう。
<ブランチの結合>
ブランチの結合(マージ)これが一番よくわかりませんでした。
gitのマージをするにはまず、マージしたい方(今回の場合はmasterにtest_aをマージしたいのでmaster)に切り替えます
git checkout master
そして、ブランチのマージを行います。
git merge test_a
としてみると
でも、これだけではローカル環境のブランチが結合しただけなので、リモートリポジトリには何の変化もありません。
そこで、次にもう一度commit/pushを行います。
git commit 'ファイル名' -m 'コメント'
git push origin master
すると何かしら怒られると思います。
そしたら
git pull
というコマンドを実行します。
すると、コメントの入力が要求されます。
そこにコメントを入力すれば、リモートリポジトリの方も更新されます。
これをBでも行えば大丈夫です。

多分・・・