Ottieni modifiche da master a branch in Git


691

Nel mio repository ho un ramo chiamato a aqcui sto lavorando.

Ho quindi commesso nuovi lavori e bug master.

Qual è il modo migliore per ottenere quei commit nella aqfiliale? Creare un altro nuovo ramo da mastere unirlo con aq?


3
In futuro, potresti anche avviare il tuo ramo bugfix da un antenato comune di master e altri rami che avranno bisogno delle correzioni, in modo da poterlo unire in tutti quei rami, senza raccogliere altro.
Cascabel,

2
@Jefromi, ma è fuori dal suo controllo se non è l'unica persona che lavora al progetto. altre persone aggiornano il master. diavolo, tu stesso potresti aggiornare il master da un terzo ramo, e la situazione sarebbe inevitabile e necessiterebbe di una soluzione generale.
ahnbizcad,

@ahnbizcad Sono abbastanza sicuro che abbia il controllo di dove inizia il suo ramo. Se il suo ramo è un antenato comune di quelli in cui vorrà fondersi e le persone successivamente si aggiungeranno a quei rami, sarà comunque un antenato comune.
Cascabel,

ragazzi domanda, fa questo comando,git pull origin my_branch_name
Basheer AL-MOMANI

Risposte:


797

Dai un'occhiata al aqramo e rinnova da master.

git checkout aq
git rebase master

il rebase può venire da qualsiasi altro ramo? Vale a dire. git rebase otherbranch? Sembra che ero un po 'fuori dalla mia domanda, mi sono ramificato da un ramo, quindi ho apportato modifiche al ramo originale.
Slee

2
Se ho ragione, rifare la richiesta pull mostrerà tutti i commit principali. se si utilizza master unione / origine, tutti i commit principali verranno visualizzati come 1 commit, il che semplifica la revisione del codice.
Foo Bar Utente

4
A volte, git mergesarebbe meglio. Se entrambe le filiali si sono evolute nel tempo, dovresti considerare quale è la migliore per te.
erick2red

70
In ritardo alla festa, ma questa è una grande panoramica di quando rebase vs merge: atlassian.com/git/tutorials/merging-vs-rebasing/…
ebuat3989

7
Se i tuoi precedenti commit nella succursale aq sono pubblici, non effettuare il rebase. atlassian.com/git/tutorials/rewriting-history/git-rebase
Hanmant

302

Dovresti essere in grado di farlo proprio git merge origin/masterquando sei nel tuo ramo aq.

git checkout aq
git merge origin/master

55
Se rebase è "migliore" dipende completamente dalla situazione specifica.
Bombe

13
perché non chiami semplicemente "git merge master" invece di "git merge origin / master"?
Michael Küller,

145
Utilizzare rebasese la filiale è locale e non è stata spinta a origin. Utilizzare mergese il ramo è già stato spinto. rebaseriscriverà la storia.
garbagecollector,

17
@Toskan puoi riscontrare problemi in cui il tuo master locale non è aggiornato con il telecomando. In questo modo si assicura che si sta unendo la copia remota del codice.
Chris Kooken,

8
@garbagecollector Sono contro rebase (posso, ma non rifaremo) Non vedo alcun motivo per giocare con rebase. Rende le cose inutilmente complesse. Hai sempre la domanda "Ho spinto questo a distanza?" riflettere ed è un dolore spiegare ai nuovi arrivati. Alcune persone dicono che evita gli impegni di fusione. Ma voglio fare commit di merge. Non sono disordinati, documentano quando i rami vengono uniti. Quindi, per l'ultima volta, possiamo finalmente smettere di comportarci come se tutti ci impegnassimo a padroneggiare? Se non ti piacciono così tanto i merge di commit nel log, basta filtrarli con --no-merges.
Nurettin,

92

Primo check out per padroneggiare:

git checkout master

Apporta tutte le modifiche, hotfix e commit e spingi il tuo master.

Torna al tuo ramo, 'aq', e unisci master in esso:

git checkout aq
git merge master

La tua filiale sarà aggiornata con il master. Un buon esempio di base di unione è 3.2 Git Branching - Basic Branching and Merging .


25

Non vi è alcuna garanzia che le correzioni di bug principali non siano tra gli altri commit, quindi non si può semplicemente unire. Fare

git checkout aq
git cherry-pick commit1
git cherry-pick commit2
git cherry-pick commit3
...

supponendo che tali commit rappresentino le correzioni di bug.

D'ora in poi, mantieni le correzioni dei bug in un ramo separato. Sarai in grado di

git merge hotfixes

quando vuoi farli rotolare tutti nel ramo dev normale.


17

O cherry-pickil pertinente si impegna in succursale aqo unire succursale masterin succursale aq.


5
@Slee ti sei risposto ... non è la soluzione per questa situazione
mtet88

13

Uniscilo con aq

git checkout master
git pull
git checkout aq
git merge --no-ff master
git push

8

Modo semplice

# 1. Create a new remote branch A base on last master
# 2. Checkout A
# 3. Merge aq to A

7

Per me, avevo già apportato modifiche e volevo le ultime novità dal ramo di base. Non ero in grado di fare rebasee cherry-pickavrei impiegato un'eternità, quindi ho fatto quanto segue:

git fetch origin <base branch name>  
git merge FETCH_HEAD

quindi in questo caso:

git fetch origin master  
git merge FETCH_HEAD

7

Questo ( da qui ) ha funzionato per me:

git checkout aq
git pull origin master
...
git push

citando:

git pull origin masterrecupera e unisce il contenuto del ramo principale con il ramo e crea un commit di unione. In caso di conflitti di unione , ti verrà comunicato in questa fase e devi risolvere i commit di unione prima di procedere . Quando sei pronto a inviare i tuoi commit locali, incluso il nuovo commit di merge, sul server remoto, esegui git push.


È importante notare che questa soluzione è perfetta se è richiesta specificamente un'unione , ovvero se il ramo master non può essere riformulato per qualche motivo.
cudacoder,

3

Hai un paio di opzioni. git rebase master aqsul ramo che manterrà i nomi di commit, ma NON SOSTITUIRE se si tratta di un ramo remoto. Puoi git merge master aqfarlo se non ti interessa conservare i nomi di commit. Se si desidera mantenere i nomi di commit ed è un ramo remoto, git cherry-pick <commit hash>i commit sul proprio ramo.


0

Puoi anche farlo eseguendo una singola riga.
git merge aq master

Questo equivale a

git checkout aq
git merge master

Questo non sta facendo quello che pensi che stia facendo. git merge a bunisce i rami ae bil ramo corrente. Ma git merge aquando sei sul ramo anon farai nulla (motivo per cui questo sembra un po 'come quello che pensi che stia facendo). (Vedi git-scm.com/docs/git-merge#Documentation/… .)
MikeBeaton,

0

MODIFICARE:

La mia risposta di seguito documenta un modo in cui unire , masterin aqcui se si visualizzano i dettagli della fusione, vengono elencate le modifiche apportate aqprima della fusione, non le modifiche apportate master. Ho capito che probabilmente non è quello che vuoi, anche se pensi che lo sia!

Appena:

git checkout aq
git merge master

è ok.

Sì, questa semplice unione mostrerà che le modifiche da mastersono state apportate aqa quel punto, non viceversa; ma va bene - dato che è quello che è successo! Più tardi, quando finalmente unisci il tuo ramo master, è allora che una fusione mostrerà finalmente tutte le modifiche apportate master(che è esattamente quello che vuoi, ed è l'impegno in cui le persone si aspetteranno di trovare comunque quelle informazioni).

Ho controllato e anche l'approccio seguente mostra esattamente le stesse modifiche (tutte le modifiche apportate aqdopo la divisione originale tra aqe master) dell'approccio normale sopra, quando alla fine si fondono nuovamente tutti gli elementi master. Quindi penso che il suo unico vero svantaggio (oltre ad essere troppo complesso e non standard ...: - /) è che se si riavvolgono n recenti cambiamenti git reset --hard HEAD~<n>e questo va oltre l'unione, allora la versione seguente torna indietro ramo "sbagliato", che devi correggere manualmente (ad es. con git reflog& git reset --hard [sha]).


[Quindi, quello che precedentemente pensavo fosse:]

Si è verificato un problema con:

git checkout aq
git merge master

perché le modifiche mostrate nel commit di merge (ad esempio se guardi ora o più tardi in Github, Bitbucket o il tuo visualizzatore di cronologia git locale preferito) sono le modifiche apportate sul master, che potrebbe non essere quello che desideri.

D'altro canto

git checkout master
git merge aq

mostra le modifiche apportate in aq, che probabilmente è quello che vuoi. (O almeno, è spesso quello che voglio!) Ma l'unione che mostra i cambiamenti giusti è nel ramo sbagliato!

Come far fronte ?!

Il processo completo, che termina con un commit di unione che mostra le modifiche apportate su aq (come per la seconda unione di cui sopra), ma con l'unione che influenza il ramo di aq, è:

git checkout master
git merge aq
git checkout aq
git merge master
git checkout master
git reset --hard HEAD~1
git checkout aq

Questo: fonde aq su master, fa avanzare rapidamente la stessa unione su aq, lo annulla su master e ti riporta di nuovo su aq!

Sento che mi sto perdendo qualcosa - questo sembra essere qualcosa che ovviamente vorresti, e qualcosa che è difficile da fare.

Inoltre, rebase NON è equivalente. Perde i timestamp e l'identità dei commit effettuati su aq, che non è anche quello che voglio.


0

Scenario :

  • Ho creato un ramo dal master dire branch-1 e l'ho tirato sul mio locale.
  • Il mio amico ha creato un ramo dal maestro dire ramo-2.
  • Ha commesso alcune modifiche al codice da padroneggiare.
  • Ora voglio portare quelle modifiche dal ramo principale al mio ramo locale.

Soluzione

git stash // to save all existing changes in local branch
git checkout master // Switch to master branch from branch-1
git pull // take changes from the master
git checkout branch-1 // switchback to your own branch
git rebase master // merge all the changes and move you git head  forward
git stash apply // reapply all you saved changes 

Puoi trovare conflitti sul tuo file dopo aver eseguito "git stash apply". Devi ripararlo manualmente e ora sei pronto per spingere.

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.