Wie kann ich Dateien von der Fernbedienung abrufen, ohne lokale Dateien zu überschreiben?

112

Ich versuche, ein neues Git-Repo für ein bereits vorhandenes Remote-Repo einzurichten.

Ich möchte, dass meine lokalen Dateien das Remote-Repo überschreiben, aber Git sagt, dass ich diese Remote-Dateien zuerst ziehen und zusammenführen muss.

Gibt es eine Möglichkeit zum Abrufen, aber stellen Sie sicher, dass die lokalen Dateien nicht von der Fernbedienung überschrieben werden?

Joe Isaacson
quelle

Antworten:

181

Nun ja und nein ...

Ich verstehe, dass Sie möchten, dass Ihre lokalen Kopien die Inhalte der Fernbedienung "überschreiben", aber oh Mann, wenn jemand die Dateien im Remote-Repo auf andere Weise geändert hat und Sie ihre Änderungen einfach ignorieren und versuchen, "zu erzwingen". Ihre eigenen Änderungen ohne selbst suchen auf mögliche Konflikte, die ich für Sie (und Ihre Mitarbeiter) gut, weinen ;-)

Das heißt, es ist wirklich einfach, das "Richtige ..." zu tun.

Schritt 1:

git stash

in Ihrem lokalen Repo. Dadurch werden Ihre lokalen Updates im Stash gespeichert und Ihre geänderten Dateien wieder in den Vorbearbeitungsstatus zurückgesetzt.

Schritt 2:

git pull

um modifizierte Versionen zu erhalten. Hoffentlich werden dadurch keine neuen Versionen der Dateien angezeigt, über die Sie sich Sorgen machen. Wenn dies nicht der Fall ist, funktioniert der nächste Schritt reibungslos. Wenn es tut , dann haben Sie einige Arbeit zu erledigen, und Sie werden es nicht bereuen.

Schritt 3:

git stash pop

Dadurch werden Ihre modifizierten Versionen, die Sie in Schritt 1 versteckt haben, mit den Versionen zusammengeführt, die Sie gerade in Schritt 2 gezogen haben. Wenn alles reibungslos verläuft, sind Sie fertig!

Wenn andererseits echte Konflikte zwischen dem, was Sie in Schritt 2 vorgenommen haben, und Ihren Änderungen aufgetreten sind (aufgrund einer anderen Bearbeitung in der Zwischenzeit), werden Sie es herausfinden und aufgefordert, diese zu lösen. Tu es.

Auf diese Weise werden die Dinge viel besser laufen - es wird wahrscheinlich Ihre Änderungen beibehalten, ohne dass Sie wirklich daran arbeiten müssen, und Sie auf schwerwiegende Probleme aufmerksam machen.

Bob Gilmore
quelle
5
warum nicht nur git commitlokale Änderungen vor git pull?
Don Cheadle
10
Manchmal bin ich in der Lage, den Code nicht festzuschreiben, aber ich möchte ihn auf meinem lokalen Computer behalten. Diese Befehle sind hierfür sehr hilfreich.
Vargan
3
Dies ist nicht hilfreich, wenn Sie mehrere Dateien haben, einige, die Sie überschreiben möchten, und andere, die Sie nicht überschreiben möchten. Gibt es keine Möglichkeit, GIT anzuweisen, Dateien beim Ziehen zu ignorieren? Warum .gitignore funktioniert nur zum Schieben, ich verstehe diese Designentscheidung überhaupt nicht ...
Bobak Hashemi
25

Sie können Ihre lokalen Änderungen zuerst verstauen, dann ziehen und dann den Versteck öffnen.

git stash
git pull origin master
git stash pop

Alles, was Änderungen von Remote aus überschreibt, hat Konflikte, die Sie manuell lösen müssen.

Ryan Bigg
quelle
4
Ich habe diese Änderungen bereits lokal festgeschrieben, so dass es heißt, dass "keine lokalen Änderungen zu speichern sind"
Joe Isaacson
Ich denke, das ist die beste Strategie.
Jimmy Obonyo Abor
13

Sie haben also Ihre lokalen Änderungen in Ihr lokales Repository übernommen. Um Remote-Änderungen an Ihrem lokalen Repository zu erhalten, ohne Änderungen an Ihren lokalen Dateien vorzunehmen, können Sie diese verwenden git fetch. Eigentlich git pullist eine zweistufige Operation: eine zerstörungsfreie, git fetchgefolgt von a git merge. Siehe Was ist der Unterschied zwischen "Git Pull" und "Git Fetch"? für mehr Diskussion.

Detailliertes Beispiel:

Angenommen, Ihr Repository sieht folgendermaßen aus (Sie haben Änderungen vorgenommen test2:

* ed0bcb2 - (HEAD, master) test2
* 4942854 - (origin/master, origin/HEAD) first

Und das originRepository ist wie folgt (jemand anderes hat sich verpflichtet test1):

* 5437ca5 - (HEAD, master) test1
* 4942854 - first

Zu diesem Zeitpunkt wird sich git beschweren und Sie bitten, zuerst zu ziehen, wenn Sie versuchen, Ihr test2zu Remote-Repository zu pushen . Wenn Sie sehen möchten, was test1 ist, ohne Ihr lokales Repository zu ändern, führen Sie Folgendes aus:

$ git fetch

Ihr lokales Ergebnis-Repository würde folgendermaßen aussehen:

* ed0bcb2 - (HEAD, master) test2 
| * 5437ca5 - (origin/master, origin/HEAD) test1 
|/  
* 4942854 - first 

Jetzt haben Sie die Remote-Änderungen in einem anderen Zweig und behalten Ihre lokalen Dateien bei.

Was kommt dann als nächstes? Sie können a ausführen git merge, was den gleichen Effekt wie git pull(in Kombination mit dem vorherigen git fetch) hat, oder, wie ich es vorziehen würde, a ausführen, git rebase origin/masterum Ihre Änderung zusätzlich anzuwenden origin/master, wodurch Sie eine sauberere Historie erhalten.

Penghe Geng
quelle
danke, dass du git pull als zweistufigen git fetch / git merge erklärt
hast