ytooyamaのブログ

サーバ構築とか、仕事で発見したこととか、趣味のこととかを書いています。

Gitソースのブランチから特定のファイルだけを持ってきたい時

「Gitソースのブランチから特定のファイルだけを持ってきたいとき」みたいな検索ワードで調べると、こういう例が大量に出てきます。特にQiitaとか。

git fetch
git checkout -m origin/main -- Readme.md

-mはマージに関するオプションであって、リポジトリーから特定のファイルをローカルリポジトリーを持ってくる場合に指定するオプションではありません。 具体的なことを言うと、該当のファイルを手元でたくさんいじってしまって、ローカルリポジトリーのファイルを削除して、特定のブランチから新しいファイルを持ってきたい場合は-mをつけると次のようなエラーになります。

fatal: 'merge', '--ours' or '--theirs' cannot be used when checking out of a tree

ただ、本当はローカルリポジトリーのファイルを削除するのではなくて、次のようなコマンドでリポジトリーのもとのファイルの状態に戻す方が適切です。これでローカルの変更は破棄されるので、この後新しいコミットと同期するならgit pullを実行してリモートリポジトリーと同期します(上の方法はGit 2.23以降で利用可能)。

git restore Readme.md
or
git checkout -- Readme.md

今回のようなケース「Gitソースのブランチから特定のファイルだけを持ってきたいとき」では、次のように実行するのが正しいみたいです。 ブランチ名とファイル名の間の--はつけてもつけなくても良いです。

git fetch
git checkout origin/main -- Readme.md

最後に-mオプションのところを貼り付けて終わりにします。

-m, --merge
ブランチを切り替えるとき、現在のブランチと切り替えるブランチの間で異なる 1 つまたは複数のファイルへのローカル変更がある場合、コマンドはコンテキストで変更を保持するためにブランチの切り替えを拒否します。ただし、このオプションでは、現在のブランチ、作業ツリーのコンテンツ、および新しいブランチ間の三方向のマージが完了し、新しいブランチになります。

マージの競合が発生した場合、競合するパスのインデックスエントリはマージされていないままになります。競合を解決し、解決したパスを git add (またはマージによってパスが削除される場合は git rm) でマークする必要があります。

インデックスからパスをチェックアウトするとき、このオプションを使用すると、指定されたパスで競合するマージを再作成できます。
--Mergeでブランチを切り替えると、段階的な変更が失われる可能性があります。

このブログサイトはJavaScriptを使っていますが、読み込んでいるJavaScriptは全てはてなが提供しているものであり、筆者が設置しているものではありません。