So vermeiden Sie Merge-Commit-Hölle auf GitHub / BitBucket

100

Wir haben am Ende eine Menge solcher Commits in unserem Repo:

Merge branch 'master' of bitbucket.org:user/repo

Dies geschieht jedes Mal, wenn ein Entwickler seine lokale Verzweigung mit dem Repo der obersten Ebene synchronisiert.

Gibt es überhaupt eine Möglichkeit, um zu verhindern, dass diese Merge-Commit-Hölle das gesamte Repo-Protokoll überfüllt? Kann man sie vermeiden, wenn man die Pull-Requests auf irgendeine Weise initiiert?

Ich weiß, dass ich Git-Rebase durchführen kann, wenn dies nur in meiner lokalen VM erfolgt. Gibt es eine Äquivalenz in der GitHub / BitBucket-Benutzeroberfläche?

Wie macht ihr das?

Niklas9
quelle

Antworten:

135

Feature-Zweige vor dem Zusammenführen neu starten

Wenn Sie Zusammenführungs-Commits vermeiden möchten, müssen Sie sicherstellen, dass alle Commits schnell vorgespult werden. Sie tun dies, indem Sie sicherstellen, dass Ihr Feature-Zweig vor einer Zusammenführung wie folgt sauber auf Ihre Entwicklungslinie zurückgesetzt wird:

git checkout master
git checkout -b feature/foo

# make some commits

git rebase master
git checkout master
git merge --ff-only feature/foo

Rebase verfügt auch über viele Flags, einschließlich des interaktiven Rebasings mit dem -iFlag. Dies ist jedoch möglicherweise nicht erforderlich, wenn Sie die Dinge so einfach wie möglich halten und den gesamten Zweigverlauf bei einer Zusammenführung beibehalten möchten.

Verwenden Sie die --ff-onlyFlagge

Abgesehen von der Neugründung stellt die Verwendung des --ff-onlyFlags sicher, dass nur Schnellvorlauf-Commits zulässig sind. Ein Commit wird nicht durchgeführt, wenn es sich stattdessen um ein Merge-Commit handelt. Auf der Handbuchseite von git-merge (1) heißt es:

--ff-only

Verweigern Sie das Zusammenführen und Beenden mit einem Status ungleich Null, es sei denn, der aktuelle HEAD ist bereits auf dem neuesten Stand oder die Zusammenführung kann als schneller Vorlauf aufgelöst werden.

Todd A. Jacobs
quelle
1
Dies ist eine großartige Antwort. Ich benutze Rebase so oft wie möglich. Ich wusste jedoch nichts über die Nur -ff-Flagge. Ziemlich cool!
Leo Correa
3
Vielen Dank für die Rebase und --ff-only Ratschläge. Wie kann ich dies jedoch in der Benutzeroberfläche von GitHub / BitBucket tun, wie in meiner Frage erwähnt?
Niklas9
3
@Niklas Ich bin mir ziemlich sicher, dass Sie auf die CLI zurückgreifen müssen, um das zu tun, was Sie wollen. GitHub bietet nicht die volle Leistung von Git. Nur eine Teilmenge seiner Funktionen sowie einige grafische und soziale Netzwerke. Viel Glück!
Todd A. Jacobs
3
Bei diesem Vorgang ist zu beachten, dass Sie vor dem Zusammenführen des Themenzweigs (feature / foo) mit dem Master den Pull-Origin-Master (bei Verwendung einer Fernbedienung) aktivieren sollten, um sicherzustellen, dass der Hauptzweig auf dem neuesten Stand ist . Wenn Updates gefunden wurden, stellen Sie sicher, dass Sie den Master erneut auf den Themenzweig zurücksetzen, bevor Sie ihn wieder in den Master zusammenführen.
Chikamichi
19
@CodeGnome nenne es nicht "auf die CLI zurückgreifen" ... in Wirklichkeit sollten Sie davor warnen, auf die Benutzeroberfläche zurückzugreifen!
Droogans
9

"Todd A. Jacobs" bereits erwähnt "Rebase" ist das Konzept hier. Dies ist nur eine detailliertere Vorgehensweise.

Angenommen, Sie befinden sich in der Hauptniederlassung

$ git branch
  * master

Wenn Sie eine Korrektur vornehmen möchten, erstellen Sie eine „Fixbranch“, die vom Master verzweigt ist

$ git checkout -b fixbranch

Vielleicht hätten Sie ein paar Tage in dieser Branche gearbeitet und ein paar Verpflichtungen eingegangen.

Der Tag, an dem Sie Ihre Commits auf das zentrale Master-Repo übertragen wollten! Kasse Master und erhalte die neuesten Änderungen aus dem zentralen Master-Repo

$ git checkout master
$ git pull origin master

Starten Sie Ihre Fixbranch mit dem Master neu, um einen sauberen Verlauf zu haben und die Konflikte im lokalen Repo selbst zu lösen.

$ git checkout fixbranch
$ git rebase master

Jetzt ist fixbranch auf dem neuesten Stand des zentralen Masters. Lassen Sie mich fixbranch in den Master-Zweig einbinden

 $ git checkout master
 $ git merge fixbranch

Ich bin fertig! Lassen Sie mich den lokalen Master zum zentralen Master schieben

$ git push origin master

https://git-scm.com/book/en/v2/Git-Branching-Rebasing

Kondal Kolipaka
quelle
Ich schätze diese Antwort.
lasec0203