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 ein automatisches Format durchgeführt, gah), und es wäre einfach einfacher, auf die neue Version im anderen Zweig zu wechseln, und Fügen Sie dann meinen einzeiligen Wechsel erneut ein, nachdem Sie ihn in meinen Zweig übernommen haben.
Also, was ist der einfachste Weg in Git, dies zu tun?
git
git-branch
branching-and-merging
Madlep
quelle
quelle
Antworten:
Führen Sie dies in dem Zweig aus, in dem die Datei enden soll:
Allgemeine Formeln:
Einige Anmerkungen (aus Kommentaren):
myfile.txt
undmydir
eine Alternative:
quelle
''
damit sie nicht von der Shell interpretiert werden.Bei dieser Frage bin ich auf eine ähnliche Suche gestoßen. In meinem Fall wollte ich eine Datei aus einem anderen Zweig in das aktuelle Arbeitsverzeichnis extrahieren, das sich vom ursprünglichen Speicherort der Datei unterscheidet. Antwort :
quelle
git diff <other branch> <path to file>
funktioniert gut.Was ist mit dem Checkout-Befehl:
quelle
git diff
unterstützt ein--stat
Argument, das im Grunde dasselbe tut wie diffstat.1) Stellen Sie sicher, dass Sie sich in einem Zweig befinden, in dem Sie eine Kopie der Datei benötigen. Zum Beispiel: Ich möchte eine Unterverzweigungsdatei im Master, also müssen Sie auschecken oder sollten im Master sein
git checkout master
2) Jetzt checken Sie nur eine bestimmte Datei aus, die Sie vom Unterzweig in den Master haben möchten.
Hier
sub_branch
bedeutet, wo Sie diese Datei haben, gefolgt von dem Dateinamen, den Sie kopieren müssen.quelle
Nach der Antwort von madlep können Sie mit dem Verzeichnis-Blob auch einfach ein Verzeichnis aus einem anderen Zweig kopieren.
Was die Frage der Operation betrifft, wenn Sie dort nur eine Datei geändert haben, funktioniert dies einwandfrei ^ _ ^
quelle
origin/other-branch
für den Verweis auf den Repo-Zweig verwendet werden müssen. Grundlagen, aber mich gebissen. (Die Antwort ist großartig - keine Bearbeitung erforderlich)Ich würde verwenden
git restore
(verfügbar seit Git 2.23)git restore --source otherbranch path/to/myfile.txt
Warum ist es besser als andere Optionen?
git checkout otherbranch -- path/to/myfile.txt
- Es kopiert die Datei in das Arbeitsverzeichnis, aber auch in den Staging-Bereich (ähnlicher Effekt, als würden Sie diese Datei manuell kopieren und darauf ausführengit add
).git restore
Berührt den Staging-Bereich nicht (es sei denn, Sie werden dazu aufgefordert--staged
).git show otherbranch:path/to/myfile.txt > path/to/myfile.txt
Verwendet die Standard-Shell-Umleitung. Wenn Sie Powershell verwenden, liegt möglicherweise ein Problem mit der Textbindung vor, oder Sie können eine fehlerhafte Datei erhalten, wenn diese binär ist . Beimgit restore
Ändern von Dateien erfolgt alles pergit
ausführbarer Datei.Ein weiterer Vorteil ist, dass Sie den gesamten Ordner wiederherstellen können mit:
git restore --source otherbranch path/to
oder mit,
git restore --overlay --source otherbranch path/to
wenn Sie das Löschen von Dateien vermeiden möchten. Wenn beispielsweise weniger Dateienotherbranch
als im aktuellen Arbeitsverzeichnis vorhanden sind (und diese Dateien nachverfolgt werden ), werden diese ohne--overlay
Optiongit restore
gelöscht. Aber dies ist ein gutes Standardverhalten. Sie möchten höchstwahrscheinlich, dass der Status des Verzeichnisses der gleiche ist wie inotherbranch
, nicht "der gleiche, aber mit zusätzlichen Dateien in meinem aktuellen Zweig".quelle
git restore
Möglichkeit, eine Datei aus dem Quellzweig in eine neue Datei im Zielzweig zu kopieren ? Mit git show kann ich dies mit der Shell-Umleitung (git show otherbranch:path/to/file1.txt > path/to/file2.txt
) tun , aber ich möchte die Shell-Umleitung aus den von Ihnen genannten Gründen vermeiden.git restore
(aber wer weiß;)). Diese Umleitungsprobleme sind im Grunde genommen ein Powershell-Problem, nicht sicher, ob es eine andere Shell gibt, die ein Problem damit hat. Normalerweise gehe ich zurück zu "git bash" oder sogar "cmd", wo ich "git show
with redirection" -Befehle verwenden muss. Oder verwenden Sie eine grafische Benutzeroberfläche wie GitExtensions, in der Sie den Dateibaum des Commits durchsuchen und in einer beliebigen Datei auf "Speichern unter" klicken können.Bitte beachten Sie, dass in der akzeptierten Antwort die erste Option die gesamte Datei aus dem anderen Zweig (wie ausgeführt) inszeniert
git add ...
und dass die zweite Option nur zum Kopieren der Datei führt, die Änderungen jedoch nicht inszeniert (als ob Sie dies getan hätten) habe die Datei einfach manuell bearbeitet und hatte herausragende Unterschiede).Git-Kopierdatei aus einem anderen Zweig, ohne sie zu inszenieren
Änderungen inszeniert (zB
git add filename)
:Ausstehende Änderungen (nicht inszeniert oder festgeschrieben):
quelle