Qual è la differenza tra `git merge` e` git merge --no-ff`?



Answers

Risposta grafica a questa domanda

Ecco un sito con una chiara spiegazione e illustrazione grafica dell'uso di git merge --no-ff :

Fino a quando ho visto questo, ero completamente perso con git. L'uso di --no-ff consente a qualcuno di rivedere la cronologia di vedere chiaramente il ramo su cui hai effettuato il check-out . (che collega i punti allo strumento di visualizzazione "rete" di github) Ed ecco un'altra grande referenza con le illustrazioni. Questo riferimento completa bene il primo con maggiore attenzione a chi è meno informato di git.

Informazioni di base per newb come me

Se sei come me, e non un Git-guru, la mia risposta qui descrive la gestione dell'eliminazione dei file dal tracciamento di git senza eliminarli dal filesystem locale, che sembra scarsamente documentato ma spesso occorso. Un'altra nuova situazione è ottenere il codice attuale , che comunque riesce a sfuggirmi.

Esempio di flusso di lavoro

Ho aggiornato un pacchetto sul mio sito web e ho dovuto tornare alle mie note per vedere il mio flusso di lavoro; Ho pensato che fosse utile aggiungere un esempio a questa risposta.

Il mio flusso di lavoro dei comandi git:

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

Sotto: utilizzo effettivo, comprese spiegazioni.
Nota: l'output di seguito viene tagliato; git è abbastanza prolisso.

$ 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

Nota 3 cose dall'alto:
1) Nell'output è possibile visualizzare le modifiche dall'aggiornamento del pacchetto ECC, inclusa l'aggiunta di nuovi file.
2) Notate anche che ci sono due file (non nella cartella /ecc ) che ho cancellato indipendentemente da questa modifica. Invece di confondere quelle eliminazioni di file con ecc , creerò un ramo di cleanup diverso in seguito per riflettere la cancellazione di quei file.
3) Non ho seguito il mio flusso di lavoro! Mi sono dimenticato di git mentre stavo cercando di far funzionare di nuovo ecc.

Sotto: piuttosto che fare il git commit -am "updated ecc package" all-inclusive git commit -am "updated ecc package" normalmente lo farei, volevo solo aggiungere i file nella cartella /ecc . Quei file eliminati non erano specificamente parte del mio git add , ma poiché erano già stati rintracciati in git, ho bisogno di rimuoverli dal commit di questo ramo:

$ 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


Script per automatizzare quanto sopra

Avendo usato questo processo più di 10 volte in un giorno, ho iniziato a scrivere script in batch per eseguire i comandi, quindi ho creato uno git_update.sh <branch> <"commit message"> per i passaggi precedenti. Ecco la fonte Gist per quello script.

Invece di git commit -am sto selezionando i file dalla lista "modificata" prodotta tramite lo git status e poi incollando quelli in questo script. Ciò è avvenuto perché ho apportato decine di modifiche, ma desideravo svariati nomi di filiali per aiutare a raggruppare i cambiamenti.

Question

Usando il gitk log , non sono riuscito a individuare una differenza tra i due. Come posso osservare la differenza (con un comando git o qualche strumento)?




Questa è una vecchia domanda, e questo è un po 'sottilmente menzionato negli altri post, ma la spiegazione che ha fatto questo clic per me è che le unioni non veloci richiederanno un commit separato .




Links