Wie kann ich Git Pull dazu bringen, Rebase standardmäßig für alle meine Repositorys zu verwenden?

184

Gibt es eine Möglichkeit, das Host-Git-Repository so einzurichten, dass git pulles --rebasestandardmäßig von seinen (lokalen) Klonen verwendet wird? Durch die Suche nach Stack Overflow habe ich davon erfahren branch.autosetuprebase, aber es muss pro Klon individuell konfiguriert werden.

Mein Projektablauf ist so eingerichtet, dass wir pullden developZweig haben, bevor wir mergeeinen Feature-Zweig dazu erstellen. Dies wird pullfast immer verwendet --rebase, daher versuche ich herauszufinden, ob dies die Standardeinstellung sein kann.

Maskierter Mann
quelle
6
Warum willst du das? Ich denke, es ist vernünftiger, den Benutzern beizubringen, aktiv darüber nachzudenken, welcher Fall angemessener ist (basierend auf dem Ausmaß der Änderungen, die sie vorgenommen haben oder von Upstream erwarten) “
Jonas Schäfer,
4
@ JonasWielicki Ja, ich stimme zu. Es ist nur so, dass einige meiner Teammitglieder neu bei Git sind, und ich würde gerne wissen, ob es eine Möglichkeit gibt, dies durchzusetzen, um Probleme in der Anfangsphase zu vermeiden (bis sie es gelernt haben). Das Team arbeitet auch remote in einer anderen Zeitzone, was bedeutet, dass sie mehrere Stunden lang festsitzen, wenn etwas schief geht. Nur neugierig zu wissen, ob dies möglich ist.
Maskierter Mann
1
Ich denke, besonders für anfängliche Setups ist es besser, sich für das Zusammenführen zu entscheiden. Rebase macht viel seltsamere Dinge, wenn Ihr Code wirklich abweicht. Sie müssen die gleichen Konflikte immer und immer wieder lösen, bis Sie pushen. Wenn ein Teammitglied also an einem Code arbeiten möchte, immer Rebase verwendet und erst dann pusht (was Neulinge tun können, anstatt sich selbst zu verzweigen), werden sie mit denselben Konflikten konfrontiert sein, die sie bereits X-mal gelöst haben .
Jonas Schäfer
3
@JonasWielicki Die Teammitglieder tun einen neuen Zweig für jede neue Funktion machen sie arbeiten (und dies haben sie verstanden , schon recht gut). Die Notwendigkeit einer Neugründung besteht darin, dass sich andere Entwickler dem "Remote" -Entwicklungszweig verpflichtet haben, bis er bereit ist, seine Änderungen voranzutreiben. Daher möchte ich, dass er eine Pull-Rebase von der Fernbedienung aus durchführt, bevor er seine Änderungen vornimmt. Das Projekt selbst ist ziemlich ausgereift, nur das Team ist neu. :) Es handelt sich also nur um eine "Ersteinrichtung" in Bezug auf Personen. Was würden Sie für dieses Szenario raten?
Maskierter Mann
5
Wenn Sie auf Ihren ersten Kommentar antworten, ist Rebase in den meisten Fällen (fast allen) die richtige Wahl, da das gründliche Testen einer neuen Funktion usw. viel Zeit in Anspruch nimmt. Bis dahin ist dies mit Sicherheit der Fall viele Commits von anderen Entwicklern.
Maskierter Mann

Antworten:

203

Es gibt jetzt 3 verschiedene Konfigurationsebenen für das Standard-Pull-Verhalten. Von den allgemeinsten bis zu den feinkörnigsten sind sie:

1. pull.rebase

Wenn Sie dies auf setzen, truebedeutet dies immer, dass dies git pullimmer gleichbedeutend ist git pull --rebase(es branch.<branchname>.rebasesei denn, dies ist ausdrücklich festgelegt false). Dies kann auch pro Repository oder global festgelegt werden.

2. branch.autosetuprebase

Wenn Sie dies auf setzen always, wird bei jeder Erstellung eines Tracking-Zweigs ein Konfigurationseintrag wie der folgende erstellt. Für feinkörnige Kontrolle, dies kann auch eingestellt werden never, localoder remoteund kann pro Repository oder global festgelegt werden. Siehe git config --helpfür weitere Details.

3. branch.<branchname>.rebase

Wenn Sie dies auf setzen, truebedeutet dies, dass dieser bestimmte Zweig immer durch erneutes Basieren aus seinem Upstream gezogen wird, sofern dies nicht git pull --no-rebaseexplizit verwendet wird.

Fazit

Während Sie das Standardverhalten nicht für alle zukünftigen Klone eines Repositorys ändern können, können Sie das Standardverhalten für alle (vorhandenen und zukünftigen) Repositorys des aktuellen Benutzers über ändern git config --global pull.rebase true.

Parker Coates
quelle
4
Vielen Dank für Ihre Antwort. Ich habe untersucht, ob ich eine Einstellung haben könnte, damit jeder, der das Repository klont, diese standardmäßig aktiviert hat. Die obige Einstellung wird in gespeichert ~/.gitconfig, was bedeutet, dass jeder Entwickler, der das Host-Repository klont, den Befehl ausführen muss. Sie beschweren sich nicht über Ihre Lösung. Es ist gut, ich möchte nur bestätigen, dass ich Ihren Punkt richtig verstanden habe.
Maskierter Mann
Danke für die Antwort. Es sieht tatsächlich so aus, als wäre dies so nah wie möglich.
Maskierter Mann
137

Wie wäre es mit

git config --global pull.rebase true

Dies wird git anweisen, immer mit Rebase zu ziehen.

Mackuntu
quelle
3
Vielen Dank, dies funktioniert hervorragend für vorhandene Tracking-Zweige.
Fls'Zen
1
Bitte entfernen --bool, es ist unnötig
Diralik
37

Die Antwort ist nein.

Es gibt keine Möglichkeit, ein Remote-Repository so einzurichten, dass jeder, der es klont, das Standardverhalten von git pullgeändert hat.

Sie können jedoch einen serverseitigen Hook einrichten, der überprüft, ob niemand Merge-Commits überträgt (so etwas vielleicht).

Es gibt auch einige Konfigurationsoptionen, an denen Sie interessiert sein könnten. Alle Entwickler, die aus dem Remote-Repository klonen, müssen diese manuell festlegen.

1. Option branch.<name>.rebase

Sie können einen lokalen Zweig so konfigurieren, dass er immer so verwendet --rebasewird und <name>durch einen Zweignamen ersetzt wird:

git config branch.<name>.rebase true

Nachdem Sie dies ausgeführt haben master, sah der masterAbschnitt in folgendermaßen .git/configaus:

[branch "master"]
    remote = origin
    merge = refs/heads/master
    rebase = true

2. Option branch.autosetuprebase

Das Ausführen dieses vorherigen Konfigurationsbefehls für jeden Git-Zweig kann problematisch sein. Sie können Git also so konfigurieren, dass er automatisch für jeden neuen Zweig eingerichtet wird:

git config branch.autosetuprebase always

(Sie können auch angeben never, remoteund local, siehe man git-configfür Details.)

Ohne diese --globalOption wird die Konfiguration in gespeichert .git/configund nur das aktuelle Repository ist betroffen. Mit --globalwird die Konfiguration in gespeichert ~/.gitconfigund jedes nicht konfigurierte Repository ist betroffen.

Diese Option wirkt sich nicht auf bereits vorhandene Zweige aus.

3. Option pull.rebase

git config --bool pull.rebase true

(Sie können ihm auch die --globalOption geben.)

Wenn diese Option wahr git pullist, entspricht das Ausführen dem git pull --rebase, es sei denn, es branch.<name>.rebasewurde festgelegt false.

Flimm
quelle
3

Dies macht die --rebaseOption zur Standardeinstellung, wenn eine git pull für einen bestimmten Zweig ausgegeben wird.

@Flimm, ich musste hinzufügen true, damit deine erste Option funktioniert.

Die richtige Syntax lautet also:

git config branch.<branch>.rebase true

So führen Sie diesen Befehl auf dem developZweig aus:

git config branch.develop.rebase true

Und jetzt sieht der developAbschnitt in so .git/configaus:

[branch "develop"]
        remote = origin
        merge = refs/heads/develop
        rebase = true
Daishi
quelle
Vielen Dank, ich habe meine Antwort bearbeitet. In Zukunft können Sie die Antwort gerne selbst bearbeiten.
Flimm
2
Donwvoter, wer auch immer Sie sind, erklären Sie bitte Ihre Gründe. Ein kommentarloses Downvoting erscheint mir völlig willkürlich und unkonstruktiv.
Daishi
1

Derzeit gibt es keine Möglichkeit, die Standardrichtlinie für ein Repository festzulegen.

Wenn Sie es selbst wollen und mindestens Git 1.7.9 verwenden, können Sie die pull.rebaseKonfiguration global wie folgt festlegen :

git config --global pull.rebase true

Aber Sie müssen auf jeder Maschine tun. Eine Option könnte darin bestehen, die Standard-Home-Vorlage / das Standard-Skelett des Benutzers mit dieser Option zu konfigurieren. Benutzer können diese Option jedoch ändern.

Wenn Sie keine Zusammenführungen wünschen, können Sie einen serverseitigen Hook definieren, um Pushs mit Zusammenführungen abzulehnen.

Als Referenz dient die Quelldokumentation für pull.rebase:

Wenn true, werden die Zweige über dem abgerufenen Zweig neu basiert, anstatt den Standardzweig von der Standardfernbedienung zusammenzuführen, wenn "git pull" ausgeführt wird. Siehe "branch..rebase", um dies für jeden Zweig festzulegen.

Übergeben Sie beim Zusammenführen die Option --rebase-merges an git rebase, damit die lokalen Merge-Commits in der Rebase enthalten sind ( Details siehe git-rebase ).

Übergeben Sie beim Speichern auch --preserve-merges an git rebase, damit lokal festgeschriebene Merge-Commits nicht durch Ausführen von git pull abgeflacht werden.

Wenn der Wert interaktiv ist, wird die Rebase im interaktiven Modus ausgeführt.

HINWEIS: Dies ist eine möglicherweise gefährliche Operation. Verwenden Sie es nur, wenn Sie die Auswirkungen verstanden haben ( Einzelheiten finden Sie unter git-rebase ).

David
quelle