Mit gitk log
konnte ich keinen Unterschied zwischen den beiden feststellen. Wie kann ich den Unterschied beobachten (mit einem Git-Befehl oder einem Tool)?
Mit gitk log
konnte ich keinen Unterschied zwischen den beiden feststellen. Wie kann ich den Unterschied beobachten (mit einem Git-Befehl oder einem Tool)?
Antworten:
Das --no-ff
Flag verhindert git merge
, dass ein "schneller Vorlauf" ausgeführt wird, wenn festgestellt wird, dass Ihre aktuelle HEAD
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 a git 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 und git 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 einen git 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 wie git 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.
gitk
oder git 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
.
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.
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 .
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:
git checkout -b contact-form
(do your work on "contact-form")
git status
git commit -am "updated form in contact module"
git checkout master
git merge --no-ff contact-form
git branch -d contact-form
git push origin master
Unten: tatsächliche Verwendung, einschließlich Erläuterungen.
Hinweis: Die folgende Ausgabe wird abgeschnitten. Git ist ziemlich ausführlich.
$ git status
# On branch master
# Changed but not updated:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: ecc/Desktop.php
# modified: ecc/Mobile.php
# deleted: ecc/ecc-config.php
# modified: ecc/readme.txt
# modified: ecc/test.php
# deleted: passthru-adapter.igs
# deleted: shop/mickey/index.php
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# ecc/upgrade.php
# ecc/webgility-config.php
# ecc/webgility-config.php.bak
# ecc/webgility-magento.php
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 verwechseln ecc
, werde ich cleanup
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 mir git add
, aber da sie bereits in git verfolgt wurden, muss ich sie aus dem Commit dieses Zweigs entfernen:
$ git checkout -b ecc
$ git add ecc/*
$ git reset HEAD passthru-adapter.igs
$ git reset HEAD shop/mickey/index.php
Unstaged changes after reset:
M passthru-adapter.igs
M shop/mickey/index.php
$ git commit -m "Webgility ecc desktop connector files; integrates with Quickbooks"
$ git checkout master
D passthru-adapter.igs
D shop/mickey/index.php
Switched to branch 'master'
$ git merge --no-ff ecc
$ git branch -d ecc
Deleted branch ecc (was 98269a2).
$ git push origin master
Counting objects: 22, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (14/14), done.
Writing objects: 100% (14/14), 59.00 KiB, done.
Total 14 (delta 10), reused 0 (delta 0)
To git@github.com:me/mywebsite.git
8a0d9ec..333eff5 master -> master
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.
--no-ff
Option immer noch sicher löschen ?
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:
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 Verwendung git 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.
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 .
git merge --no-ff ecc
Sie haben einfach ein zusätzliches Merge-Commit im git 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