1377 Stimmen

Wie kopiere ich eine Version einer einzelnen Datei von einem Git-Zweig in einen anderen?

Ich habe zwei Zweige, die vollständig zusammengeführt sind.

Nachdem die Zusammenführung abgeschlossen ist, stelle ich jedoch fest, dass eine Datei durch die Zusammenführung durcheinander gebracht wurde (jemand anderes hat eine automatische Formatierung vorgenommen, gah), und es wäre einfach einfacher, zur neuen Version im anderen Zweig zu wechseln und dann meine einzeilige Änderung wieder einzufügen, nachdem ich sie in meinen Zweig gebracht habe.

Wie lässt sich dies in Git am einfachsten bewerkstelligen?

2256voto

madlep Punkte 43822

Führen Sie dies von dem Zweig aus, in dem die Datei landen soll:

git checkout otherbranch myfile.txt

Allgemeine Formeln:

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

Einige Anmerkungen (aus Kommentaren):

  • Mit Hilfe des Commit-Hashs können Sie Dateien aus jeder Commit-Datei ziehen
  • Dies funktioniert für Dateien und Verzeichnisse
  • Überschreibt die Datei myfile.txt y mydir
  • Wildcards funktionieren nicht, aber relative Pfade schon
  • Es können mehrere Pfade angegeben werden

Eine Alternative:

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

248voto

Mariusz Pawelski Punkte 21614

Ich würde verwenden git restore (verfügbar seit Git 2.23):

git restore --source otherbranch path/to/myfile.txt


Warum ist sie besser als andere Optionen?

  • standardmäßig git restore Dateien nur im Arbeitsverzeichnis ändern.

git checkout otherbranch -- path/to/myfile.txt Kopieren Sie die Datei in das Arbeitsverzeichnis (Ihre Dateien auf der Festplatte), aber auch in den Staging-Bereich. Das ist ein ähnlicher Effekt, als wenn Sie die Datei manuell kopieren würden und git add darauf. git restore standardmäßig nur das Arbeitsverzeichnis ändern.

Um das gleiche Ergebnis wie bei git checkout otherbranch -- path/to/myfile.txt können Sie schreiben git restore --source otherbranch --staged --worktree path/to/myfile.txt

  • standardmäßig git restore löscht Dateien aus dem Arbeitsverzeichnis, wenn sie in einem anderen Zweig nicht vorhanden sind

git restore kann verwendet werden, um den gesamten Ordner wiederherzustellen mit git restore --source otherbranch path/to/dir . Eine ähnliche Operation können Sie durchführen mit git checkout sondern git restore löscht standardmäßig Dateien, die auf otherbranch . Um zu git checkout Verhaltensnutzung --overlay opción.

Wenn es zum Beispiel weniger Dateien auf otherbranch als im aktuellen Arbeitsverzeichnis (und diese Dateien sind Verfolgt ) ohne --overlay Option git restore werden sie gelöscht. Aber das ist ein gutes Standardverhalten, Sie wollen wahrscheinlich, dass der Zustand des Verzeichnisses "der gleiche ist wie in otherbranch ", nicht "dasselbe wie in otherbranch aber mit zusätzlichen Dateien aus meinem aktuellen Zweig".

Um das gleiche Ergebnis wie bei git checkout otherbranch -- path/to/dir können Sie schreiben git restore --source otherbranch --staged --worktree --overlay path/to/dir

  • git restore verwendet keine Shell-Umleitung zum Erstellen von Dateien (nur Powershell-Problem)

git show otherbranch:path/to/myfile.txt > path/to/myfile.txt verwendet die Standard-Shell-Umleitung. Wenn Sie PowerShell verwenden, könnte es Probleme mit der Textkodierung geben oder Sie könnten eine defekte Datei erhalten, wenn sie binär . Mit git restore Das Ändern von Dateien erfolgt ausschließlich durch den git ausführbar.

96voto

lkraav Punkte 2566

Bei einer ähnlichen Suche bin ich auf diese Frage gestoßen. In meinem Fall ging es darum, eine Datei aus einem anderen Zweig in das aktuelle Arbeitsverzeichnis zu extrahieren, das sich vom ursprünglichen Speicherort der Datei unterscheidet. Antwort :

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

56voto

RzR Punkte 2944

Verwenden Sie die Zur Kasse Befehl:

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

36voto

  1. Stellen Sie sicher, dass Sie sich in der Verzweigung befinden, in der Sie eine Kopie der Datei benötigen.

    Zum Beispiel: Ich möchte, dass die Datei des Unterzweigs im Master ist, also muss sie ausgecheckt werden oder sollte im Master sein git checkout master

  2. Checken Sie nun die gewünschte Datei aus dem Unterzweig in Meister ,

     git checkout sub_branch file_path/my_file.ext

    Aquí sub_branch bedeutet, wo sich die zu kopierende Datei befindet, gefolgt von dem Dateinamen, den Sie kopieren müssen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X