2009-06-03 11 views
9

Estamos usando un repositorio central de git que he clonado y estoy trabajando en una sucursal local.¿Cómo rebase y empuja eficientemente una rama de git local?

Cuando quiero hacer mis cambios disponibles en el repositorio central, tengo que emita los siguientes comandos (a partir del 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 

Me gustaría saber si es posible utilizar menos git comandos para lograr el mismo objetivo. Los varios conmutadores entre master y mybranch son especialmente molestos, ya que nuestro repositorio es bastante grande, por lo que toman un poco de tiempo.

Respuesta

13

No hay necesidad de toca la rama maestra local si no necesitas actualizarla y esto parece estar causando una gran cantidad de cambios de rama innecesarios.

Este es un flujo de trabajo más mínimo.

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 

Si eres muy seguro acerca de un padre cometió, puede saltarse los pasos de comprobación y simplemente hacer lo siguiente, pero yo recomiendo fuertemente contra él. Publicar compromisos no probados no es una "mejor práctica".

git push origin HEAD^:master 
1

Se puede combinar el tirón y rebase en una sola:

git pull maestro --rebase

Pero, en general, sí, desde mi experiencia que involucra todos estos comandos.

Para mantener su repositorio limpio, es útil ejecutar a menudo "git gc" que eliminará los objetos no utilizados. Esto debería reducir el tiempo de cambio de rama.

0

Normalmente hago.

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

Puede definir alias para guardar la escritura, si así lo desea.

6

No es necesario tirar de las ramas master y mybranch. Desde que estás siendo un ciudadano tan agradable y haciendo cambios de avance rápido es bastante sencillo:

# 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 

Por supuesto, también se puede empujar desde su sucursal 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

¿Qué quiere decir con "suponiendo que se trata de una rama de seguimiento remoto"? mybranch es una sucursal local, solo existe en mi propio repositorio. ¿Su solución también funcionará bajo estas circunstancias? – siebert

+0

Una "rama de seguimiento remoto" es en realidad una rama local, excepto que git recuerda un repositorio y una sucursal remotos predeterminados para usar cuando se hace una "extracción". De lo contrario, los comandos 'git push' y 'git pull' tendrían que dar una ubicación de repositorio completa. He aquí un ejemplo de creación de una rama de seguimiento remoto $ git rama feature_x origin/master o $ git checkout -b feature_x origin/master Si deja fuera de la especificación remoto ('origin/master' en este caso) entonces feature_x no es una rama de seguimiento remoto. –