4 Domanda: Git rebase un ramo sopra un altro ramo

domanda creata a Wed, Oct 12, 2016 12:00 AM

Nel mio repository git, ho un ramo Master. Uno degli sviluppatori remoti ha creato un ramo Branch1 e su di esso aveva un sacco di commit. Mi sono ramificato da Branch1, creando un nuovo ramo chiamato Branch2 (git checkout -b Branch2 Branch1) tale che Branch2 capo era sull'ultimo commit aggiunto a Branch1: (Sembra questo)

 
Master---
         \
          Branch1--commit1--commit2
                                   \
                                    Branch2 (my local branch) 

Branch1 ha avuto un numero di modifiche. L'altro dev ha schiacciato i suoi commit e poi ha aggiunto qualche altro commit. Nel frattempo, ho avuto un sacco di cambiamenti nel mio ramo ma non ho ancora commesso nulla. La struttura attuale ha questo aspetto:

 
  Master---
             \
             Branch1--squashed commit1,2--commit3--commit4
                                       \
                                        Branch2 (my local branch)

Ora voglio rebase le mie modifiche sopra a Branch1. Sono estremamente confuso su come andare su questo. So che il primo passo sarà quello di commettere le mie modifiche usando git add . e git commit -m "message". Ma poi spingo? usando git push origin Branch2? o git push origin Branch2 Branch1? L'aiuto è molto necessario e GRANDE apprezzato, anche se posso avere un po 'di come creare un backup del mio ramo, sarà grandioso nel caso mi rovini qualcosa

    
37
  1. 2017-01-16 11: 19: 45Z
4 risposte                              4                         

Prima copia il tuo attuale Branch2:

 
# from Branch2
git checkout -b Branch2_backup

Quindi rebase Branch2 su Branch1:

 
# from Branch2
git fetch origin           # update all tracking branches, including Branch1
git rebase origin/Branch1  # rebase on latest Branch1

Dopo il rebase la struttura della tua diramazione dovrebbe apparire così:

 
master --
         \
          1 -- 2 -- 3 -- 4 -- Branch2'

Nel diagramma sopra, l'apostrofo su Branch2 indica che ogni commit nel Branch2 dopo commit 4 è in realtà una riscrittura.

Ricorda che ora hai riscritto la cronologia di Branch2 e se il ramo è già pubblicato dovrai forzarlo a spingerlo al remoto tramite

 
git push --force origin Branch2

La spinta forzata può causare problemi a chiunque usi Branch2, quindi dovresti fare attenzione quando lo fai.

    
37
2016-10-12 23: 45: 55Z
  1. Cosa succede se ci sono conflitti di merge? Si presenteranno quando faccio un git rebase Branch1? Suppongo che qualsiasi conflitto dovrebbe impedire l'unione e quindi posso correggerli prima di unire i rami
    2016-10-12 23: 26: 58Z
  2. @ newkid101 Ovviamente è possibile che i conflitti di merge vengano eseguiti mentre ogni commit da Branch2 viene riapplicato. Basta risolverli tutti e digitare git rebase --continue quando lo hai fatto.
    2016-10-12 23: 30: 38Z
  3. Dove posso eseguire il commit delle modifiche apportate in Branch2? È anche durante il rebase?
    2016-10-12 23: 35: 45Z
  4. Rebase ricomincerà automaticamente il commit in Branch2. Non devi non eseguire alcun commit manuale.
    2016-10-12 23: 37: 03Z
  5. Certo che voglio le modifiche. Farò un git commit -m "commit message" prima di fare un rebase
    2016-10-12 23: 58: 23Z

git rebase branch1 branch2 rebase il ramo branch2 su branch1. Operativamente, ciò significa che qualsiasi commit contenuto solo in branch2 (e non in branch1) verrà riprodotto sopra branch1, spostando con essi il puntatore branch2. Vedi git rebase --help per ulteriori informazioni, inclusi i diagrammi di questa operazione.

L'operazione potrebbe produrre alcuni conflitti che poi dovrai risolvere manualmente. Modifica i file interessati, unendo il contenuto e rimuovendo eventuali hunk non riusciti. Successivamente, contrassegnare i file come uniti usando git add <file> equindi continua il rebase usando git rebase --continue. Ripeti finché non è terminato.

Una volta fatto, non hai nient'altro da fare. Non devi spingere. Tuttavia, se desideri rispecchiare le tue nuove modifiche in qualche altro repository (ad esempio, per condividerle con altri o per avere quelle modifiche in un altro tuo repository), fai un git push finale.

    
14
2019-05-02 21: 52: 15Z
  1. Mi sento come se ci fosse un errore di battitura qui da qualche parte, ma non so dove. branch2 non è nel comando da nessuna parte e probabilmente dovrebbe essere?
    2017-05-06 10: 54: 54Z
  2. @ Mark, anzi, grazie. branch dovrebbe essere in realtà branch2. L'ho risolto ora.
    2017-05-06 20: 35: 58Z
  3. Attenzione: git rebase -i branch1 branch2 esegue un checkout automatico di branch2, quindi modifica i commit in branch2. branch1 rimane intatto.
    2018-11-19 15: 24: 38Z
  

Voglio rebase le mie modifiche (dal locale branch2) sopra a branch1.

 
git checkout branch2   # Go to your local branch. Use -f to force the checkout.
git reset HEAD --hard  # Drop all non-committed changes.
git rebase branch1     # Rebase on top of branch1. Use -i for an interactive list.

Nota: se un ramo si trova sul telecomando come origin, prefisso il nome del ramo con origin/.

Risoluzione dei problemi

  • Se sei rimasto bloccato nel mezzo del rebase e vuoi ricominciare, esegui:

     
    rm -fr .git/rebase-merge # Abort a rebase-merge mode.
    git reset HEAD --hard    # Reset everything to the current HEAD.
    
  • Se ti trovi sul ramo distaccato (esegui: git branch e cerca il simbolo stella), esegui:

     
    git checkout branch2 -f # and start again.
    
  • Se si verificano conflitti, è necessario risolverli , utilizzare diversi punti di rebasing.

  • Se desideri eseguire rebase manualmente passo dopo passo, usa cherry-picking. Per es.

     
    git reflog              # Note hashes of for your commits.
    git checkout master     # Go to your base branch.
    git cherry-pick C0MM1T1 # Cherry pick first commit based on its hash.
    # Go to the next one or solve the conflicts.
    git cherry-pick C0MM1T2 # Cherry pick another commit and so on.
    
  • Se la tua rebase mostra troppe commit nell'elenco interattivo dopo aver eseguito git rebase branch1 -i, puoi iniziare il tuo rebase dato il commit specifico subito prima delle modifiche, ad es. git rebase pr3v1ios.

3
2018-01-19 13: 54: 38Z

Prima di tutto, devi assicurarti che il tuo riferimento a Branch1 sia aggiornato (in particolare poiché la cronologia è stata modificata).

Se ti piace lavorare con copys locali, puoi fare qualcosa del genere:

 
git push origin Branch2 # this ensures you have at least one copy in your remote
git fetch origin
git checkout Branch1
git reset --hard origin/Branch1
git checkout Branch2
git rebase Branch1 # solve conflicts ... and check that everything is ok
git push -f origin Branch2
    
- 1
2016-10-12 23: 27: 40Z
fonte collocata Qui