Zurücksetzen lokalen Repository Zweig zu sein wie Remote-Repository HEAD

StackOverflow https://stackoverflow.com/questions/1628088

  •  06-07-2019
  •  | 
  •  

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.

War es hilfreich?

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

auf lokale Dateien entfernen

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:

  1. , wie eine lokale Niederlassung auf den Punkt zurückzustellen, wo die Fernbedienung ist
  2. , wie Sie Ihren Staging-Bereich löschen (und möglicherweise das Arbeitsverzeichnis), so dass git status sagt nothing to commit, working directory clean.

Die One-Stop-Antwort lautet:

  1. 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.
  2. 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 vorgesehen

Ich 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.

xkcd: Git

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top