Synchronisieren eines lokalen Git-Repositorys mit einem Remote-Repository

297

Ich möchte mein lokales Repository mit einem Remote-Repository synchronisieren, damit mein lokales Repository zu 100% eine Kopie des Remote-Repositorys wird. Wenn sich bestimmte Dateien in diesen Repositorys unterscheiden, überschreiben wir die lokalen Dateien mit den Remote-Repositorys, sofern vorhanden Dateien in lokalen Repositorys, die nicht auf der Fernbedienung vorhanden sind, werden die lokalen Dateien entfernt.

Gibt es eine andere Möglichkeit, dies zu erreichen, als einen neuen Klon des Remote-Repositorys zu erstellen?

Ähnliche Frage wie Sync local git repo mit remote in einem Schuss, wobei lokale Änderungen / Commits verworfen werden .

Axl
quelle
4
Immer wenn ich hierher komme, suche ich nach einer Gabel synchronisieren
Martin Thoma
1
git fetch --prune
hassanzadeh.sd

Antworten:

342
git fetch --prune

-p, --prune
Entfernen Sie nach dem Abrufen alle Fernverfolgungszweige, die auf der Fernbedienung nicht mehr vorhanden sind. Optionen beschneiden

jobwat
quelle
6
Das habe ich gesucht! PS Das nächste Mal werde ich Manpages genauer lesen, bevor ich Stackoverflow grabe :-)
Sergiy Sokolenko
5
Ja, git pull -pmacht das gleiche - 'git pull führt git fetch mit den angegebenen Parametern aus und ruft git merge auf, um die abgerufenen Verzweigungsköpfe in der aktuellen Verzweigung zusammenzuführen' - git-scm.com/docs/git-pull
jobwat
2
Verwenden Sie diese Option git fetch <remote> --prune, falls jemand nur eine --prunebestimmte Fernbedienung benötigt. z.B. git fetch upstream --prune.
Fery Wardiyanto
git fetch origin --pruneum Ihr lokales Repo mit Ihrer Abzweigung eines upstreamProjekts zu synchronisieren
Stuart Cardall
2
@SergiySokolenko das ist, was wir alle sagen, aber tief im Inneren wissen wir, dass SO bequemer geworden ist als Manpages :-P
Marcello Romani
144

Diese Schritte werden es tun:

git reset --hard HEAD
git clean -f -x -d -n

dann ohne -n

Dadurch werden alle lokalen Änderungen berücksichtigt. Jetzt die Commits ...

git status

und beachten Sie die Zeile wie:

Your branch is ahead of 'xxxx' by N commits.

Notieren Sie sich jetzt die Nummer 'N':

git reset --hard HEAD~N
git pull

und schlussendlich:

git status

sollte nichts zum Hinzufügen / Festschreiben anzeigen. Alles sauber.

Ein frischer Klon kann jedoch dasselbe tun (ist jedoch sehr langsam).

=== Aktualisiert ===

Da sich mein Git-Wissen im Laufe der Zeit leicht verbessert hat, habe ich mir einen weiteren einfacheren Weg ausgedacht, um dasselbe zu tun. Hier ist wie (#mit Erklärung). Während Sie in Ihrer Arbeitsbranche sind:

git fetch # This updates 'remote' portion of local repo. 
git reset --hard origin/<your-working-branch>
# this will sync your local copy with remote content, discarding any committed
# or uncommitted changes.

Obwohl Ihre lokalen Commits und Änderungen danach nicht mehr sichtbar sind, können Sie bei Bedarf festgeschriebene Änderungen wiederherstellen.

FractalSpace
quelle
1
Vielen Dank für das Update funktioniert einwandfrei mit Github und Bitbucket :)
CommonSenseCode
Diese Antwort war für mich die zuverlässigste Lösung.
AlanH
95

Sie müssen verstehen, dass ein Git-Repository nicht nur ein Baum von Verzeichnissen und Dateien ist, sondern auch einen Verlauf dieser Bäume speichert - die möglicherweise Zweige und Zusammenführungen enthalten.

Beim Abrufen aus einem Repository kopieren Sie alle oder einige der Zweige dort in Ihr Repository. Diese befinden sich dann in Ihrem Repository als "Remote-Tracking-Zweige", z. B. Zweige mit dem Namen " remotes/origin/masteroder".

Durch das Abrufen neuer Commits aus dem Remote-Repository wird nichts an Ihrer lokalen Arbeitskopie geändert.

In Ihrer Arbeitskopie wird normalerweise ein Commit ausgecheckt, das aufgerufen wird HEAD. Dieses Commit ist normalerweise die Spitze einer Ihrer lokalen Niederlassungen.

Ich denke, Sie möchten Ihren lokalen Zweig (oder vielleicht alle lokalen Zweige?) Auf den entsprechenden Remote-Zweig aktualisieren und dann den neuesten Zweig überprüfen.

Um Konflikte mit Ihrer Arbeitskopie (die möglicherweise lokale Änderungen aufweisen) zu vermeiden, bereinigen Sie zunächst alles, was nicht versioniert ist (mit git clean). Anschließend checken Sie den lokalen Zweig aus, der dem Remote-Zweig entspricht, auf den Sie aktualisieren möchten, und git resetwechseln mit diesem zum abgerufenen Remote-Zweig. ( git pullIntegriert alle Aktualisierungen des Remote-Zweigs in Ihren lokalen Zweig, die möglicherweise dasselbe tun, oder erstellt ein Zusammenführungs-Commit, wenn Sie lokale Commits haben.)

(Aber dann verlieren Sie wirklich alle lokalen Änderungen - sowohl in der Arbeitskopie als auch in lokalen Commits. Stellen Sie sicher, dass Sie dies wirklich wollen - andernfalls verwenden Sie besser einen neuen Zweig, dies speichert Ihre lokalen Commits. Und verwenden Sie diese Option git stash, um Änderungen zu speichern, die noch nicht festgeschrieben sind .)


Bearbeiten: Wenn Sie nur einen lokalen Zweig haben und einen Remote-Zweig verfolgen, müssen Sie nur etwas tun

git pull

aus dem Arbeitsverzeichnis.

Dadurch wird die aktuelle Version aller nachverfolgten Remote-Zweige abgerufen und der aktuelle Zweig (und das Arbeitsverzeichnis) auf die aktuelle Version des Remote-Zweigs aktualisiert, den er verfolgt.

Paŭlo Ebermann
quelle
Wenn ich NICHTS in meinem lokalen Repository ändere, möchte nur a.) Eine Kopie von allem von der Fernbedienung haben und b.) Eine Möglichkeit haben, Unterschiede zwischen den Versionen anzuzeigen. Also ich verpflichte mich NICHT, nichts zu ändern = keine lokalen Updates / Änderungen. Welche Befehle sollte ich regelmäßig (z. B. jede Woche oder so) verwenden, um die beiden oben genannten Funktionen zu erreichen? Bitte antworte KISS (Keep It Simple Stupid) - ich bin auch ein Idiot, und ofc wird RTFM - aber für den Anfang brauche ich Hilfe. ;)
Kobame
In Ihrem einfachen Fall git pullsollte a genug sein, denke ich. (Ich habe die Antwort aktualisiert.)
Paŭlo Ebermann
Was ist, wenn ich einige lokale Änderungen habe, die ich nicht übernehmen möchte? Wenn ich jetzt ziehe, heißt es, ich soll sie verpflichten oder verstauen. Wie kann ich in diesem Fall git anweisen, diese zu überschreiben und den Pull auszuführen?
Harshana
89

Du willst machen

git fetch --prune origin
git reset --hard origin/master
git clean -f -d

Dadurch ist Ihr lokales Repo genau wie Ihr Remote-Repo.

Denken Sie daran, Ursprung und Master durch die Fernbedienung und den Zweig zu ersetzen, mit denen Sie synchronisieren möchten.

aandis
quelle
2
Außerdem werden alle Verzeichnisse aus der npm-Installation und der Bower-Installation entfernt. Dies wird nur empfohlen, wenn Sie alle Abhängigkeiten in .gitignore
chwagssd
Es hat meine nicht entfernt node_modules, es funktioniert genau so, wie ich es will.
Vahid Amiri
WARNUNG: Es entfernt nicht verfolgte Dateien
Amit Yadav
Ich habe alle meine Daten mit diesem Code verloren und versucht, mein lokales Repository mit dem Git-Repository zu synchronisieren. Mein globales Repository wurde jedoch mit meinem lokalen Repository synchronisiert.
Zahid Khan
10

Setzen Sie das lokale Repository zurück und synchronisieren Sie es mit dem Remote-Zweig

Der Befehl: Denken Sie daran, Ursprung und Master durch die Fernbedienung und den Zweig zu ersetzen, mit denen Sie synchronisieren möchten.

git fetch origin && git reset --hard origin/master && git clean -f -d

Oder Schritt für Schritt:

git fetch origin
git reset --hard origin/master
git clean -f -d

Ihre lokale Niederlassung ist jetzt eine exakte Kopie (Commits und alle) der Remote-Niederlassung.

Befehlsausgabe:

Hier ist ein Beispiel für die Ausführung des Befehls auf einem lokalen Klon des Forge a Git-Repositorys.

sharkbook:forge lbaxter$ git fetch origin && git reset --hard origin/master && git clean -f -d
HEAD is now at 356cd85 FORGE-680
Removing forge-example-plugin/
Removing plugin-container-api/
Removing plugin-container/
Removing shell/.forge_settings
sharkbook:forge lbaxter$
Mahendra Pratap
quelle
4

(Diese Informationen stammen aus dem Git-Benutzerhandbuch. )

Ich lerne auch, daher ist dies möglicherweise keine genaue Antwort auf die Frage, aber es kann jemandem helfen:

  1. Wenn ein Remote-Repository zum ersten Mal geklont wird, werden Kopien aller Zweige in Ihrem lokalen Repository gespeichert (anzeigen mit git branch -r).
  2. Verwenden Sie diese Option, um diese Kopien zu aktualisieren und aktuell zu machen (dh sie mit dem Remote-Zweig zu synchronisieren) git fetch . Dies wirkt sich nicht auf vorhandene, benutzerdefinierte Zweige aus.
  3. Um Ihre lokale Zweigstelle zu überschreiben, wird eine neue Version der Zweigstelle, an der Sie gerade arbeiten (vorausgesetzt, Sie haben sie bereits ausgeführt git add origin /path/to/repository) git checkout origin/branch_name, überschrieben. Dadurch werden die Änderungen Ihrer lokalen Zweigstellen überschriebenbranch_name
tjb
quelle
3

Klingt so, als wollten Sie einen Spiegel des Remote-Repositorys:

git clone --mirror url://to/remote.git local.git

Dieser Befehl erstellt ein nacktes Repository. Wenn Sie kein nacktes Repository möchten, werden die Dinge komplizierter.

Richard Hansen
quelle
3

Wenn Sie über das Synchronisieren eines gegabelten Repos sprechen, können Sie diese Schritte ausführen.

So synchronisieren Sie ein Fork-Repository von git

  1. Überprüfen Sie Ihren aktuellen Git-Zweig

    git branch

  2. Kasse zum Master, wenn Sie nicht am Master sind

    git checkout master

  3. Rufen Sie das Upstream-Repository ab, wenn Sie über die richtigen Zugriffsrechte verfügen

    git fetch upstream

  4. Wenn der folgende Fehler auftritt, führen Sie ihn aus

    git remote add upstream [email protected]:upstream_clone_repo_url/xyz.git

    fatal: 'upstream/master' does not appear to be a git repository  
    fatal: Could not read from remote repository.
    Please make sure you have the correct access rights and the repository exists.
    
  5. Führen Sie nun den folgenden Befehl aus.

    git fetch upstream

  6. Wenn Sie nun auf Master sind, führen Sie den Upstream / Master in den Master-Zweig ein

    git merge upstream/master

    Das ist es!!

    Crosscheck per git remoteBefehl, genauergit remote -v

    Wenn ich auch Commit-Rechte für das Upstream-Repo habe, kann ich eine lokale Upstream-Niederlassung erstellen und Arbeiten ausführen, die dort Upstream werden.

Nishant Upadhyay
quelle
Warum sollte ich 5.git Fetch Upstream machen, wenn ich bereits im dritten Schritt einen Fehler darin bekomme?
Md Sifatul Islam
-2

Sie können dafür Git-Hooks verwenden . Erstellen Sie einfach einen Hook, der nach einem Update Änderungen am anderen Repo vornimmt.

Natürlich kann es zu Zusammenführungskonflikten kommen, sodass Sie herausfinden müssen, wie Sie damit umgehen sollen.

Makis
quelle