Das verwende ich oft:
git fetch upstream develop;
git reset --hard upstream/develop;
git clean -d --force;
Beachten Sie, dass es eine gute Praxis ist, Änderungen nicht in Ihrem lokalen Master-/Entwicklungszweig vorzunehmen, sondern für jede Änderung in einen anderen Zweig auszuchecken, wobei dem Zweignamen die Art der Änderung vorangestellt wird, z. B. feat/
, chore/
, fix/
, usw. Sie müssen also nur Änderungen ziehen und keine Änderungen von Master pushen. Dasselbe gilt für andere Zweige, zu denen andere beitragen. Die obige Vorgehensweise sollte also nur verwendet werden, wenn Sie zufällig Änderungen in einen Zweig übertragen haben, zu dem andere beigetragen haben, und diese zurücksetzen müssen. Ansonsten vermeiden Sie es in Zukunft, in einen Zweig zu pushen, in den andere pushen, sondern checken Sie aus und pushen Sie in den besagten Zweig über den ausgecheckten Zweig.
Wenn Sie Ihren lokalen Zweig auf den letzten Commit im Upstream-Zweig zurücksetzen wollen, funktioniert das bei mir bisher wie folgt:
Überprüfen Sie Ihre Fernbedienungen und stellen Sie sicher, dass Ihr Upstream und Ihre Herkunft den Erwartungen entsprechen, wenn dies nicht der Fall ist, verwenden Sie git remote add upstream <insert URL>
z. B. des ursprünglichen GitHub-Repos, von dem Sie sich abgespalten haben, und/oder git remote add origin <insert URL of the forked GitHub repo>
.
git remote --verbose
git checkout develop;
git commit -m "Saving work.";
git branch saved-work;
git fetch upstream develop;
git reset --hard upstream/develop;
git clean -d --force
Auf GitHub können Sie auch die Verzweigung mit demselben Namen wie die lokale Verzweigung auschecken, um die Arbeit dort zu speichern, obwohl dies nicht notwendig ist, wenn die ursprüngliche Entwicklungsverzweigung dieselben Änderungen enthält wie die lokale Verzweigung, in der die Arbeit gespeichert wurde. Ich verwende den Zweig develop als Beispiel, aber es kann jeder existierende Zweigname sein.
git add .
git commit -m "Reset to upstream/develop"
git push --force origin develop
Wenn Sie dann diese Änderungen mit einem anderen Zweig zusammenführen müssen, während es irgendwelche Konflikte gibt, behalten Sie die Änderungen in develop bei:
git merge -s recursive -X theirs develop
Während der Verwendung
git merge -s recursive -X ours develop
um die widersprüchlichen Änderungen von branch_name zu erhalten. Andernfalls verwenden Sie ein Mergetool mit git mergetool
.
Mit allen Änderungen zusammen:
git commit -m "Saving work.";
git branch saved-work;
git checkout develop;
git fetch upstream develop;
git reset --hard upstream/develop;
git clean -d --force;
git add .;
git commit -m "Reset to upstream/develop";
git push --force origin develop;
git checkout branch_name;
git merge develop;
Beachten Sie, dass Sie anstelle von upstream/develop auch einen Commit-Hash, einen anderen Branch-Namen usw. verwenden können. Verwenden Sie ein CLI-Tool wie Oh My Zsh, um zu überprüfen, ob Ihr Zweig grün ist, was bedeutet, dass es nichts zu übertragen gibt und das Arbeitsverzeichnis sauber ist (was durch git status
). Beachten Sie, dass dies im Vergleich zur Upstream-Entwicklung zu zusätzlichen Commits führen kann, wenn irgendetwas automatisch durch einen Commit hinzugefügt wird, z.B. UML-Diagramme, Lizenz-Header, usw. In diesem Fall könnten Sie die Änderungen auf origin develop
a upstream develop
falls erforderlich.
18 Stimmen
Gemäß der Ausgabe von
git status
Ihr zweiter Befehlgit reset --hard HEAD
gescheitert. Allerdings haben Sie die Ausgabe nicht eingefügt. Unvollständige Frage.5 Stimmen
Sie vermischen hier zwei Themen: 1) wie man eine lokale Verzweigung auf den Punkt zurücksetzt, an dem sich die entfernte Verzweigung befindet, und 2) wie man den Staging-Bereich (und möglicherweise das Arbeitsverzeichnis) löscht, so dass
git status
sagtnothing to commit, working directory clean
. - Bitte angeben!3 Stimmen
Ist damit Ihre Frage beantwortet? Wie zwinge ich "git pull" dazu, lokale Dateien zu überschreiben?
0 Stimmen
Das ist natürlich keine Lösung, wenn das Projektarchiv groß ist, aber bei kleinen Projektarchiven kann man mit dem Hammer zuschlagen und Git ganz vermeiden:
rm -fr ./repo; git clone repo
. der beste Weg, den ich gefunden habe0 Stimmen
Du rettest mein Leben .... Ich liebe dich... Ich war Check-out zu einer anderen Filiale, die leer war... weder Check-out passieren... zu diesem Zeitpunkt meine 1 Woche Arbeit war weg... und keine Möglichkeit, ich kann Frist erreichen. Gott sei Dank!