Come rebase in modo efficiente e spingere un ramo git locale?
Domanda
Stiamo usando un repository git centrale che ho clonato e sto lavorando su un ramo 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 utilizzare un minor numero di comandi git per raggiungere lo stesso obiettivo. Le diverse opzioni tra master
e mybranch
sono particolarmente fastidiosi, come il nostro repository è piuttosto grande in modo da richiedere un certo tempo.
Soluzione
Non c'è bisogno di toccare il tuo ramo master locale se non è necessario aggiornarlo e questo sembra essere la causa di un sacco di commutazione ramo inutile.
Si tratta di 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. La pubblicazione di commit non testate non è un 'best practice'.
git push origin HEAD^:master
Altri suggerimenti
Non è necessario fare il tiro su entrambi i master e mybranch rami. 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
È 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 il repository pulito, il suo utile per eseguire spesso "git gc" che rimuoverà gli oggetti inutilizzati. Questo dovrebbe ridurre il tempo di commutazione ramo.
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 risparmiare digitazione, se vi piace quel modo.