Wann muss ich "Git Pull" machen, vor oder nach "Git Add, Git Commit"?

89

Was ist der richtige Weg?

git add foo.js
git commit foo.js -m "commit"
git pull
git push

Oder

git pull
git add foo.js
git commit foo.js -m "commit"
git push

Oder

git add foo.js
git pull
git commit foo.js -m "commit"
git push

UPD:

Ich habe vergessen zu erwähnen, dass ich in diesem Fall git addeine verfolgte und geänderte Datei inszeniere . Keine brandneue Datei in das Repository aufnehmen. Ändert dies eine Befehlsreihenfolge?

Grün
quelle

Antworten:

92

Ich denke, dass der beste Weg, dies zu tun, ist:

Verstecken Sie Ihre lokalen Änderungen:

git stash

Aktualisieren Sie den Zweig auf den neuesten Code

git pull

Führen Sie Ihre lokalen Änderungen in den neuesten Code ein:

git stash apply

Fügen Sie Ihre Änderungen hinzu, übernehmen Sie sie und übertragen Sie sie

git add
git commit
git push

Nach meiner Erfahrung ist dies der Weg zum geringsten Widerstand mit Git (sowieso in der Kommandozeile).

Johnjo
quelle
4
Können Sie erklären, warum das besser ist? Welche Probleme vermeidet dies? Warum ist dies insbesondere besser als ein einfaches Festschreiben> Ziehen> Drücken? (Ich denke, dies könnte die beste Antwort sein, hat aber
momentan
7
Vielleicht war das zu anekdotisch, aber ich fand diesen Ansatz (auf der Kommandozeile und nicht mit so etwas wie Sourcetree) immer viel einfacher. Wenn Sie in einem großen Team ein Commit ausführen und dann ziehen, führt dies immer zu großen Zusammenführungskonflikten, da Git meine Änderungen an einer Datei nicht sehr gut mit dem eingehenden zusammenführen konnte. Durch das Verstecken konnte ich die neuen Änderungen abrufen und dann den aktualisierten Code als Basis für das Hinzufügen meiner Änderungen verwenden. Der Umgang mit den Konflikten war einfacher, da sie mir klarer waren (da meine Änderungen nun die Konflikte waren). Im Nachhinein war es vielleicht einfacher für meine Situation.
Johnjo
1
Es klingt also wie eine Art "Wie isst du einen Elefanten? Ein Bissen nach dem anderen". dh Aufteilen des Prozesses in einige weitere Schritte, um die Zusammenführungen zu vereinfachen und weniger und möglicherweise klarere Änderungen vorzunehmen. Macht Sinn.
Dallas
Ist git add hier notwendig? Wenn alle Dateien bereits zum Staging hinzugefügt wurden!
Sharp Edge
Was ist, wenn Sie nicht verwenden git stash?
Aaron Franke
76

pull = fetch + merge.

Sie müssen festlegen, was Sie vor dem Zusammenführen getan haben.

Also nach dem Festschreiben ziehen.

Arnaud Denoyelle
quelle
7
Würde dies bedeuten, dass Sie für jedes Commit, das Sie machen, ein zusätzliches Commit machen und das Repo schlampig machen? Außerdem endet Ihre erste Festschreibungsnachricht jedes Mal, gefolgt von einem Zusammenführungskommentar. Wenn ja, würde ich gerne die unten von @johnjo erwähnte Stash-Methode verwenden.
MontagPapier
3
@DanielM Ja, es gibt ein zusätzliches Commit für die Zusammenführung (mit einer expliziten Standard-Commit-Nachricht). Dies ist jedoch eine gute Sache, da Sie damit Ihr letztes Commit oder das letzte Commit Ihres Kollegen oder das Merge-Commit auschecken können. Wenn Sie dies vermeiden möchten und Ihre Commits nach den Commits Ihres Kollegen platzieren möchten, können Sie dies rebasestattdessen tun merge. Sie können es entweder mit git commit && git rebaseoder tun git pull --rebase.
Arnaud Denoyelle
Danke für den Tipp, @Arnaud. Nachdem ich viele verschiedene SO-Fragen gelesen hatte, machte dieser Kommentar es. Wenn Kollegen an verschiedenen Dateien arbeiten, ist es meine bevorzugte Option, git pullmeine Änderungen nach dem Staging vorzunehmen, da dies für mich am natürlichsten ist. Obwohl mir klar ist, dass viele verschiedene Workflows funktionieren (Stash ist auch gut), ist es wahrscheinlich Geschmackssache.
Neffe vom
50

Ich würde vorschlagen, so oft wie möglich aus dem Remote-Zweig zu ziehen, um große Zusammenführungen und mögliche Konflikte zu minimieren.

Trotzdem würde ich mich für die erste Option entscheiden:

git add foo.js
git commit foo.js -m "commit"
git pull
git push

Übernehmen Sie Ihre Änderungen vor dem Abrufen, damit Ihre Festschreibungen während des Abrufs mit den Remote-Änderungen zusammengeführt werden. Dies kann zu Konflikten führen, mit denen Sie beginnen können, wenn Sie wissen, dass Ihr Code bereits festgeschrieben ist, falls etwas schief geht und Sie die Zusammenführung aus irgendeinem Grund abbrechen müssen.

Ich bin mir sicher, dass jemand mit mir nicht einverstanden sein wird. Ich glaube nicht, dass es einen richtigen Weg gibt, diesen Zusammenführungsfluss durchzuführen, nur das, was für Menschen am besten funktioniert.

Jasarien
quelle
1
Könnten Sie bitte mein Update zu der Frage sehen? Ich habe vergessen zu erklären, wofür git addgenau in meinem Beispiel verwendet wird.
Green
1
Sollte keinen Unterschied machen, ob es sich um eine neue Datei oder eine verfolgte / geänderte Datei handelt. Immer noch festschreiben und dann ziehen.
Jasarien
6

Ich denke, dies git pull --rebaseist der sauberste Weg, um Ihre lokal zuletzt festgeschriebenen Commits über die Remote-Commits zu setzen, die Sie zu einem bestimmten Zeitpunkt nicht haben.

Auf diese Weise müssen Sie nicht jedes Mal ziehen, wenn Sie Änderungen vornehmen möchten.

Mohyaddin Alaoddin
quelle
Dies ist, was ich auch tue, aber nur um darauf hinzuweisen, dass es definitiv zwei Hauptgedanken gibt (die sich darauf konzentrieren, ob es am besten ist, Konflikte zwischen einzelnen Commits oder einmal im Merge-Commit zu lösen), mit Linus selbst im Merge-Camp . Zum Glück hat das Tool selbst keine Meinung, daher funktioniert es am besten für Sie und die Anforderungen Ihres Projekts :-)
Luke Usherwood
3

Sie möchten, dass Ihre Änderung über dem aktuellen Status des Remote-Zweigs angezeigt wird. Also möchten Sie wahrscheinlich direkt ziehen, bevor Sie sich verpflichten. Drücken Sie danach Ihre Änderungen erneut.

"Schmutzige" lokale Dateien sind kein Problem, solange keine Konflikte mit dem Remote-Zweig bestehen. Wenn es jedoch zu Konflikten kommt, schlägt die Zusammenführung fehl, sodass beim Ziehen vor dem Vornehmen lokaler Änderungen kein Risiko oder keine Gefahr besteht.

AlexE
quelle
1
Funktioniert nicht, wie Arnaud erwähnt hat. Zum Ziehen müssen Sie zuerst Ihre Änderungen vornehmen.
Jasarien
Mein Idiot scheint glücklich zu sein, mit vielen lokalen Veränderungen zu ziehen. Wenn dieselben Dateien auf dem Remote-Zweig geändert werden, schlägt der Zusammenführungsteil des Pulls natürlich fehl. Um einen ordnungsgemäßen Zusammenführungskonflikt zu erstellen, müsste ich natürlich zuerst einen Commit durchführen. Wenn also der Satz lokal und remote geänderter Dateien nicht zusammenhängend ist, ist das Ziehen und anschließende Festschreiben in Ordnung. Sonst zieht Git nicht. Kein Schaden durch Versuch.
AlexE
Dies ist meine bevorzugte Option, wenn Leute an verschiedenen Dateien arbeiten, und ich finde es am natürlichsten.
Neffe vom