

Visual Studio Community2019及びバージョン管理初心者です。  
ある活動でバージョン管理が必要になったため、環境を構築し始めています。  
pullについてわからないことがあるため、ご教示ください。  
そしてpullについて私が誤解しているようでしたら、それもご指摘お願いします。

リモートリポジトリの特定のcommitのみ、ローカルリポジトリに反映させることができますか？

例えば、共同開発者が1つのリモートリポジトリの中にあるAとBという2つのファイルにそれぞれcommitをして変更を加えたとします。そして、私は自分のローカルリポジトリのAファイルのみ、リモートリポジトリと同期させたい(共同開発者のcommitを自分のローカルリポジトリのAに反映させたい)とします。その時どのような操作を行えば実現できますか。

自分のローカルリポジトリのBファイルには共同開発者のcommitを反映させたくありません。  
そしてこの操作をVisual Studio Community上で行いたいです。

現在、リモートリポジトリにはAzure DevOpsを、ローカルリポジトリにはGit、そしてVisual Studio Community
2019を用いて環境構築をしています。リモートリポジトリは共同開発者と共有しています。

ご存じの方がいらっしゃいましたら、教えてください。  
どうかよろしくお願いいたします。


CC BY-SA 4.0
2020-04-20T00:27:39.390
65771
2022-01-23T12:07:56.643
2022-01-23T12:07:56.643
3060
39713
question
git
リモートリポジトリから特定のコミットだけをローカルに反映したい


git におけるコミットとは、リポジトリ (管理フォルダ配下) 全体の状態を保存したものになります。

特定コミットの中から個別のファイルの変更のみ取り出すことも可能ではありますが、"他人のコミットを反映させたくない"
ならGitを使った共同編集のメリットが薄いように感じます。

作業用のブランチを切って、そこに必要なコミット(または特定のファイルのみ)を取り込む、というやり方にありそうです。

コミットから指定のファイルの変更のみ取り出すには、以下の形式でコミットIDとファイルのパスを指定します。

[code]

    $ git checkout <commitID> <path_to_file>
    
[/code]

* * *

**追記**  
過去に類似質問への [回答](https://ja.stackoverflow.com/a/55874) でも記載しましたが、`git pull` は裏で
`fetch + merge` を行うので、取り込みたくないものが含まれているなら `git pull` は使うべきではありません。


CC BY-SA 4.0
2020-04-20T05:13:40.037
65777
2020-04-20T06:13:44.437
2020-04-20T06:13:44.437
3060
3060
65771
answer


表題の

> リモートリポジトリから特定のコミットだけをローカルに反映したい

と、文中の

> Aファイルのみ、リモートリポジトリと同期させたい

のどちらを実際にやりたいのかにもよりますが、まず前者は[`cherry-pick`](https://git-scm.com/docs/git-
cherry-pick)で可能です。

[code]

    git fetch
    
[/code]

でremote-trackng branchが最新化されますので、そこから取り込みたいcommitのハッシュ値を確認し、

[code]

    git cherry-pick <取り込みたいcommitのハッシュ値>
    
[/code]

で取り込めます。

後者の場合は、

[code]

    git fetch
    
[/code]

を行いremote-tracking branchを最新化した後、

[code]

    git checkout <remote-tracking branch名> -- <Aファイル>
    
[/code]

で可能です。  
最近のバージョン([2.23](https://mag.osdn.jp/19/08/19/183000)以降)だと[`restore`](https://git-
scm.com/docs/git-restore)コマンドでも同じことができます:

[code]

    git restore --source <remote-tracking branch名> --staged --worktree -- <Aファイル>
    
[/code]

また、

> 自分のローカルにあるBはそのままにしたいです。

ということであれば、Aファイルだけ最新状態を取り込む、のではなく、リモートブランチの変更を全て取り込んだ上でBファイルだけ古い状態(=リモートの変更を取り込む前のローカルブランチの最新状態)に戻す、という考え方もあるかと思います。


CC BY-SA 4.0
2020-06-12T08:58:49.567
67574
2020-06-12T09:11:20.193
2020-06-12T09:11:20.193
2808
2808
65771
answer