GitHubで別のリポジトリにコミット履歴を残したまま移行する方法

Aというリポジトリで作業していて、Bというリポジトリに移行したいという場合の話をしています。

両方メインブランチのみ想定しています。

BはGitHub上で新規にリポジトリを作成して、README.mdだけ追加されている状態を想定します。
これは、途中で競合した状況を再現するため作っています。
もちろんなくても大丈夫ですが、テストで移行する場合は競合がある場合どうするかを体験するためにもあったほうがいいかなと思います。

というわけで、GitHub上でBというリポジトリを作っていきます。(どこかのタイミングでリポジトリは削除するので、GitHub上でみてもらってもなくなってるかも)

もし移行に不安がある場合は是非同じように自分のリポジトリーでテストしてみましょう。

B(マージ先の)リポジトリを作成

GitHub上でリポジトリを作成します。

README.mdを追加するためにAdd a README fileにチェックを入れています。

できました。

Aリポジトリを確認

とりあえず、Aリポジトリは以下のリポジトリを使うことにします。
なんかAって作るのもめんどくさいので。azfunc-blob-sampleというやつです。

こちらのコミット履歴はこんな感じ。

こちらの履歴を保持してAリポジトリに移行したいわけです。
ちなみに、この時点でのBリポジトリは以下のような感じです。
当然ですが、初回コミットしかないです。

マージする

Bのディレクトリ直下でターミナルを立ち上げます。

以下打ち込みます。

git remote add upstream リポジトリのパス

リポジトリのパスはGithubでcloneする時に使うURLです。
普通は以下のURLとなります。


https://github.com/xiaotiantakumi/azfunc-blob-sample.git

私の環境ではssh経由でやっているので、以下のようになります。

git remote add upstream git@github-pri:xiaotiantakumi/azfunc-blob-sample.git
git fetch upstream

以下のようにBのリポジトリにAの情報が取り込まれました。
Aの情報が取り込まれたと言いましたが、現段階ではまだBに何か変化があったわけではないです。

git merge  --allow-unrelated-histories upstream/main

–allow-unrelated-historiesというオプションを付けることで、根本が異なるブランチ2つをマージすることができます。このオプションをつけないと、今回のケースではエラーがでて取り込まれません。

上記ターミナルのログをみると、エラーが出ているのが見て取れます。
冒頭でも言いましたが、README.mdが競合の原因となっています。

競合を解決してBリポジトリにpushする

vscodeで作業しているので、そこでの競合の解決方法を書いていきます。

まず、マージした直後のディレクトリの状態がこんな感じです。

変更のマージという部分で、README.mdがあります。

それをクリックするとこのような画面になります。

左右にそれぞれのREADME.mdの内容があります。それとソースの左側にチェックボタンがあるんですが、これをチェックすると、こんな感じになります。

これはAのリポジトリのREADME.mdの内容を選択した状態です。
この状態でマージの許可をしたら、結果で表示されている内容でREADME.mdが更新されます。

例えば、両方の内容を取り込みたいときは、手動でコピーしたりして以下のようにします。

ステージされている変更にREADME.mdが含まれるようになりました。
また、もとはBリポジトリの内容だったので、変更箇所としてAの内容がハイライトされています。

この状態でコミットしてpushします。

コミットしてプッシュするとGitHub上でBリポジトリがこのようになりました。

Aリポジトリ(azfunc-blob-sample)が取り込まれた状態です。

gitの履歴も見ておきます。