s51517765.hatenadiary.jp
前の記事ではGitの基本とGitHubについて説明しました。
Gitを使っていてめんどくさいのがコンフリクト(Conflict)の対応です。
日本語では「衝突」といいます。
例えば、複数人のチームで開発をしているときに、同じ場所を違うようにアップデートしたものをマージしようとすると矛盾が生じることです。
通常、別々の編集であればその両方を生かすことができますが、それが出来ないことが生じる場合があります。
また、ローカルで開発していたものを初めてリモートに登録しようとしたときにも、リモートの初期化の仕方が悪いのかもしれませんが、衝突が起きてしまうことがあります。
初めてGitを使おうと思ったとき、衝突が起きるときの解消方法を説明します。
ここでは、リモートサーバとして、無料アカウントでもプライベートリポジトリが使えるBitbucketを使った場合に基づいて説明します。
bitbucket.org
Bitbucketのアカウントは作成済みであるものとします。
リモートの設定手順
Web(ブラウザ)で左側の「+」からリモートのリポジトリを作成します。Readmeが自動的に作成されてリポジトリが作成されます。
Sorcetreeに戻って、リモートリポジトリの設定をします。右上のリモートのアイコンをクリックします。
リモートのタブで「追加」を選び、リモート名、リモートリポジトリのURL、アカウントを設定します。
すべてのファイルをインデックスに追加し、コミットし、プッシュします。
コミットするとローカルのリポジトリに変更が登録されます。これをプッシュするとリモートのリポジトリに登録をします。
Errorが出ます。
注目すべきは、線で囲んだところですが、
「他のプッシュによって起きている、リモートの変更を統合せよ。プッシュする前にプルしてね。」というErrorです。
git -c diff.mnemonicprefix=false -c core.quotepath=false --no-optional-locks push -v --tags origin master:master
Pushing to https://bitbucket.org/s51517765/test2/src/master/
To https://bitbucket.org/s51517765/test2/src/master/
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'https://bitbucket.org/s51517765/test2/src/master/'
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.
まずは、リモートの変更を取り込みます。
衝突があります、と言われます。
手動で解消します。
しかし、意図的な変更がない場合?はフェッチしてマージすると難なく解消できます。
フェッチとはリモートの変更の情報を取得することです。
プルはフェッチしたうえでマージをすることですが、フェッチした上で明示的にローカルのソースにリモートをマージするとうまくいくようです。
フェッチした上で、「リモートブランチを表示」しマージします。
ローカルのブランチを選択した状態でマージをクリックし、「マージの代わりにリベースする」にチェックを入れ、マージするコミットとしてリモートを選択します。
これでうまう行くはずですが、これでもダメな場合(初期以外の場合)はブランチを作ってリモートをチェックアウトし、マージするとうまくいくことがあります。
それでもだめだったら、ローカルですべてのブランチのファイルをWindowsのエクスプローラ上で手動マージしてコピペしてSorcetree上でブランチをマージします…。
まとめ
コンフリクトの解消の仕方を説明しました。SorcetreeはErrorが英語しか出ないので怖いところはありますが、Errorのほとんどはコンフリクト関連だと思います。
うまくブランチをマージ出来るかどうかが使いこなしのポイントです。
Sorcetree上にも手動マージの機能がありますが、コンフリクトしたときには自身の使い慣れたエディタで手動マージするのもありです。
また、ブランチは途中で終わらせても特に問題はありません。Masterだけ手動マージして進めるというのもありです。(管理上はどうかというのはありますが…)
いずれにしてもコミットした時点へはいつでも戻れるので恐れずやってみて慣れるのが一番です。
練習用のリポジトリをBitbucketでつくってわざとブランチを作り、コンフリクトを起こさせて解消するといい練習になります。
GitHubでも同様に使えます。
チーム開発でなくても、GitもしくはSorcetreeでローカルのみでVersion管理するだけでも価値があります。
Bitbucketでは無料でもプライベートリポジトリが使えるので、リモートにプッシュしておけば非公開でバックアップもできます。
参考
いちばんやさしいGit&GitHubの教本 人気講師が教えるバージョン管理&共有入門 (「いちばんやさしい教本」シリーズ)
- 作者: 横田紋奈,宇賀神みずき
- 出版社/メーカー: インプレス
- 発売日: 2018/12/14
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る