Revert Änderungen an einer Datei in einem Commit
-
26-09-2019 - |
Frage
Ich mag Änderungen von einem bestimmten rückgängig zu nur zu einer bestimmten Datei zu begehen.
Kann ich git revert Befehl für das?
Eine andere einfache Möglichkeit, es zu tun?
Lösung
Die sauberste Art, wie ich dies zu tun gesehen habe beschrieben hier
git show some_commit_sha1 -- some_file.c | git apply -R
ähnlich wie VonC Antwort aber mit git show
und git apply
.
Andere Tipps
Unter der Annahme, ist es in Ordnung, die Geschichte begehen zu ändern, hier ist ein Workflow wieder Änderungen in einer einzigen Datei in einem früheren begehen:
Zum Beispiel wollen Sie Änderungen in 1 Datei wiederherzustellen (badfile.txt
) in aaa222
begehen:
aaa333 Good commit
aaa222 Problem commit containing badfile.txt
aaa111 Base commit
Rebase auf der Basis verpflichten, zu ergänzen, um das Problem zu begehen, und weiter.
1) Starten der interaktive Unterfütterungsmaterial:
git rebase -i aaa111
2) Markieren Sie das Problem für die Bearbeitung im Editor begehen, indem pick
zu e
(für die Bearbeitung zu ändern):
e aaa222
pick aaa333
3) Revert wechselt auf die schlechte Datei:
git show -- badfile.txt | git apply -R
4) die Änderungen speichern und ändern die commit:
git add badfile.txt
git commit --amend
5) Beenden Sie das Fütterungsmaterial:
git rebase --continue
git revert
wird für alle Datei Inhalte innerhalb Commits.
Für eine einzelne Datei, können Sie script es :
#!/bin/bash
function output_help {
echo "usage: git-revert-single-file <sha1> <file>"
}
sha1=$1
file=$2
if [[ $sha1 ]]; then
git diff $sha1..$sha1^ -- $file | patch -p1
else
output_help
fi
(Aus dem git-Shell-Skripte Dienstprogramme von smtlaissezfaire )
Hinweis:
eine andere Art und Weise ist hier beschrieben wenn Sie noch haben Ihre aktuelle Änderung zu übernehmen.
git checkout -- filename
git checkout
hat einige Optionen für eine Datei, die Datei von HEAD ändern, überschreiben Ihre Änderung.
Dropped.on.Caprica erwähnt in den Kommentaren :
Sie können einen Alias ??zu git hinzufügen, damit Sie
git revert-file <hash> <file-loc>
tun können und müssen, dass bestimmte Datei rückgängig gemacht werden.
Siehe dieser Kern .
[alias]
revert-file = !sh /home/some-user/git-file-revert.sh
Ich würde einfach die --no-commit
Option git-revert
verwenden und entfernen Sie die Dateien, die Sie nicht aus dem Index schließlich rückgängig gemacht werden sollen, bevor sie zu begehen. Hier ist ein Beispiel dafür, wie man leicht zurück wechselt nur die Änderungen an foo.c in den zweitletzten begehen:
$ git revert --no-commit HEAD~1
$ git reset HEAD
$ git add foo.c
$ git commit -m "Reverting recent change to foo.c"
$ git reset --hard HEAD
Die erste git-reset
„unstages“ alle Dateien, so dass wir dann wieder nur die eine Datei hinzufügen können wir rückgängig gemacht werden sollen. Der endgültige git-reset --hard
wird die verbleibenden Datei kehrt zu befreien, dass wir nicht halten wollen.
git reset HEAD^ path/to/file/to/revert/in/commit
Der obige Befehl Datei aus begehen nehmen, aber es wird in git status
widerspiegelt.
git checkout path/to/file/to/revert/in/commit
Der obige Befehl wird die Änderungen rückgängig machen (als Ergebnis Sie Datei gleichen wie HEAD erhalten).
git commit
(Pass --amend
zu ändern zu begehen.)
git push
Damit die die Datei bereits in der Commit wird entfernt und rückgängig gemacht.
Die oben genannten Schritte sollten von dem dem Zweig folgen, wo der Commit gemacht wird.
Viel einfacher:
git reset HEAD^ path/to/file/to/revert
dann
git commit --amend
und dann
git push -f
die Datei ist weg und begeht Hash, Nachricht, usw. ist das gleiche.
Sie können dieses Verfahren wie folgt vor:
-
git revert -n <*commit*>
(-n
revert alle Änderungen aber nicht verpflichten sie) -
git add <*filename*>
(Name der Datei / s Sie wollen zurückkehren & Festschreibung) -
git commit -m 'reverted message'
(fügen Sie eine Nachricht für die Rück) - , nachdem Sie die anderen Dateien zu begehen Änderungen verwerfen, so dass die Dateien Aufenthalt mit den Änderungen aktualisiert Sie vor dem revert begangen