完全にマージされた2つのブランチがあります。
ただし、マージが完了した後、1つのファイルがマージによってめちゃくちゃになっていることに気づき(他の誰かが自動フォーマットを実行しました)、もう一方のブランチで新しいバージョンに変更する方が簡単です。次に、1行の変更をブランチに持ってきてから、それを再度挿入します。
では、gitでこれを行う最も簡単な方法は何ですか?
完全にマージされた2つのブランチがあります。
ただし、マージが完了した後、1つのファイルがマージによってめちゃくちゃになっていることに気づき(他の誰かが自動フォーマットを実行しました)、もう一方のブランチで新しいバージョンに変更する方が簡単です。次に、1行の変更をブランチに持ってきてから、それを再度挿入します。
では、gitでこれを行う最も簡単な方法は何ですか?
回答:
ファイルを作成するブランチからこれを実行します。
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.txt
を上書きし、mydir
代替:
git show commit_id:path/to/file > path/to/file
''
、シェルによって解釈されないようにする必要があります。
私は同様の検索でこの質問に終わった。私の場合、別のブランチから現在の作業ディレクトリに、ファイルの元の場所とは異なるファイルを抽出しようとしていました。答え:
git show TREEISH:path/to/file >path/to/local/file
git diff <other branch> <path to file>
うまくいきます。
チェックアウトコマンドの使用について:
git diff --stat "$branch"
git checkout --merge "$branch" "$file"
git diff --stat "$branch"
git diff
--stat
基本的にdiffstatと同じことを行う引数をサポートします。
1)ファイルのコピーが必要なブランチにいることを確認します。例:私はサブブランチファイルをマスターにしたいので、チェックアウトする必要があるか、マスターにいる必要がありますgit checkout master
2)サブブランチからマスターに必要な特定のファイルだけをチェックアウトします。
git checkout sub_branch file_path/my_file.ext
ここでsub_branch
は、コピーする必要があるファイル名が後に続くそのファイルがある場所を意味します。
madlepの答えに従って、ディレクトリblobを持つ別のブランチから1つのディレクトリをコピーすることもできます。
git checkout other-branch app/**
opの質問に関しては、ファイルを1つだけ変更した場合、これは正常に機能します^ _ ^
origin/other-branch
、repoブランチを参照するために使用する必要があることに注意してください。基本、でも私を噛んで。(答えは素晴らしいです-編集は必要ありません)
私は使用しますgit restore
(git 2.23以降で利用可能)
git restore --source otherbranch path/to/myfile.txt
なぜ他のオプションよりも優れているのですか?
git checkout otherbranch -- path/to/myfile.txt
-ファイルを作業ディレクトリにコピーするだけでなく、ステージング領域にもコピーします(このファイルを手動でコピーgit add
して実行した場合と同様の効果があります)。git restore
ステージング領域には触れません(--staged
オプションで指示されない限り)。
git show otherbranch:path/to/myfile.txt > path/to/myfile.txt
標準のシェルリダイレクトを使用します。Powershellを使用する場合、テキストのエンコードに問題があるか、バイナリの場合はファイルが壊れる可能性があります。でgit restore
変更するファイルのすべてで行われるgit
実行可能。
別の利点は、次のようにしてフォルダー全体を復元できることです。
git restore --source otherbranch path/to
または、git restore --overlay --source otherbranch path/to
ファイルの削除を避けたい場合。たとえばotherbranch
、現在の作業ディレクトリよりもファイルが少ない場合(およびこれらのファイルが追跡される場合)、--overlay
オプションgit restore
を指定しないとファイルが削除されます。しかし、これは適切なデフォルトの動作です。おそらく、otherbranch
「同じですが、現在のブランチに追加のファイルがある場合」ではなく、のようにディレクトリの状態を同じにする必要があります。
git restore
ソースブランチからターゲットブランチの新しいファイルにファイルをコピーする方法はありますか?git showを使用すると、シェルリダイレクト(git show otherbranch:path/to/file1.txt > path/to/file2.txt
)でこれを行うことができますが、あなたが言及した理由により、シェルリダイレクトを回避したいと思います。
git restore
(しかし誰が知っているか;))。このリダイレクトの問題は基本的にはPowershellの問題であり、他のシェルに問題があるかどうかはわかりません。私は通常「git bash」または「cmd」に戻って、「git show
with redirection」コマンドを使用する必要があります。または、GitExtensionsのようなGUIを使用して、コミットのファイルツリーを参照し、任意のファイルで[名前を付けて保存]をクリックします。
受け入れられた回答では、最初のオプションは(実行されたように)他のブランチからファイル全体をステージングgit add ...
し、2番目のオプションはファイルをコピーするだけですが、変更をステージングしないことに注意してください(ファイルを手動で編集しただけで、顕著な違いがありました)。
段階的な変更(例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")