web-dev-qa-db-ja.com

あるgitブランチから別のgitブランチに単一ファイルのバージョンをコピーするにはどうすればいいですか?

完全にマージされた2つのブランチがあります。

しかし、マージが完了した後、1つのファイルがマージによって台無しにされていることがわかり(他の人が自動フォーマットを行った、gah)、もう一方のブランチで新しいバージョンに変更する方が簡単です。それから私のブランチに持っていった後に私の一行の変更を再挿入してください。

それでは、これを行うためのgitの最も簡単な方法は何ですか?

810
madlep

ファイルを配置したいブランチからこれを実行します。

git checkout otherbranch myfile.txt

一般式

git checkout <commit_hash> <relative_path_to_file_or_dir>
git checkout <remote_name>/<branch_name> <file_or_dir>

いくつかのメモ(コメントから):

  • コミットハッシュを使えば、どんなコミットからでもファイルを引き出すことができます。
  • これはファイルとディレクトリに対して機能します。
  • ファイルmyfile.txtmydirを上書きします
  • ワイルドカードは機能しませんが、相対パスは機能します
  • 複数のパスを指定できます

代替案

git show commit_id:path/to/file > path/to/file
1474
madlep

私は同様の検索でこの質問にたどり着きました。私の場合は、ファイルを元の場所とは異なる別のブランチから現在の作業ディレクトリに抽出しようとしていました。 答え

git show TREEISH:path/to/file >path/to/local/file
72
lkraav

Checkoutコマンドの使い方はどうでしょうか。

  git diff --stat "$branch"
  git checkout --merge "$branch" "$file"
  git diff --stat "$branch"
46
RzR

Madlepの答えに従って、ディレクトリblobを使って、あるディレクトリを別のブランチからコピーすることもできます。

git checkout other-branch app/**

あなたがそこで1つのファイルだけを変更したならば、opの質問に関してはこれはうまくいくでしょう^ _ ^

12
6ft Dan

1)ファイルのコピーが必要な場所にいることを確認します。例えば:私はあなたがチェックアウトする必要があるか、マスターgit checkout masterでなければならないので、私はマスターにサブブランチファイルが欲しい

2)サブブランチからマスターに必要な特定のファイルのみをチェックアウトします。

git checkout sub_branch file_path/my_file.ext

ここでsub_branchは、あなたがコピーする必要があるファイル名が後に続くあなたがそのファイルを持っている場所を意味します。

9

受け入れられた答えでは、最初のオプション Stage 他のブランチからのファイル全体(git add ...が実行されたように)で、2番目のオプションは単にファイルをコピーするだけでステージングは​​しません。変更内容(あたかも手動でファイルを編集しただけで未解決の相違点があるかのように)。

ステージングせずに別のブランチからGitコピーファイルを作成

段階的な変更 (例:git add filename)

$ git checkout directory/somefile.php feature-B

$ git status
On branch feature-A
Your branch is up-to-date with 'Origin/feature-A'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   directory/somefile.php

未解決の変更 (ステージングもコミットもされていない):

$ git show feature-B:directory/somefile.php > directory/somefile.php

$ git status
On branch feature-A
Your branch is up-to-date with 'Origin/feature-A'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   directory/somefile.php

no changes added to commit (use "git add" and/or "git commit -a")
0
user151841