Angenommen, ich habe meinen eigenen Zweig erstellt develop
branch und fileA ein paar Mal in ein paar Commits geändert, jetzt möchte ich nur diese Datei in den Zustand in zurückversetzen develop
(ohne meine anderen Änderungen rückgängig zu machen), gibt es eine einfache Möglichkeit, dies zu tun? (Ich weiß, ich könnte es auschecken develop
und in meinem Zweig überschreiben).
Vielen Dank!
Sie machen
git checkout develop -- <path/to/file>
Sie können nicht “zurücksetzen”, da dies auf einer Commit-für-Commit-Basis erfolgt (und nicht Datei für Datei). Es gibt aber zwei Alternativen. Sie können auswählen, was zu Ihnen passt. Nehmen wir an, die betreffende Datei ist quux.c
.
- Mach ein
git rebase -i
ab dem punkt wo du die abschneidest develop
verzweigen und dann die vorgenommenen Änderungen manuell rückgängig machen quux.c
seitdem in jedem Commit. Git schreibt die Commits so um, dass es so aussieht quux.c
wurde nie geändert develop
wurde geschnitten.
- Eine einfachere Route ist einfach zu sagen
git show master:quux.c > quux.c
. Dadurch wird überschrieben quux.c
mit der Version der Datei auf master
. Dann füge es hinzu und übertrage es. Dadurch wird ein zusätzliches “revert”-Commit erstellt, aber es ist einfacher als das obige.
Aktualisieren
Wie die anderen Antworten richtig zeigen, git checkout branch -- file
ist benutzerfreundlicher als die git show
Befehl, den ich hier erwähnt habe, obwohl der Effekt derselbe ist.
Siehe diese Links:
Wie rufe ich eine einzelne Datei aus einer bestimmten Revision in Git ab?
So erhalten Sie nur eine Datei aus einem anderen Zweig
git show source_branch:path/to/file > file
funktioniert gut, außer dass Sie, wie in der SO-Frage “Wie rufe ich eine einzelne Datei aus einer bestimmten Revision in Git?” beschrieben, den vollständigen Pfad aus dem Stammverzeichnis des Repos verwenden müssen.
Sie erhalten nur den neuesten Stand der Datei. Aber für git checkout oder git show können Sie tatsächlich auf jede gewünschte Revision verweisen, wie in der SO-Frage “git checkout revision of a file in git gui” veranschaulicht:
$ git show $REVISION:$FILENAME
$ git checkout $REVISION -- $FILENAME
wäre dasselbe, wenn $FILENAME ein vollständiger Pfad einer versionierten Datei ist.
$REVISION kann wie in git rev-parse gezeigt aussehen:
[email protected]{yesterday}:app.js # app.js as it was yesterday
experiment^:app.js # app.js on the first commit parent
[email protected]{2}:app.js # app.js two commits ago
usw.