È sbagliato gettare i rami della forza di spinta?

9

Quando lavoro su un ramo di funzionalità, tendo a voler ripulire i commit nel ramo usando un rebase interattivo prima che il mio lavoro venga esaminato e integrato nel ramo principale.

Durante lo sviluppo della funzione, voglio spingere il mio lavoro intermedio al repository remoto come misura di backup. Cioè quando il mio disco rigido si arresta, non voglio che il mio intero ramo funzioni vada perso.

Tuttavia, questo porta al fatto che spesso devo fare un git push --force al repository remoto dopo un rebase, un'azione generalmente disapprovata. O come dice la pagina github collegata:

Because changing your commit history can make things difficult for everyone else using the repository, it's considered bad practice to rebase commits when you've already pushed to a repository.

Esiste una politica (generalmente accettata) che risolve questo conflitto?

Perché questo non è un duplicato di È il la "Regola d'oro della ribellione" è così essenziale?

La mia domanda qui richiede un criterio per risolvere il conflitto tra il desiderio di eseguire il backup del tuo lavoro nel repository remoto e ribaltare il tuo lavoro , mentre l'altra domanda cerca di negare che c'è un conflitto e chiede perché alcune persone pensano che il conflitto esista del tutto, e quindi chiede perché "è essenziale" non spingere i ribelli forzati?

    
posta Chiel ten Brinke 14.03.2016 - 14:33
fonte

2 risposte

4

La domanda chiave da porsi:

  • Mantieni la tua diramazione remota dopo essersi riuniti in master?

Se elimini il tuo ramo di funzionalità remoto dopo l'unione in master, stai già perdendo la cronologia. Supponendo di schiacciare / ribaltare il ramo prima di fare la tua unione / PR, perdi questa storia. Tutto ciò che la tua forza spinge sta facendo in questo caso ti consente di usare github come backup.

La situazione in cui si vorrebbe mantenere la cronologia e non forzare la spinta è se il ramo remoto è persistente dopo essere stato unito e non solo esistente per un periodo di tempo temporaneo.

I suppose you're asking if I would keep the unrebased branch? No, AFAIC. Still, push forcing it might theoretically result in loss of commits from other users who pushed to the same branch

Sembra che tu abbia più persone che spingono contemporaneamente verso quel ramo. Questo significa che fa si preoccupa della cronologia sul ramo.

Quello che potresti fare invece per il tuo lavoro intermedio è creare un fork di quel ramo. Puoi spingere a questo e quindi rebase tutti i tuoi commit in un singolo commit prima di unire, quindi quando li unisci al tuo branch di funzionalità, hai solo 1 commit (con la cronologia di base dell'intero ramo).

    
risposta data 14.03.2016 - 14:44
fonte
3

Sto elencando alcune possibilità qui che mi passano per la testa.

Rebase sempre su un nuovo ramo

Quando si ha un ramo disordinato some-feature , rebase su un nuovo ramo. Per es.

$ git checkout -b some-feature-rebase
$ git rebase -i master # etc..

Quindi hai some-feature-rebase revisionato e integrato.

Problema: Un grosso problema qui è che, in senso stretto, hai bisogno di un nuovo ramo per ogni rebase. (Potresti avere più rebase se apporti modifiche dopo una revisione del codice, per esempio)

Utilizza git push --force-with-lease

Ho appena saputo della git push --force-with-lease alternativa a git push --force , quale

refuses to update a branch unless it is the state that we expect; i.e. nobody has updated the branch upstream.

Problema : sembra migliorare direttamente la situazione in cui utilizziamo solo --force , ma presenta ancora alcuni avvertimenti, in particolare quando faccio un git fetch invece di un git pull , che aggiorna i nostri rami upstream locali, ingannando --force-with-lease nel pensare che non siano state apportate modifiche non intervenute sul ramo remoto.

    
risposta data 14.03.2016 - 16:32
fonte

Leggi altre domande sui tag