ツナ缶雑記

ぐうたらSEのブログです。主にマイクロソフト系技術を中心に扱います。

Azure ReposリポジトリにGitHubリポジトリの最新の状態を反映する方法

f:id:masatsuna:20200227094745p:plain

前回GitHubリポジトリをAzure Reposにインポートする方法を解説しました。

tsuna-can.hateblo.jp

今回はその続きとして、インポート元のGitHubリポジトリに対して行われた修正を、Azure Reposのリポジトリに反映する方法について解説しようと思います。 なお今回はVisual Studioを使った方法を解説します。 コマンドラインでも同等のコマンドを発行することで、同じことができます。

環境

Gitリポジトリをクローンする

まずはGitHubからインポートしたAzure ReposのGitリポジトリをローカルにクローンしておきます。 Visual Studioを起動して [チームエクスプローラー] を立ち上げて、Azure ReposのGitリポジトリをクローンします。

リモートリポジトリを設定する

次に、Gitリポジトリの設定画面を開きます。 [チームエクスプローラー] の上部にあるドロップダウンから [設定] を開きます。 そして下部に表示される [リポジトリの設定] を選択します。

f:id:masatsuna:20200225174410p:plain
リポジトリの設定

リポジトリの設定画面の中の [リモート] のセクションを開きます。 初期状態ですと、 [origin] という名前のAzure Reposのリモートリポジトリが設定されていると思います。 [追加] を選択します。

f:id:masatsuna:20200225174619p:plain
リモートリポジトリの追加

[リモートの追加] ダイアログが出るので、そこにGitHubリポジトリを設定します。 名前はなんでも構わないのですが、わかりやすく [upstream] にしておきます。

f:id:masatsuna:20200225174717p:plain
GitHubリポジトリを設定

これでリモートリポジトリの設定ができました。

GitHubに入った変更を取得してローカルのmasterブランチに反映する

再度 [チームエクスプローラー] に戻り、上部のドロップダウンから [同期] を選択します。 次に [フェッチ] を選択して、先ほど設定した [upstream] をドロップダウンから選択します。 設定が終わったら [フェッチ] ボタンを押下します。

f:id:masatsuna:20200225174955p:plain
GitHubリポジトリをフェッチ

これで正常に動作していれば、GitHubリポジトリの情報がフェッチされます。 上部のドロップダウンから [ブランチ] を選択します。 正常にフェッチが完了していれば、 [remotes/upstream] にGitHubリポジトリの情報が見えるはずです。

f:id:masatsuna:20200225175112p:plain
GitHubのブランチが表示される

続いてGitHubリポジトリに対する変更をローカルのmasterブランチに取り込んでいきます。 引き続き [ブランチ] のウィンドウで [リベース] を選択します*1。 今回はローカルのmasterブランチに、GitHub上のmasterブランチを取り込んでいくので、以下のような設定になります。 設定が終わったらそのまま [リベース] ボタンを押下しましょう。

f:id:masatsuna:20200225175201p:plain
ローカルリポジトリをリベース

うまくマージができたら、Azure Reposに変更を反映します。 上部のドロップダウンから [同期] を選択します。 [出力方向のコミット] にGitHub上で行われたコミットが並ぶので、そのまま [プッシュ] を押下して反映させます。

f:id:masatsuna:20200226093102p:plain
変更をプッシュ

これでGitHubリポジトリの変更を、Azure Reposのリポジトリに取り込むことができました。

インポートしたAzure ReposからGitHubへのプルリクエストは作れない

前回の記事でも記載した通り、ここで解説した方法はGitHubやAzure Reposのフォークを使った方法ではありません。 そのため、インポートしたAzure Reposに対して行った修正を用いて、GitHubリポジトリに修正を反映させることはできません。 プルリクエストもGitHub、Azure Repos単独の機能なので、この境界を超えることはできないんですよね。 こういったことをやりたいのであれば、元となるリポジトリと同じサービス内にフォークしたリポジトリをたててあげる必要があります。

*1:こういったケースでは、git rebaseで取り込む方が都合が良いと思います。