Skip to content

Perché dopo la fusione GIT dice "Già aggiornato", ma le differenze tra i rami esistono ancora?

Ti suggeriamo di rivedere questa soluzione in un ambiente controllato prima di metterla in produzione, saluti.

Soluzione:

Ripristino delle fusioni vs. reset delle fusioni

La mia ipotesi è che in realtà sonoAlready-up-to-date.

Il problema è che git revert non annulla la fusione, ma solo i cambiamenti che la fusione ha portato con sé. Quando si crea un commit di fusione, si combinano le cronologie dei commit dei due rami.

Fusione

     develop
        |
A---B---C
        
  E---F---M
          |
      newfeature

Nel caso precedente, develop viene fuso in newfeaturecreando l'elemento M per creare il commit. Se si eseguisse git log newfeature si vedrebbero tutti i commit di entrambi i rami, ma dal punto di vista del ramo newfeature tutte le modifiche sono state eseguite dal ramo M commit.

Inversione di rotta

Il git revert non rimuove alcun commit, ma crea un nuovo commit che annulla le modifiche contenute nel commit. Per esempio, se si ha un commit contenente questo diff...

-This is the old sentence.
+This is the new sentence.

Poi lo si reverte, il comando revert creerebbe un nuovo commit che ha appena eseguito il diff opposto, semplicemente invertendo i segni.

-This is the new sentence.
+This is the old sentence.

Questo è molto utile per annullare i danni causati da commit già in possesso di altri sviluppatori. Fa avanzare la storia piuttosto che cambiarla.

Reversione delle fusioni

Tuttavia, nel contesto di una fusione non in avanti, può avere un effetto indesiderato.

     develop
        |
A---B---C
        
  E---F---M---W
              |
         newfeature

Assumendo che W sia un commit di reversione, si può vedere come l'esecuzione di git log newfeature includerà comunque tutti i commit del ramo di sviluppo. Di conseguenza, le fusioni aggiuntive da develop non funzioneranno, perché non vedono nulla di mancante dal proprio ramo.

Usare git reset invece di revert.

In futuro, si potrebbe prendere in considerazione l'uso di git reset --hard (dove è l'hash del commit della fusione) per annullare una fusione se questa non è stata condivisa con altri sviluppatori. Nell'esempio precedente, dopo aver creato il commit della fusione M, si esegue il comando git reset --hard F avrebbe il seguente risultato.

     develop
        |
A---B---C
        
  E---F---M
      |
  newfeature

Come si può vedere, questa tecnica non cancella il commit, come alcuni tendono a pensare, ma semplicemente sposta il ramo indietro al commit selezionato. Ora, se si esegue git log newfeature si otterrebbe solo il commit F, Ee A. Ora il merge è effettivamente sparito dalla cronologia dei rami, quindi un successivo tentativo di rifare il merge in develop non causerà problemi.

Questo metodo non è privo di complicazioni. Ci si rende conto che ora si sta modificando la cronologia, quindi se il file newfeature è stato spinto in un ramo remoto dopo il ramo M allora git penserà che non siete aggiornati e vi dirà che dovete eseguire il comando git pull. Se siete solo voi a lavorare su quel ramo remoto, allora sentitevi liberi di force-push - git push -f . Questo avrà lo stesso effetto del reset, ma sul ramo remoto.

Se questo ramo viene usato da più sviluppatori, che a questo punto avrebbero già prelevato da esso, allora questa è una cattiva idea. Questo è il motivo per cui git revert è utile, perché annulla le modifiche senza cambiare il ramo remoto.

E non sono stato in grado di trovare l'esatto commit del revert a causa di molti reverts nel log. (Già, una brutta cosa. Non sarebbe dovuto accadere in primo luogo).

Soluzione

git checkout branchX -- .

Questo metterà in scena tutte le modifiche dal ramoX al mio ramo corrente.
Usare il proprio client git preferito, disinstallare e ripristinare tutto ciò che non è previsto.

Fare un nuovo commit ed essere felici 🙂

Sezione recensioni e valutazioni

Alla fine di tutto puoi trovare i commenti di altri programmatori, puoi anche mostrare i tuoi se padroneggi l'argomento.



Utilizzate il nostro motore di ricerca

Ricerca
Generic filters

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.