2015-09-28 11 views
8

Meine typische git Workflow ist es, ein Feature Zweig von unserem Master-Zweig abzweigen, machen kleine Commits, während regelmäßig von Master auf dem Weg zusammenführen, um Schritt zu halten.Interaktive Rebase nach dem Zusammenführen/andere Commits Interleaving Mine

Ich öffne dann eine Pull-Anfrage auf GitHub und wenn es akzeptiert wird, werde ich den Zweig löschen. Ich würde gerne interaktiv mehr Rebases machen, aber wenn ich das tue, werde ich Merge-Commits und Commits anderer Leute finden, die mit meinen eigenen verschachtelt sind. Ich bin mir nicht sicher, wie/wenn ich diese Commits zerquetschen oder meine Mine alleine gruppieren/quetschen kann?

Zum Beispiel meine git log für meine Zweig könnte so aussehen, wenn es darum geht, re:

merge commit 
someone else's commit 
one of my commits 
another one of my commits 
another merge commit 
another person's commit 
one of my commits, the first one after branching 

Ich habe Probleme mit dem, was möglich ist und was nicht ist, wenn eine interaktive rebase tun und Quetschen und Neuordnung von Commits. Was würden Sie angesichts des obigen Arbeitsablaufs empfehlen?

+1

gibt es einen Grund, warum Sie rebase verwenden? – ilj

+0

@ilj Andere Teammitglieder möchten eine saubere Geschichte so gut wie möglich behalten, um den Commit-Verlauf vernünftig zu halten. Ich persönlich stört eine einigermaßen gesprächige Geschichte (nicht völlig aus der Reihe) – jkj2000

+0

in meiner Erfahrung schafft es mehr Probleme als löst. – ilj

Antwort

3

Der Prozess, den wir in meinem Büro verwenden, besteht darin, auf die master-Verzweigung (oder den Zweig, in den Sie voraussichtlich wechseln) zu reverbieren, bevor Sie Ihre Pull-Anforderung zusammenführen. Dadurch wird sichergestellt, dass Ihre Commits auf allen anderen Commits in master zur Zeit bestellt, die die Verschachtelung von Commits mit anderen eliminiert:

> git fetch upstream master 
> git rebase upstream/master 
+1

Ich sehe, danke. Also referenziere ich regelmäßig vom Meister, anstatt es zu verschmelzen. – jkj2000

2

Ich bin nicht sicher, wie/ob ich diese Commits quetschen kann oder Gruppe/Squash Mine allein?

Squash nur Ihre commits nicht andere !!

Vor kurzem hatte ich das gleiche Problem, ich hatte 41 Commits auf meine Pull-Anforderungen, mein Zweig hatte einen Merge-Konflikt und meine Pull-Anfrage war abgestanden. Ich musste mich mit einigen der Probleme auseinandersetzen, denen Sie jetzt gegenüberstehen. Ich werde nur etwas berühren, was ich umgesetzt habe.

one of my commits 
another one of my commits 
one of my commits, the first one after branching 

Ich schlage vor, Squash nur Commits (alle von ihnen, wenn Sie wollen).

Zum Beispiel, wenn Sie 3 Commits haben, können Sie sie zerquetschen und in eines mit interaktiven Rebase machen. Siehe unten Befehl:

$ git rebase -i HEAD~n 

Zum Beispiel Sie 3 Commits zerquetschen wollen:

$ git rebase -i HEAD~3 

Jetzt finden Sie eine interaktive rebase Schnittstelle, wo Sie schreiben können umformulieren/pick auf erste begehen und Squash auf der Rest von ihnen. Bitte lesen Sie dieses Video zum besseren Verständnis.

Squashing commits

merge commit 
someone else's commit 
another merge commit 
another person's commit 

Rebase zu anderen (jemand anderes) begeht

Dies ist das gemeinsame Problem jeder zugewandt ist, wenn git verwenden. Stellen Sie sich vor, Sie arbeiten an Ihrem lokalen Repo. Nachdem Sie einige Zeit gearbeitet haben, haben Sie einige Commits gemacht, jetzt möchten Sie sie zum ursprünglichen Remote-Repository verschieben. Cool, das hast du gemacht git push, die merge commit Problem sagt.

Sie wissen, jemand anderes könnte auch zu dem gleichen Remote-Repo verpflichtet, die jetzt aktualisiert wird. Da Ihr lokaler Repo nicht auf den entfernten Repo aktualisiert wird, gibt es merge commit problem. Was nun, wenn wir dieses Problem lösen? Können wir den Repo unseres lokalen Computers auf Ihren ursprünglichen Remote-Computer aktualisieren? Ist es möglich?

Ja, es ist möglich, Sie können es tun, indem Sie umlenken. Wie?

Wenn Sie das tun:

git pull --rebase 

Was hier passiert? Git wird alle lokalen Commits zurückspulen (rückgängig machen), die Remote-Commits herunterziehen und dann Ihre lokalen Commits über die neu gezogenen Remote-Commits wiederholen. Wenn Konflikte auftreten, die git nicht verarbeiten kann, erhalten Sie die Möglichkeit, die Commits manuell zusammenzuführen. Führen Sie dann einfach git rebase --continue aus, um Ihre lokalen Commits fortzusetzen.

Sehen Sie diese blog post für mehr Details

Wenn Sie Ihre Niederlassung fusionieren zu meistern?

Best (and safest) way to merge a git branch into master

Verwandte Themen