Mit gitk log
konnte ich keinen Unterschied zwischen den beiden feststellen. Wie kann ich den Unterschied beobachten (mit einem Git-Befehl oder einem Tool)?
git
merge
fast-forward
user1162226
quelle
quelle
Antworten:
Das
--no-ff
Flag verhindertgit merge
, dass ein "schneller Vorlauf" ausgeführt wird, wenn festgestellt wird, dass Ihre aktuelleHEAD
Datei ein Vorfahr des Commits ist, das Sie zusammenführen möchten. Ein schneller Vorlauf ist, wenn git anstelle eines Zusammenführungs-Commits nur Ihren Verzweigungszeiger so bewegt, dass er auf das eingehende Commit zeigt. Dies tritt normalerweise auf, wenn agit pull
ohne lokale Änderungen ausgeführt wird.Gelegentlich möchten Sie jedoch verhindern, dass dieses Verhalten auftritt, normalerweise, weil Sie eine bestimmte Zweigstellentopologie beibehalten möchten (z. B. wenn Sie in einem Themenzweig zusammenführen und sicherstellen möchten, dass dies beim Lesen des Verlaufs so aussieht). Zu diesem Zweck können Sie das
--no-ff
Flag übergeben undgit merge
erstellen immer eine Zusammenführung anstelle eines schnellen Vorlaufs.In ähnlicher Weise können Sie das Flag verwenden , wenn Sie a ausführen
git pull
oder verwenden möchten, um einengit merge
expliziten Schnellvorlauf durchzuführen, und wenn Sie aussteigen möchten, wenn der Schnellvorlauf nicht möglich ist--ff-only
. Auf diese Weise können Sie regelmäßig so etwas wiegit pull --ff-only
ohne nachzudenken tun. Wenn es dann zu Fehlern kommt, können Sie zurückgehen und entscheiden, ob Sie zusammenführen oder neu aufbauen möchten.quelle
gitk
odergit log --graph
dass das Vorspulen merge nicht eine Zusammenführung schaffen verpflichten, während die Nicht-vorspulen tat.--no-ff
das Entwickeln eines Features oder das Entwickeln zum Master dem Zusammenführen einer Pull-Anforderung ähnelt?--no-ff
.Grafische Antwort auf diese Frage
Hier ist eine Seite mit einer klaren Erklärung und grafischen Darstellung der Verwendung
git merge --no-ff
:Bis ich das sah, war ich völlig mit Git verloren. Mithilfe von
--no-ff
kann jemand, der den Verlauf überprüft, den Zweig, an dem Sie gearbeitet haben , deutlich sehen . (Dieser Link verweist auf Githubs "Netzwerk" -Visualisierungstool.) Und hier ist eine weitere großartige Referenz mit Abbildungen. Diese Referenz ergänzt die erste sehr gut und konzentriert sich mehr auf diejenigen, die mit Git weniger vertraut sind.Grundlegende Informationen für Neulinge wie mich
Wenn Sie wie ich und kein Git-Guru sind, beschreibt meine Antwort hier, wie Sie das Löschen von Dateien aus dem Tracking von git behandeln, ohne sie aus dem lokalen Dateisystem zu löschen, was schlecht dokumentiert zu sein scheint, aber häufig vorkommt. Eine andere neue Situation ist das Abrufen des aktuellen Codes , der mir immer noch entgeht .
Beispiel für einen Workflow
Ich habe ein Paket auf meiner Website aktualisiert und musste zu meinen Notizen zurückkehren, um meinen Workflow anzuzeigen. Ich fand es nützlich, dieser Antwort ein Beispiel hinzuzufügen.
Mein Workflow von Git-Befehlen:
Unten: tatsächliche Verwendung, einschließlich Erläuterungen.
Hinweis: Die folgende Ausgabe wird abgeschnitten. Git ist ziemlich ausführlich.
Beachten Sie 3 Dinge von oben:
1) In der Ausgabe sehen Sie die Änderungen aus dem Upgrade des ECC-Pakets, einschließlich des Hinzufügens neuer Dateien.
2) Beachten Sie auch, dass es zwei Dateien gibt (nicht im
/ecc
Ordner), die ich unabhängig von dieser Änderung gelöscht habe. Anstatt diese Dateilöschungen mit zu verwechselnecc
, werde ichcleanup
später einen anderen Zweig erstellen, um die Löschung dieser Dateien widerzuspiegeln.3) Ich bin meinem Workflow nicht gefolgt! Ich habe git vergessen, als ich versuchte, ecc wieder zum Laufen zu bringen.
Unten: Anstatt das All-Inclusive zu machen, das
git commit -am "updated ecc package"
ich normalerweise machen würde, wollte ich nur die Dateien in den/ecc
Ordner einfügen. Diese gelöschten Dateien waren nicht speziell Teil von mirgit add
, aber da sie bereits in git verfolgt wurden, muss ich sie aus dem Commit dieses Zweigs entfernen:Skript zur Automatisierung der oben genannten
Nachdem ich diesen Prozess mehr als 10 Mal am Tag verwendet habe, habe ich Batch-Skripte geschrieben, um die Befehle auszuführen. Daher habe ich ein fast richtiges
git_update.sh <branch> <"commit message">
Skript für die obigen Schritte erstellt. Hier ist die Hauptquelle für dieses Skript.Anstatt
git commit -am
ich Dateien aus der "geänderten" Liste auszuwählen, die über erstellt wurden,git status
und diese dann in dieses Skript einzufügen. Dies geschah, weil ich Dutzende von Änderungen vorgenommen hatte, aber verschiedene Zweignamen wollte, um die Änderungen zu gruppieren.quelle
--no-ff
Option immer noch sicher löschen ?Strategien zusammenführen
Explizite Zusammenführung : Erstellt ein neues Zusammenführungs-Commit. (Dies ist, was Sie erhalten, wenn Sie verwendet
--no-ff
.)Schnellvorlauf-Zusammenführung: Schnellvorlauf ohne Erstellung eines neuen Commits:
Rebase : Richten Sie eine neue Basisebene ein:
Squash: Crush oder Squeeze (etwas) mit Gewalt, so dass es flach wird:
quelle
Die
--no-ff
Option stellt sicher, dass keine Schnellvorlaufzusammenführung stattfindet und dass immer ein neues Festschreibungsobjekt erstellt wird . Dies kann wünschenswert sein, wenn git einen Verlauf von Feature-Zweigen verwalten soll. Im obigen Bild ist die linke Seite ein Beispiel für den Git-Verlauf nach der Verwendunggit merge --no-ff
und die rechte Seite ist ein Beispiel für die Verwendung,git merge
bei der eine Zusammenführung möglich war.BEARBEITEN : In einer früheren Version dieses Bildes wurde nur ein übergeordnetes Element für das Zusammenführungs-Commit angegeben. Merge-Commits haben mehrere übergeordnete Commits, mit denen git den Verlauf des "Feature-Zweigs" und des ursprünglichen Zweigs verwaltet. Die mehreren übergeordneten Links werden grün hervorgehoben.
quelle
Dies ist eine alte Frage, und dies wird in den anderen Beiträgen etwas subtil erwähnt, aber die Erklärung, die diesen Klick für mich gemacht hat, ist, dass nicht schnelle Vorlaufzusammenführungen ein separates Commit erfordern .
quelle
git merge --no-ff ecc
Sie haben einfach ein zusätzliches Merge-Commit imgit log
for-Branch-Master. Dies ist technisch nicht erforderlich, wenn der Master auf einen direkten Vorfahren des Commits verweist. Ecc ist aktiviert. Wenn Sie jedoch die Option --no-ff angeben, erzwingen Sie die Erstellung dieses Merge-Commits. Es wird den Titel haben:Merge branch 'ecc'
Das Flag --no-ff bewirkt, dass bei der Zusammenführung immer ein neues Festschreibungsobjekt erstellt wird, auch wenn die Zusammenführung mit einem schnellen Vorlauf durchgeführt werden könnte. Dadurch wird vermieden, dass Informationen über die historische Existenz eines Feature-Zweigs verloren gehen und alle Commits zusammengefasst werden, die das Feature hinzugefügt haben
quelle