Git と Visual Studio 2017 その 9 : Git でソリューションの共有
前回の記事では、ブランチ切り替え時における作業の一時保存について説明しました。今回は Git を使って手元のソリューションを他の人と共有する方法について見ていきます。共有方法は多くありますが、今回は GitHub.com における共有を考えます。もしアカウントが無い場合は https://github.com へ行って、サインアップしてください。
GitHub でレポジトリ作成
まずは GitHub.com 上に今回使うレポジトリを作ります。
1. https://github.com へログイン。
2. “Start a project” をクリック。
3. 名前や説明を入れ、各種設定は既定値のまま作成。
リモートの追加とプッシュ
次に Git で、作成したリモートサーバーの情報を追加します。
1. 作成した GitHub のレポジトリでリモート用の git コマンドを確認。
2. 表示されている通り、‘git remote add origin https://github.com/kenakamu/VS_Git.git” を実行。これで指定した URL を ‘origin’ という名称で利用可能。名称は任意でよいが origin を使うことが一般的なため、今回はそのまま採用。
3. ‘git remove -v’ を実行して現在のリモートを確認。
4. ‘git branch -a’ を実行。-a を付けることでリモート追跡ブランチを含めた確認が可能。現時点では 2 つのローカルブランチのみ。
5. ‘git push -u origin master’ でローカルの master ブランチの情報をリモートにプッシュ。プッシュを実行すると Git はリモート追跡ブランチという特殊ブランチを追加する。また -u オプションを使うことで ローカルの master ブランチとリモート追跡ブランチの紐づけが行われ、以降 ’git push’ のみでプッシュが可能となる。ログによると 34 アイテムが同期された模様。
6. GitHub からも確認。コミットが 6 つあることも確認。
7. “6 commits” リンクをクリックするとコミットの履歴が確認可能。コミット ID や追加したユーザー名が確認可能。写真が出ていない理由は、今後改めて。
8. 他の開発者が変更をコミットした場合の動作確認として、GitHub 上で変更を追加。Code タブにある ”Add a README” をクリック。
9. 特に編集はせず、そのまま “Commit new file” をクリックしてコミット。
10. ファイル一覧より REAMD.md を確認。
リモートからの変更をプル
Git はリモートの変更を受け取る手段として fetch と pull があり、それぞれ役割が違います。実際に見ていきましょう。
1. ‘git branch -a’ を実行してローカルブランチとリモート追跡ブランチを確認。赤色で表示されいてる remotes/origin/master がリモート追跡ブランチ。
2. .git\refs\heads フォルダにはローカルブランチしかない。
3. リモート追跡ブランチは .git\refs\remotes\origin に存在。
4. ファイルの中身を ‘type .git\refs\remotes\origin\master’ で確認。ローカルブランチ同様 SHA1 ハッシュ値を含んでいる。現在はローカルの master と同じコミットをポイント
5. ‘git fetch’ を実行。fetch はリモートの情報をリモート追跡ブランチにのみ同期。
6. 再度各ブランチファイルの中身を確認。リモート追跡ブランチが新しいコミットをポイント。
7. GitHub でコミット履歴を見ると同じ ID が確認可能。
8. 次に ‘git pull’ を実行。コミットを更新している旨が表示され、README.md が作成。
9. ‘type .git\refs\heads\master’ でローカル master ブランチのポイント先を確認。リモート追跡ブランチと同じハッシュ値をポイント。
競合の解消
既にローカルブランチ間の競合解消は見てきましたが、リモートとの競合も同じか確認しましょう。
Resolve Conflicts
1. ‘echo "ローカルで変更追加" >> README.md’ を実行して README.md を編集。
2. ‘git commit -am “ローカルで README.md 更新”’ を実行してコミット作成。
3. ‘git log --oneline --graph --all’ で現状確認。ローカル master とリモート追跡ブランチの master が異なるコミットをポイント。
4. GitHub からも README.md を編集。ファイルを選択して、鉛筆アイコンをクリック。
5. ファイルを変更してコミット。
6. ‘git push’ でローカルの変更をリモートへ反映。しかしリモートに更新があるという理由で却下。
7. ‘git pull’ を実行して一旦リモートの変更を取得。fetch はできているが、ローカルブランチに取り込む際に競合が発生。
8. fetch が成功しているか ‘git log --oneline --graph --all’ で確認。リモート追跡ブランチの master がより新しいコミットをポイントしていることを確認。
9. ‘git mergetool’ を実行して競合をマージ。
10. 競合解消後、‘git commit -m “README.md をマージ”’ にてコミット。
11. ‘git log --oneline --graph --all” を実行してマージ履歴を確認。ローカル master がリモート追跡ブランチより新しいコミットをポイント。
12. ‘git push’ を実行。今回は成功。GitHub 側でも READM.md を確認。
ブランチの同期
現在 master ブランチだけが同期されているので、dev ブランチも同期しましょう。
1. ‘git push -u origin dev’ を実行。master と同じく GitHub にブランチが作成される。
2. リモート側でブランチが削除された場合の処理を検討。現状確認のためまず ‘git branch -a’ を実行。
3. さらに詳細を確認するため、‘git remote -v show origin’ を実行。各ブランチが pull/push ペアとしてリモート追跡ブランチとペアになっている。
4. GitHub 上で “dev” ブランチを削除。ブランチ一覧よりごみ箱アイコンをクリック。
5. ‘git remote prune origin’ を実行。リモートの dev ブランチがないため、origin/dev が pruned と表示。
6. ‘git branch -a’ でブランチ表示。リモート追跡ブランチから remotes/origin/dev が来ていることを確認。
7. ‘git checkout dev’ を実行。まだリモート追跡ブランチと紐づいている場合警告が表示。その場合は ‘git branch --unset-upstream’ を実行。
8. 他のシナリオも検証するため、再度リモートに dev ブランチをプッシュ。今回は -u オプションをつけずに実行。‘git push origin dev’ 実行後 ‘git remote show origin’ で状況確認。
9. dev ブランチで ‘git push’ 実行。プッシュ時に -u を付けなかったことでリモート追跡ブランチとペアになっていないことからエラー。’git push -u origin dev’ を再度実行すれば紐づけされる。
10. GitHub のブランチをローカルから削除することも可能。‘git push origin -d dev’ を実行。-d を付けることで削除指示をプッシュ。
11. ‘git branch -a’ を実行するとローカルのリモート追跡ブランチも消えていることを確認。
12. 再度 ‘git push -u origin dev’ でリモートブランチを再作成。
リモートをクローン
PC が新しくなったり、ローカルのソリューションを消してしまった場合、GitHub からすべてを復旧することが出来ます。
1. ローカルの VS_Git フォルダを削除。
2. GitHub に行って、“Clone or download” ボタンをクリック。アドレスをコピー。
3. コマンドプロンプトを開き、ソリューションをクローンしたいフォルダへ移動。
4. ‘git clone <https://github.com/kenakamu/VS_Git.git’> を実行。
5. VS_Git フォルダが作成されることを確認。
6. VS_Git フォルダに移動後、‘git log --oneline --graph --all’ で状況確認。すべてのコミットが存在するが、ローカルの dev ブランチがない。
7. ‘git branch -a’ で確認。やはりローカルの dev ブランチがない。
8. ‘git checkout dev’ を実行。ローカル dev ブランチ作成と同時に、リモート追跡ブランチとペアリングされる。
リモートの削除
最後にリモートを削除してみましょう。
1. ‘git remote remove origin’ を実行後 ‘git branch -a’ でブランチ確認。
2. 削除はこれだけだが、次回 Visual Studio でも同じ検証をするため、以下のように各ブランチでハードリセットを実行。
まとめ
リモートやリモート追跡ブランチは概念の理解が重要です。クローンやブランチをの同期を覚えておけば、ローカルのファイルがなくなっても安心です。次回は Visual Studio 2017 のリモート機能について見ていきます。次の記事へ
中村 憲一郎