Zurücksetzen lokalen Repository Zweig zu sein wie Remote-Repository HEAD
Frage
Wie kann ich eine lokale Niederlassung zurückgesetzt ebenso wie die Niederlassung auf der Remote-Repository sein?
Ich habe:
git reset --hard HEAD
Aber wenn ich laufe eine git status
,
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: java/com/mycompany/TestContacts.java
modified: java/com/mycompany/TestParser.java
Können Sie mir bitte sagen, warum ich diese ‚geändert‘? Ich habe diese Dateien nicht berührt? Wenn ich das täte, möchte ich diejenigen entfernen.
Lösung
Einstellung Ihre Branche genau den Remote-Zweig entsprechen kann in zwei Schritten erfolgen:
git fetch origin
git reset --hard origin/master
Wenn Sie Ihren aktuellen Zweig des Staates zu retten, bevor dies zu tun (nur für den Fall), können Sie tun:
git commit -a -m "Saving my work, just in case"
git branch my-saved-work
Jetzt ist Ihre Arbeit auf dem Zweig „my-saved-Arbeit“ für den Fall gespeichert Sie entscheiden, Sie wollen zurück (oder um es betrachten wollen später oder es gegen Ihre aktualisierte Zweig diff).
Hinweis, dass das erste Beispiel geht davon aus, dass die Name der Remote-Repo ist „Ursprung“ und dass der Zweig namens „Master“ in der Remote-Repo entspricht die derzeit abgemeldeten Niederlassung in Ihrem lokalen Repo.
BTW, diese Situation, dass Sie in sieht sehr viel wie ein gewöhnlicher Fall, in dem ein Vorstoß in den derzeit ausgecheckt Zweig eines nicht-bare Repository getan wurde. Haben Sie kürzlich schieben und in Ihrem lokalen Repo? Wenn nicht, dann keine Sorgen - etwas anderes müssen diese Dateien unerwartet verursacht haben zu veränderten enden. Andernfalls sollten Sie sich bewusst sein, dass es nicht in einen nicht-bare Repository zu schieben empfohlen (und nicht in den aktuell ausgecheckten Zweig, insbesondere).
Andere Tipps
Ich brauchte (die Lösung in der akzeptierten Antwort) zu tun:
git fetch origin
git reset --hard origin/master
Gefolgt von:
git clean -f
Um zu sehen, welche Dateien entfernt werden (ohne sie tatsächlich zu entfernen):
git clean -n -f
zunächst wieder auf den zuvor geholten HEAD
des entsprechenden stromaufwärtigen Zweig:
git reset --hard @{u}
Der Vorteil @{u}
oder seine ausführliche Form @{upstream}
Angabe ist, dass der Name der Remote-Repo und Zweiges muß nicht explizit angegeben werden.
Als nächste nach Bedarf entfernen untracked Dateien, optional auch mit -x
:
git clean -df
Schließlich, je nach Bedarf, die neusten Änderungen:
git pull
git reset --hard HEAD
tatsächlich setzt nur auf den letzten engagierten Zustand. In diesem Fall HEAD bezieht sich auf den Kopf Ihrer Branche.
Wenn Sie mehrere Commits haben, wird dies nicht funktionieren ..
Was Sie wahrscheinlich tun wollen, wird wieder auf den Kopf des Ursprungs- oder was auch immer Sie Remote-Repository genannt wird. Ich würde wahrscheinlich nicht nur so etwas wie
git reset --hard origin/HEAD
Seien Sie aber vorsichtig. Hard-Resets kann nicht einfach rückgängig gemacht werden. Es ist besser, zu tun, wie Dan vermuten läßt, und eine Kopie der Änderungen abzweigen vor dem Zurücksetzen.
Alle oben schon sagt recht, aber oft zu wirklich setzen Sie Ihr Projekt, müssen Sie auch noch Dateien entfernen, die in Ihrem .gitignore
sind.
Um das moralische Äquivalent von zu erhalten Löschen Projektverzeichnis und Re-Klonen aus der Fernbedienung ist:
git fetch
git reset --hard
git clean -x -d -f
Warnung . git clean -x -d -f
ist irreversible und Sie können Dateien und Daten verloren gehen (zum Beispiel Dinge, die Sie haben mit .gitignore
ignoriert)
Die Frage mischt zwei Fragen hier:
- , wie eine lokale Niederlassung auf den Punkt zurückzustellen, wo die Fernbedienung ist
- , wie Sie Ihren Staging-Bereich löschen (und möglicherweise das Arbeitsverzeichnis), so dass
git status
sagtnothing to commit, working directory clean.
Die One-Stop-Antwort lautet:
-
git fetch --prune
(optional) Aktualisiert die lokale Momentaufnahme der Remote-Repo. Weitere Befehle sind nur lokal.
git reset --hard @{upstream}
Setzt der lokale Niederlassung Hinweis darauf, wo die Momentaufnahme des entfernt ist, sowie der Index und das Arbeitsverzeichnis zu den Akten, dass begehen. -
git clean -d --force
Entfernt untracked Dateien und Verzeichnisse, die git behindern, zu sagen „Arbeitsverzeichnis clean“.
Das ist etwas, das ich regelmäßig Gesicht, und ich habe das Skript generali Wolfgang oben mit jedem Zweig
arbeitet vorgesehenIch habe auch eine „sind Sie sicher,“ prompt, und ein Feedback-Ausgang
#!/bin/bash
# reset the current repository
# WF 2012-10-15
# AT 2012-11-09
# see http://stackoverflow.com/questions/1628088/how-to-reset-my-local-repository-to-be-just-like-the-remote-repository-head
timestamp=`date "+%Y-%m-%d-%H_%M_%S"`
branchname=`git rev-parse --symbolic-full-name --abbrev-ref HEAD`
read -p "Reset branch $branchname to origin (y/n)? "
[ "$REPLY" != "y" ] ||
echo "about to auto-commit any changes"
git commit -a -m "auto commit at $timestamp"
if [ $? -eq 0 ]
then
echo "Creating backup auto-save branch: auto-save-$branchname-at-$timestamp"
git branch "auto-save-$branchname-at-$timestamp"
fi
echo "now resetting to origin/$branchname"
git fetch origin
git reset --hard origin/$branchname
Hier ist ein Skript, das, was Antwort der beliebtesten automatisiert schlägt ... Siehe https://stackoverflow.com/a/13308579/1497139 für eine verbesserte Version, die Zweige unterstützt
#!/bin/bash
# reset the current repository
# WF 2012-10-15
# see https://stackoverflow.com/questions/1628088/how-to-reset-my-local-repository-to-be-just-like-the-remote-repository-head
timestamp=`date "+%Y-%m-%d-%H_%M_%S"`
git commit -a -m "auto commit at $timestamp"
if [ $? -eq 0 ]
then
git branch "auto-save-at-$timestamp"
fi
git fetch origin
git reset --hard origin/master
Vorausgesetzt, dass die Remote-Repository origin
ist, und dass Sie Interesse an branch_name
:
git fetch origin
git reset --hard origin/<branch_name>
Auch Sie gehen für den aktuellen Zweig der origin
zurückgesetzt HEAD
.
git fetch origin
git reset --hard origin/HEAD
Wie es funktioniert:
git fetch origin
lädt die neueste aus der Ferne, ohne zu versuchen, etwas zu fusionieren oder rebase.
Dann setzt der git reset
den <branch_name>
Zweig zu dem, was Sie gerade geholt. Die --hard
Option ändert alle Dateien in Ihrem Arbeitsbaum die Dateien in origin/branch_name
entsprechen.
Ich habe:
git branch -D master
git checkout master
auf total Reset Zweig
Notiz, sollten Sie zu einem anderen Zweig Kasse zu können, benötigten Zweig löschen
Wenn Sie ein Problem hatten wie ich, dass Sie bereits einige Änderungen begangen, aber jetzt aus irgendeinem Grund möchten Sie vielleicht, um es loszuwerden, der schnellste Weg ist git reset
wie folgt zu verwenden:
git reset --hard HEAD~2
Ich hatte 2 nicht verpflichtet erforderlich, damit die Zahl 2. Sie es zu Ihrer eigenen Zahl der Commits ändern können zurückgesetzt werden.
Ihre Frage so zu beantworten - wenn Sie 5 verpflichtet vor Remote-Repository HEAD, sollten Sie diesen Befehl ausführen:
git reset --hard HEAD~5
Beachten Sie, dass Sie die Änderungen verlieren Sie gemacht haben, so seien Sie vorsichtig!
Dies ist, was ich oft:
git fetch upstream master;
git reset --hard upstream/master;
git clean -d --force;
Beachten Sie, dass es gute Praxis ist nicht zu Änderungen an Ihrem lokalen Master, sondern Kasse zu einem anderen Zweig für jede Änderung, mit dem Zweignamen durch die Art der Veränderung vorangestellt, z.B. feat/
, chore/
, fix/
usw. So müssen Sie nur Änderungen zu ziehen, drücken Sie keine Änderungen vom Master. Das Gleiche gilt für andere Branchen, die andere tragen zu. So sollte die obige nur verwendet werden, wenn Sie Änderungen geschehen begehen zu einem Zweig, die andere begangen haben, und müssen zurückgesetzt werden. Ansonsten in Zukunft vermeiden zu einem Zweig drängen, die andere schieben zu, anstatt Kasse und den genannten Zweig über den ausgecheckt Zweig drücken.
Wenn Sie Ihre lokale Niederlassung auf den neuesten begehen in der Upstream-Zweig zurückzustellen, was für mich so weit ist:
Ihre Fernbedienungen Überprüfen Sie, stellen Sie sicher, dass vor und Herkunft sind, was Sie erwarten, wenn auch nicht so verwenden Sie dann git remote add upstream <insert URL>
erwartet, z.B. des ursprünglichen GitHub Repo, die Sie aus gegabelt 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 den Zweig mit dem gleichen Namen wie die lokalen einer Kasse, um die Arbeit dort zu speichern, obwohl dies nicht notwendig ist, wenn die Ursprünge entwickeln die gleichen Änderungen wie der lokalen saved-Arbeitszweig. Ich bin mit dem Zweig als Beispiel entwickeln, aber es kann ein bestehender Zweigname sein.
git add .
git commit -m "Reset to upstream/develop"
git push --force origin develop
Dann, wenn Sie diese Änderungen mit einem anderen Zweig zusammenführen müssen, während wo es Konflikte gibt, entwickeln die Änderungen bei der Erhaltung, Nutzung:
git merge -s recursive -X theirs develop
Während der Verwendung
git merge -s recursive -X ours develop
branch_name entgegenstehender Änderungen zu bewahren. Andernfalls bitte einen mergetool mit git mergetool
verwenden.
Mit all den Ä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 anstelle von Upstream / entwickeln Sie einen Hash-commit verwenden könnte, andere Zweignamen usw. ein CLI-Tool wie Oh My Zsh können Sie überprüfen, ob Ihr Zweig grün ist, was anzeigt, dass es nichts zu begehen und das Arbeitsverzeichnis ist sauber (was oder auch überprüfbar durch git status
bestätigt wird). Beachten Sie, dass dies tatsächlich add Commits zu entwickeln, um Upstream-Vergleich, wenn es etwas von einem automatisch hinzugefügt wird, verpflichten, z.B. UML-Diagramme, Lizenz-Header usw., so dass in diesem Fall könnten Sie dann die Änderungen auf origin develop
ziehen, um upstream develop
, wenn nötig.
Wenn Sie zurück zum HEAD
Zustand gehen wollen sowohl für das Arbeitsverzeichnis und den Index, git reset --hard HEAD
Sie sollten dann, anstatt zu HEAD^
. (Dies könnte ein Tippfehler gewesen, genau wie die einzelnen im Vergleich zu Doppelstrich für --hard
.)
Wie für Ihre spezifische Frage, warum diese Dateien in dem Status erscheinen als geändert, es sieht aus wie vielleicht haben Sie ein Soft-Reset statt ein Hard-Reset. Dies bewirkt, dass die Dateien, die in den HEAD
geändert wurden begehen erscheinen, als ob sie inszeniert wurden, das ist wahrscheinlich, was Sie sehen hier.
Vorherige Antworten nehmen an, dass der Zweig zurückgesetzt werden wird der aktuelle Zweig (ausgecheckt). In Kommentaren, OP hap497 stellte klar, dass der Zweig in der Tat ausgecheckt ist, wird aber nicht explizit von der ursprünglichen Frage erforderlich. Da zumindest ein „Duplikat“ Frage, zurücksetzen vollständig Repository Zustand , das ist nicht davon ausgehen, dass der Zweig ausgecheckt, ist hier eine Alternative:
Wenn Zweig "mybranch" ist nicht zur Zeit, ausgecheckt es auf Remote-Zweig zurücksetzen "MyRemote / mybranch" 's Kopf, können Sie diese low-level Befehl:
git update-ref refs/heads/mybranch myremote/mybranch
Dieses Verfahren läßt den ausgecheckt Zweig, wie es ist, und der Arbeits Baum unberührt. Es bewegt sich einfach mybranch Kopf zu einem anderen zu begehen, was als zweites Argument angegeben wird. Dies ist besonders hilfreich, wenn mehrere Zweige müssen neue Remote Heads aktualisiert werden.
Seien Sie vorsichtig, wenn dies zu tun, aber, und verwendet gitk
oder ein ähnliches Werkzeug zu überprüfen Quelle und Ziel. Wenn Sie versehentlich dies auf den aktuellen Zweig (und git werden Sie nicht von diesem halten), können Sie verwirrt werden, weil der neue Zweig Inhalt nicht den Arbeits Baum übereinstimmt, die nicht (habe ändern zu beheben, aktualisieren Sie wieder den Zweig, wo es vorher war).
Bitte versuchen Sie brüllen Befehle, Its werden alle untracked Datei aus lokalen git entfernen zu
git fetch origin
git reset --hard origin/master
git clean -d -f
Kein Betrag der Rückstellung und Reinigung schien keine Auswirkung auf untracked und geänderte Dateien in meiner lokalen Git-Repo zu haben (ich über alle Optionen ausprobiert). Meine einzige Lösung dieses Problems war die lokale Repo und Wieder Klon von dem remote rm.
Zum Glück habe ich keine anderen Zweige habe ich über betreut.
Die einzige Lösung, die in allen Fällen funktioniert, die ich gesehen habe, ist zu löschen und Reklone. Vielleicht ist es eine andere Möglichkeit, aber offensichtlich diese Art und Weise läßt keine Chance aus altem Zustand dort gelassen werden, so dass ich es lieber. Bash Einzeiler Sie können als Makro einstellen, wenn Sie häufig durcheinander zu bringen in git:
REPO_PATH=$(pwd) && GIT_URL=$(git config --get remote.origin.url) && cd .. && rm -rf $REPO_PATH && git clone --recursive $GIT_URL $REPO_PATH && cd $REPO_PATH
* übernimmt Ihre .git Dateien nicht korrupt sind
Wenn Sie nichts dagegen haben Ihre lokalen Änderungen zu speichern, noch wollen immer noch das Repository aktualisieren Herkunft / HEAD übereinstimmen, können Sie einfach Ihre lokalen Änderungen verstauen und dann ziehen:
git stash
git pull
Wenn Sie die aktuellen Änderungen verwendet werden soll später dann die Änderungen bunkern andere weise können Sie diese beiden Befehle verwenden,
git fetch origin
git reset --hard origin/master