プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、Python3、ラズパイなど。

Sorecetreeでコンフリクトを解消する

s51517765.hatenadiary.jp
前の記事ではGitの基本とGitHubについて説明しました。

Gitを使っていてめんどくさいのがコンフリクト(Conflict)の対応です。
日本語では「衝突」といいます。
例えば、複数人のチームで開発をしているときに、同じ場所を違うようにアップデートしたものをマージしようとすると矛盾が生じることです。
通常、別々の編集であればその両方を生かすことができますが、それが出来ないことが生じる場合があります。

また、ローカルで開発していたものを初めてリモートに登録しようとしたときにも、リモートの初期化の仕方が悪いのかもしれませんが、衝突が起きてしまうことがあります。

初めてGitを使おうと思ったとき、衝突が起きるときの解消方法を説明します。

ここでは、リモートサーバとして、無料アカウントでもプライベートリポジトリが使えるBitbucketを使った場合に基づいて説明します。
bitbucket.org

Bitbucketのアカウントは作成済みであるものとします。

リモートの設定手順

Web(ブラウザ)で左側の「+」からリモートのリポジトリを作成します。
f:id:s51517765:20191002204132j:plain
f:id:s51517765:20191002220157p:plain
Readmeが自動的に作成されてリポジトリが作成されます。
f:id:s51517765:20191002205505p:plain
Sorcetreeに戻って、リモートリポジトリの設定をします。右上のリモートのアイコンをクリックします。
f:id:s51517765:20190929110255j:plain
リモートのタブで「追加」を選び、リモート名、リモートリポジトリのURL、アカウントを設定します。
f:id:s51517765:20191002220338j:plain
すべてのファイルをインデックスに追加し、コミットし、プッシュします。
コミットするとローカルのリポジトリに変更が登録されます。これをプッシュするとリモートのリポジトリに登録をします。
f:id:s51517765:20191002210444p:plain
Errorが出ます。
f:id:s51517765:20191002210830j:plain
注目すべきは、線で囲んだところですが、
「他のプッシュによって起きている、リモートの変更を統合せよ。プッシュする前にプルしてね。」という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.

まずは、リモートの変更を取り込みます。
衝突があります、と言われます。
f:id:s51517765:20191002212420j:plain
手動で解消します。

しかし、意図的な変更がない場合?はフェッチしてマージすると難なく解消できます。
フェッチとはリモートの変更の情報を取得することです。
プルはフェッチしたうえでマージをすることですが、フェッチした上で明示的にローカルのソースにリモートをマージするとうまくいくようです。
フェッチした上で、「リモートブランチを表示」しマージします。
f:id:s51517765:20191002214728j:plain
ローカルのブランチを選択した状態でマージをクリックし、「マージの代わりにリベースする」にチェックを入れ、マージするコミットとしてリモートを選択します。
f:id:s51517765:20191002214859j:plain

これでうまう行くはずですが、これでもダメな場合(初期以外の場合)はブランチを作ってリモートをチェックアウトし、マージするとうまくいくことがあります。

それでもだめだったら、ローカルですべてのブランチのファイルをWindowsエクスプローラ上で手動マージしてコピペしてSorcetree上でブランチをマージします…。

まとめ

コンフリクトの解消の仕方を説明しました。
SorcetreeはErrorが英語しか出ないので怖いところはありますが、Errorのほとんどはコンフリクト関連だと思います。
うまくブランチをマージ出来るかどうかが使いこなしのポイントです。
Sorcetree上にも手動マージの機能がありますが、コンフリクトしたときには自身の使い慣れたエディタで手動マージするのもありです。
また、ブランチは途中で終わらせても特に問題はありません。Masterだけ手動マージして進めるというのもありです。(管理上はどうかというのはありますが…)

いずれにしてもコミットした時点へはいつでも戻れるので恐れずやってみて慣れるのが一番です。
練習用のリポジトリをBitbucketでつくってわざとブランチを作り、コンフリクトを起こさせて解消するといい練習になります。
GitHubでも同様に使えます。

チーム開発でなくても、GitもしくはSorcetreeでローカルのみでVersion管理するだけでも価値があります。
Bitbucketでは無料でもプライベートリポジトリが使えるので、リモートにプッシュしておけば非公開でバックアップもできます。

参考