Git merge senza auto commit


404

È possibile fare un git merge, ma senza un commit?

"man git merge" dice questo:

With --no-commit perform the merge but pretend the merge failed and do not autocommit,
to give the user a chance to inspect and further tweak the merge result before
committing.

Ma quando provo a usarlo git mergecon il --no-commitcommit automatico. Ecco cosa ho fatto:

$> ~/git/testrepo$ git checkout master
Switched to branch 'master'

$> ~/git/testrepo$ git branch
* master
  v1.0

$> ~/git/testrepo$ git merge --no-commit v1.0
Updating c0c9fd2..18fa02c
Fast-forward
 file1 |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

$> ~/git/testrepo$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)

Un successivo git logrivela tutti i commit dal ramo v1.0 uniti in master.

Risposte:


618

Nota l'output mentre esegui l'unione - sta dicendo Fast Forward

In tali situazioni, vuoi fare:

git merge v1.0 --no-commit --no-ff

7
cosa succede se c'è un conflitto.
Jürgen Paul,

20
@PineappleUndertheSea Gli avanzamenti rapidi non causano mai conflitti. In caso di unione "reale" senza avanzamento rapido, lo --no-commitswitch è efficace solo se non si verifica alcun conflitto, in caso di conflitto git non eseguirà mai il commit automatico.
Gronostaj,

38
Cordiali saluti: Se vuoi unire le modifiche e poi eseguire il commit come se avessi digitato manualmente tutte le modifiche che hai unito (al contrario di una fusione tradizionale) devi eseguire in rm .git/MERGE_HEADseguito, il che costringerà Git a dimenticare che la fusione è avvenuta.
Jonn,

7
Cordiali saluti: Ecco un esempio di output per una fusione riuscita:Automatic merge went well; stopped before committing as requested
kevinarpe

6
Apparentemente ha git merge BRANCHENAME --no-commit --no-fflasciato il mio spazio di lavoro in uno stato "MERGING" git. Non sono sicuro di cosa faccia esattamente, ma un semplice git stash savee git stash popciclo sembra riportare tutto alla normalità; con solo i file modificati dal ramo di destinazione in posizione come previsto, e non più uno stato MERGING.
MoonLite,

49

Stai fraintendendo qui il significato della fusione.

Il --no-commit impedisce il MERGE impegnano a verificarsi, e che avviene solo quando si unisce due storie ramo divergente; nel tuo esempio non è così poiché Git indica che si è trattato di un'unione "avanzamento veloce" e quindi Git applica solo i commit già presenti sul ramo in sequenza.


12
Ciò (imo) non chiarirebbe necessariamente la confusione; Penso che questa sia una (relativamente rara) volta che i documenti sono effettivamente chiari: git help merge=> " --no-commitEsegui l'unione ma fingi che l'unione non sia riuscita e non esegua il autocommit, per dare all'utente la possibilità di ispezionare e modificare ulteriormente il risultato della fusione prima di impegnarsi. " La chiave ovviamente lo sta usando insieme a--no-ff
michael

6
... forse sarebbe meno confuso rompere dalla terminologia rigorosa e descriverla in questo modo: una "fusione git" che fa un avanzamento veloce non ha un commit di fusione perché in realtà non c'è affatto una fusione. Questa è in effetti la situazione ideale: gli avanzamenti rapidi sono una buona cosa, e non avere questo extra "unire commit" ha senso. Questo è un buon comportamento predefinito e non dovrebbe essere disabilitato. (Nel linguaggio corretto, un avanzamento veloce è un tipo di unione, ma non è una "vera unione".)
michael

4
è relativo alle politiche del progetto, in alcuni casi è utile avere / forzare quei "merge commit" extra anche quando è un ff perché è necessario contrassegnare l'inclusione della funzione nel ramo principale.
Samus_

7
...che cosa. Va bene, penso che Git sia praticamente invalicabile. Questa risposta in particolare mi ha convinto a provare Mercurial.
Brian Gordon,

24

Se vuoi solo eseguire il commit di tutte le modifiche in un commit come se stessi digitando te stesso, lo farà anche --squash

$ git merge --squash v1.0
$ git commit

1
È lo stesso effetto digit merge v1.0 --no-commit --no-ff
jpierson il

2
No, effetto diverso. Squash crea un nuovo commit con un nuovo hash. Unisce tutti i commit in un ramo in un commit per l'unione.
Kavi Siegel,

23

Preferisco così quindi non ho bisogno di ricordare parametri rari.

git merge branch_name

Quindi dirà che la tua filiale è in vantaggio con " #" commit, ora puoi eliminare questi commit e inserirli nelle modifiche operative con quanto segue:

git reset @~#

Ad esempio, se dopo l'unione è in corso 1 commit, utilizzare:

git reset @~1

Nota: su Windows, sono necessarie le virgolette. (Come ha osservato Josh nei commenti) ad esempio:

git reset "@~1"

4
Su Windows sono necessarie le virgolette:git reset "@~1"
Josh,

1

Quando c'è un solo commit nel ramo, di solito lo faccio

git merge branch_name --ff
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.