Come riformulare la filiale locale con il master remoto


934

Ho un progetto clonato da un ramo master dal repository remoto remote_repo. Creo una nuova filiale e mi impegno per quella filiale. Altri programmatori si sono spinti remote_repoverso il ramo principale.

Ho bisogno ora di reimpostare il mio ramo RB sul remote_repomaster.

Come fare questo? Quali comandi digitare su un terminale?


14
Per me questa domanda è ambigua in quanto "con" potrebbe significare ribasare in entrambe le direzioni. Osservando le risposte, vedo che l'intento è di reimpostare il tuo ramo sul master remoto, non viceversa. Lo cito nel caso in cui qualcuno segua una risposta qui sotto e ottenga il contrario di ciò che desidera.
Glenn Lawrence,

8
@GlennLawrence Penso che sia meglio modificare la domanda originale piuttosto che aggiungere un commento. Questo è anche incoraggiato da StackOverflow. Inoltre, la re-assegnazione del master su RB probabilmente fallirà comunque, perché RB dipende dalla storia del master.
daniel kullmann,

Risposte:


1245

Prima recupera il nuovo master dal repository upstream, quindi modifica il tuo ramo di lavoro su quello:

git fetch origin            # Updates origin/master
git rebase origin/master    # Rebases current branch onto origin/master

Aggiornamento : vedere la risposta di Paul Draper per un modo più conciso di fare lo stesso: le recenti versioni di Git forniscono un modo più semplice di eseguire l'equivalente dei due comandi precedenti.


16
questa è l'unica risposta che fa effettivamente ciò che è stato chiesto
kayaker243,

5
@ kayaker243 No, è lo stesso della risposta di Paul Drapers, ma in forma lunga, penso.
erik,

7
@erik Nota che Paul Draper ha scritto la sua risposta circa un anno e mezzo dopo il commento di kayaker243 (e quasi due anni dopo questa risposta).
Frerich Raabe,

3
Ottengo quanto segue: Your branch and 'origin/b1' have diverged, # and have 3 and 2 different commits each, respectively.sembra che git pullsia necessario un altro . È corretto o mi sto perdendo qualcosa qui?
Dror,

2
@RGC No, git rebase masternon farà lo stesso lavoro come il secondo comando ( git rebase origin/master) in quanto mastere origin/masterpotrebbe puntare a diversi commit (specialmente dato che il primo comando è stato git fetch origin, che può modificare origin/master).
Frerich Raabe,

816
git pull --rebase origin master
# where --rebase[=(false|true|merges|preserve|interactive)]

19
(Equivalente alla risposta di Frerich)
Paul Draper,

12
non è leggermente diverso dalla risposta di Frerich, dal momento che questo commetterà cambiamenti dal maestro dell'origine al maestro locale, mentre la risposta di Frerich lascia intatto il maestro locale? (pull vs. fetch)
Jimmy Huch il

7
No, nella risposta di Frerich, il rebase modifica il maestro locale. Un pull --rebase è la stessa cosa di un fetch seguito da un rebase
adhominem

9
Cordiali saluti, è possibile effettuare ribassi interattivi congit pull --rebase=interactive origin master
emmby

14
@adhominem - Ho controllato la documentazione di git-pull e non riesco a vedere nulla che supporti l'affermazione che il master locale è stato modificato. Se sono su un ramo chiamato deved eseguito git pull --rebase origin master, devverrà modificato solo il ramo master. La --rebasedocumentazione del flag afferma che tenta di rebase the current branch on top of the upstream branch after fetchinge nulla sulla modifica dei rami di localizzazione locali.
Ripristina Monica 2331977 il

227

Dopo aver eseguito le modifiche alla tua filiale, fai il checkout mastere tiralo per ottenere le ultime modifiche dal repository:

git checkout master
git pull origin master

Quindi controlla la tua filiale e modifica le modifiche su master:

git checkout RB
git rebase master

... o ultimi due comandi in una riga:

git rebase master RB

Quando provi a tornare a origin/RB, probabilmente otterrai un errore; se sei l'unico a lavorare RB, puoi forzare push:

git push --force origin RB

... o come segue se git è stato configurato correttamente:

git push -f

4
quando provi a tornare a origin / RB, probabilmente otterrai un errore. Se sei l'unico che lavora su RB, puoi usare push - force RB di origine. fonte: stackoverflow.com/questions/8939977/…
Joey Baruch

1
Ah .... ho esattamente questo. il mio "RB" viene corretto correttamente, ma ricevo infiniti errori quando provo a spingerlo dopo il rebase. A parte la spinta - forza origine RB - esiste un modo "migliore" (non forzato) per farlo? Cerco solo di capire la percezione dei gits qui e fallisco.
Motti Shneor,

2
@MottiShneor No, non esiste un modo carino. Se qualcun altro si spinge nel ramo nel frattempo, le loro modifiche andranno perse! Se vuoi essere gentile con la cronologia del commit di git, dovresti piuttosto unire master nel tuo ramo, il che è sicuro (puoi farne a git pushmeno -f).
Daniel Kullmann,

110

Nota: se si dispone già di ampie conoscenze su rebase, utilizzare sotto un liner per un rebase veloce. Soluzione: supponendo che tu sia nel tuo ramo di lavoro e tu sei l'unica persona che ci lavora.

git fetch && git rebase origin/master

Risolvi eventuali conflitti, testa il tuo codice, esegui il commit e invia nuove modifiche al ramo remoto.

                            ~:   For noobs   :~

I seguenti passaggi potrebbero aiutare chiunque sia nuovo git rebasee volesse farlo senza problemi

Passaggio 1: Supponendo che non ci siano commit e modifiche da apportare su YourBranch a questo punto. Stiamo visitando YourBranch.

git checkout YourBranch
git pull --rebase

Quello che è successo? Estrae tutte le modifiche apportate da altri sviluppatori che lavorano sulla tua filiale e ne modifica le modifiche.

Passaggio 2: risolvere eventuali conflitti che si presentano.

Passaggio 3:

git checkout master
git pull --rebase

Quello che è successo? Estrae tutte le ultime modifiche dal master remoto e ripristina il master locale sul master remoto. Tengo sempre il master remoto pulito e pronto per il rilascio! E, preferisco lavorare solo su master o filiali localmente. Ti consiglio di farlo fino a quando non avrai una mano su git modifiche o commit. Nota: questo passaggio non è necessario se non si gestisce il master locale, ma è possibile eseguire un recupero e il reimpostazione del master remoto direttamente sul ramo locale direttamente. Come ho già detto all'inizio.

Passaggio 4: risolvere eventuali conflitti che si presentano.

Passaggio 5:

git checkout YourBranch
git rebase master

Quello che è successo? Si verifica il rebase sul master

Passaggio 6: risolvere eventuali conflitti, se presenti conflitti. Utilizzare git rebase --continueper continuare il rebase dopo aver aggiunto i conflitti risolti. In qualsiasi momento è possibile utilizzare git rebase --abortper interrompere il rebase.

Passaggio 7:

git push --force-with-lease 

Quello che è successo? Invio delle modifiche al tuo YourBranch remoto. --force-with-leasesi assicurerà se ci sono altre modifiche in arrivo per YourBranch da parte di altri sviluppatori durante la revisione. Questo è super utile piuttosto che forzare la spinta. In caso di modifiche in arrivo, recuperale per aggiornare YourBranch locale prima di inviare le modifiche.

Perché devo spingere le modifiche? Per riscrivere il messaggio di commit in YourBranch remoto dopo il rebase corretto o Se sono stati risolti dei conflitti? Quindi è necessario inviare le modifiche risolte nel repository locale al repository remoto di YourBranch

Yahoooo ...! Hai finito con successo con il rebasing.

Potresti anche cercare di fare:

git checkout master
git merge YourBranch

Quando e perché? Unisci il tuo ramo al master se fatto con modifiche da te e altri co-sviluppatori. Il che rende YourBranch aggiornato con master quando in seguito si voleva lavorare sullo stesso ramo.

                            ~:   (๑ơ ₃ ơ)♥ rebase   :~

A cosa serve: "Estrae tutte le ultime modifiche dal master e ripristina il master sull'ultimo master". Rebase master su master? Non devi solo tirare l'ultimo maestro?
John Little,

@JohnLittle Grazie per averci segnalato. Intendo Pulls latest changes from remote master to local master. I always prefer keeping remote master clean and release ready always!. Aggiornerò la mia descrizione.
bh4r4th

21

Passo 1:

git fetch origin

Passo 2:

git rebase origin/master

Passaggio 3: (risolvere eventuali conflitti)

git add .

Step 4:

git rebase --continue

Passaggio 5:

git push --force

5
Nessuna spiegazione su quale ramo iniziare. Non è una buona risposta.
Karl Morrison,

12

1.Update Master prima ...

git checkout [master branch]
git pull [master branch]

2.Ora rinnova il ramo di origine con il ramo principale

git checkout [source branch]
git rebase [master branch]
git pull [source branch] (remote/source branch)
git push [source branch]

Il ramo di origine IF non esiste ancora sul telecomando, quindi:

git push -u origin [source branch]

"et voilà..."


Mi piace la natura passo-passo di questa risposta. Aiuta a scomporre esattamente ciò che sta accadendo.
Dave Liu,

6

git fetch origin master:master estrae l'ultima versione di master senza bisogno di verificarlo.

Quindi tutto ciò che serve è:

git fetch origin master:master && git rebase master 👌


Non git fetchaggiorna master senza doverlo verificare anche tu? Solo che gli aggiornamenti git fetchnon git mergesono corretti? Quindi se effettuiamo il checkout masternon avrà gli ultimi aggiornamenti. Quindi non è più breve fare sul ramo delle caratteristiche, git fetchallora git rebase origin/master? Non possiamo farlo git rebase masterperché cercheremo di rifondare dallo masterspazio di lavoro, dobbiamo origin/masterottenere da quelli non uniti ma seduti in locale.
Noitidart,
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.