2009-06-03 12 views
9

Utilizziamo un repository git centrale che ho clonato e sto lavorando su una filiale locale.Come rebase e push in modo efficiente un ramo git locale?

Quando voglio fare le mie modifiche disponibili nel repository centrale, devo eseguire i seguenti comandi (a partire dal mybranch):

#Stash local changes not yet ready for checkin 
git stash 

#Make sure we have all changes from the central repository 
git checkout master 
git pull 

#Rebase local changes 
git checkout mybranch 
git rebase 

#Push changes 
git checkout master 
git merge mybranch 
git push 

#Back to my branch and continue work 
git checkout mybranch 
git stash apply 

mi piacerebbe sapere se è possibile usare meno Comandi git per raggiungere lo stesso obiettivo. I vari switch tra master e mybranch sono particolarmente fastidiosi, poiché il nostro repository è piuttosto grande, quindi richiedono un po 'di tempo.

risposta

13

Non v'è alcuna necessità di tocca il tuo ramo principale locale se non hai bisogno di aggiornarlo e questo sembra causare un sacco di cambi di commutazione non necessari.

Questo è un flusso di lavoro più minimale.

git fetch 

# ensure that everything is committed 
# perhaps git commit -a is required... 

git rebase origin/master 


# If you don't want to push the very latest commits you might 
# want to checkout a parent or ancestor of the current commit 
# to test that the proposed commit passes tests, etc. 
# e.g. git checkout HEAD~n 

# push to the remote master 
git push origin HEAD:master 

# if you checked out a parent, go back to the original branch 
git checkout mybranch 

Se siete super-sicuri di un genitore commettere, è possibile saltare i passaggi di pagamento e solo fare quanto segue, ma mi piacerebbe vivamente contro di essa. Pubblicare commit non testati non è una "best practice".

git push origin HEAD^:master 
1

È possibile combinare l'attrazione e rebase in uno:

git pull maestro --rebase

Ma nel complesso, sì, dalla mia esperienza che coinvolge tutti questi comandi.

Per mantenere pulito il repository, è utile eseguire spesso "git gc" che rimuoverà gli oggetti non utilizzati. Questo dovrebbe ridurre il tempo di commutazione del ramo.

0

Lo faccio di solito.

git co master 
git pull 
git rebase master mywrk # fix conflicts if any 
git rebase mywrk master 
git push 

È possibile definire alias per salvare la digitazione, se ti piace in questo modo.

6

Non è necessario eseguire il pull su entrambi i rami master e mybranch. Dal momento che sei stato una bella cittadina come e facendo gli aggiornamenti fast-forward è piuttosto semplice:

# Save local mods not ready for commit 
git stash 
# Do the pull & rebase local work assuming this is a remote tracking branch 
git pull --rebase 
git checkout master 
git merge mybranch 
git push 

Naturalmente, si può anche spingere alla propria filiale mybranch

# Save local mods not ready for commit 
git stash 
# Do the pull & rebase local work assuming this is a remote tracking branch 
git pull --rebase 
git push origin mybranch:master 
+0

Cosa si intende per "assumendo questo è un ramo di monitoraggio a distanza"? mybranch è un ramo locale, solo esistente nel mio repository. La tua soluzione funzionerà anche in queste circostanze? – siebert

+0

Un "ramo di localizzazione remoto" è in realtà solo un ramo locale eccetto che git ricorda un repository remoto e un ramo predefiniti da utilizzare quando si esegue un "pull". In caso contrario, i comandi 'git push' e 'git pull' dovrebbero fornire una posizione completa del repository. Ecco un esempio di creazione di una filiale di monitoraggio a distanza $ git branch feature_x origin/master o $ git checkout -b feature_x origin/master Se si lascia fuori le specifiche remoto ('origin/master' in questo caso) quindi feature_x non è un ramo di monitoraggio remoto. –