はじめに
開発を進めていると、「別々に作っていた試作コードやPoCの成果物を、メインの開発リポジトリに統合したい」という場面が出てくることがあります。
単にファイルをコピーするだけなら簡単ですが、それだと過去のコミットメッセージや「誰がいつ変更したか」という大切な変更履歴がすべて消えてしまいます。
この記事では、GitHubなどの外部サーバーを一切使わず、手元のPC(ローカル環境)だけで、2つの異なるGitリポジトリの履歴を保持したまま統合する手順を解説します。
なお、Gitの基本操作(add・commit・merge)は知っている前提で進めます。
最後に、Windows環境などで発生しやすい「後片付け時のフォルダロックエラー」の原因と対処法も合わせて紹介します。
結論:Gitの「リモート」にはローカルパスを指定できる
Gitの解説記事では、git remote add コマンドの接続先にGitHubなどのURL(https://...)を指定することがほとんどです。
しかし、Gitの仕組み上、「自分のPC内にある別のフォルダパス」をそのままリモート先として登録することが可能です。
これを利用すれば、外部ネットワークに一切データを送信することなく、安全にリポジトリをマージできます。
統合の手順
今回は、メインとなるリポジトリ(repository-A)に、別で開発していたリポジトリ(repository-B)を取り込む例で解説します。
1. メインのリポジトリ(A)に移動する
cd /path/to/repository-A
2. 取り込みたいリポジトリ(B)をローカルパスで登録する
git remote add temp-remote /path/to/repository-B
Windows環境でネットワークドライブ(O:\ など)上にある場合も、そのパスをそのまま指定できます。ただし Git Bash を使う場合は /o/... 形式で指定してください(PowerShell・コマンドプロンプトでは O:\ 形式で問題ありません)。
3. データを取得(fetch)する
git fetch temp-remote
このコマンドにより、repository-B のコミット履歴やブランチ情報がローカルに取り込まれます。ネットワーク通信は発生せず、通常は短時間で完了します。
4. 履歴を統合する
git merge temp-remote/main --allow-unrelated-histories -m "repository-Bを統合"
取り込みたい側のブランチ名(main や master など)に合わせて適宜変更してください。
--allow-unrelated-histories は、共通の祖先を持たない2つの履歴をマージするために必要なオプションです。このオプションなしで実行すると、Gitはデフォルトでマージを拒否します。
注意:同じファイルが存在する場合はコンフリクトする
この方法は履歴だけではなくファイル内容もマージします。そのため、両リポジトリに同じパスのファイルが存在する場合は、通常のGitマージと同様にコンフリクトが発生します。
例えば、以下のような構成の場合は README.md が競合します。
repository-A/ repository-B/
├ README.md ├ README.md
└ src/ └ docs/
コンフリクトが発生した場合は、対象ファイルを手動で編集して内容を解消したあと、通常のマージ完了手順で対応します。
git add README.md
git commit
5. 後片付け(リモート設定の削除)
git remote remove temp-remote
正常に完了すれば作業はこれで終了です。
統合できたか確認するコマンド
コミットグラフを確認
git log --graph --oneline --all
2本の線が合流する形になっていて、Bのコミット履歴が確認できれば成功です。
リモート設定の確認
git remote -v
temp-remote が表示されなければ問題ありません。
削除エラーが出る場合
git remote remove 実行時に、以下のようなエラーが出ることがあります。
Deletion of directory '.git/logs/refs/remotes/temp-remote' failed. Should I try again? (y/n)
原因:複数プロセスによるファイルロック
主な原因は以下のとおりです。
- VS Code(内部ターミナル含む)と外部ターミナルの併用
- エクスプローラーでフォルダを開いている
- ウイルス対策ソフトのスキャン
- ネットワークドライブ環境
特に外部ターミナルとVS Codeの内部ターミナルを同時に立ち上げて作業している場合、プロセスがファイルをロックしやすくなります。
対処法
① ターミナルを1つにする
開いているターミナルを整理・集約してから再実行します。
git remote remove temp-remote
② 強制削除
ロックが解除されない場合は、OSコマンドで直接該当の参照を削除します。
PowerShell:
Remove-Item -Recurse -Force .git\refs\remotes\temp-remote
Remove-Item -Recurse -Force .git\logs\refs\remotes\temp-remote
Git Bash:
rm -rf .git/refs/remotes/temp-remote
rm -rf .git/logs/refs/remotes/temp-remote
③ configを掃除する
設定ファイルにセクションが残っていないか確認します。
git config --local --list
残っている場合は以下のコマンドで削除します。
git config --local --remove-section remote.temp-remote
おわりに
Gitは分散型バージョン管理システムであるため、サーバーがなくてもローカル同士で柔軟に履歴をやり取りできます。
コミット履歴には、バグ修正の経緯・設計の意図・変更理由といった重要な情報が含まれています。リポジトリを統合する際は、単なるファイルコピーではなく、履歴を保ったまま統合する方法もぜひ活用してみてください。