2010-06-16 24 views
19

Tengo varias ramas activas en las que necesito trabajar al mismo tiempo. Claramente puedo crear dos directorios de trabajo con una rama distinta por directorio. ¿Es esa la única manera de hacerlo sin tener que "comprometer" y "pagar" para pasar de una rama a otra?git mejores prácticas para cambiar rápidamente de rama

Respuesta

15

Sí, aunque puede usar git stash en lugar de commit si no está listo para finalizar su trabajo actual en progreso.

+1

No tenía conocimiento de este comando.me gusta porque es exactamente lo que estaba pensando. Solo un lugar para poner mis cosas hasta que estuve realmente listo para comprometerme. En la última semana me he comprometido a "chasquear" varias veces para poder cambiar las ramas. Me enfadé muchísimo porque es probable que muchos de esos cambios cambien de nuevo ... Mientras tanto, estos cambios serán públicos para mi equipo cuando lo presione ... algunos de los cuales pueden ser embarazosos. "escondite" debe probarse lo antes posible. ¡Gracias! – Richard

+2

Me alegra ayudar. Es importante darse cuenta, como señaló cweider, que siempre puede reescribir su historial local siempre que no se haya enviado una confirmación. Por ejemplo, si tiene un compromiso "instantáneo" entre otras confirmaciones que desea conservar, puede 'seleccionarlas 'en una rama diferente, luego hacer una' rebase -i' para eliminarla de la otra rama. – dahlbyk

5

git clone, a través del local protocol, es una buena alternativa para poder trabajar en múltiples ramas al mismo tiempo.

Normalmente clono un repositorio desnudo local en múltiples copias (una para cada rama activa), y utilizo ese repositorio desnudo como un repositorio de integración central (ya que puedo enviar fácilmente a un repositorio vacío, en lugar de no poder Repo no descubierto).

+0

Para la justificación de "informe simple", consulte http://stackoverflow.com/questions/2041823/git-how-to-see-pulled-pushed-changes-in-origin/2041865#2041865 por ejemplo – VonC

+1

eso es lo que hizo la gente con svn, ahora puedes usar funciones de ramificación de git, no necesitas muchos repositorios locales. ese es el punto principal de git. –

+3

@GismoRanas Estoy de acuerdo. Estuve escribiendo esto hace más de 4 años;) – VonC

18

Si está cambiando temporalmente las ramas git stash es útil, sin embargo, recuerde que las confirmaciones no necesitan persistir para siempre; puede hacer commits temporales para retroceder más tarde.

Así que mi recomendación es, si se trata de un cambio de varias horas, hacer un git commit en su lugar, porque, dependiendo de su memoria, los escondites pueden ser fáciles de olvidar/perder/etc.

[In MyBranch] 
>$ git commit -m "WIP: Stuff I was working on." 
>$ git checkout AnotherBranch 
[Do Stuff] 
>$ git checkout MyBranch 
>$ git reset HEAD^ 
[Continue] 

Y puesto que esta es una pregunta acerca de las mejores prácticas, recuerde que debe dar su escondite un mensaje útil usando git stash save de lo contrario puede ser difícil de encontrar más tarde.

1

si se está haciendo lo que se llama desarrollo de la rama-per-estelar como se explica aquí:

http://martinfowler.com/bliki/FeatureBranch.html

es posible que desee para asegurar también que cambie los esquemas de bases de datos. Git puede ayudar en esto por medio de la mancha y la limpieza. La administración de múltiples bases de datos localmente es posible. Cuando finaliza la compra de una nueva sucursal, difumina la cadena de conexión para anotar el nombre de la base de datos con el nombre de la sucursal. Si el archivo de configuración se confirma en algún punto, se limpia eliminando el nombre de la rama de la conexión.

Para obtener más información, eche un vistazo a Pro Git book.

3

Me cansé de cambiar de rama y así escribí una más inteligente git checkout. Inserte lo siguiente en su ~/.bash_profile, instálelo y luego simplemente use gch para cambiar a la última rama en la que estaba.

current_git_branch() { 
    git branch | grep \* | awk '{ print $2 }' 
} 
# a smart git checkout, with no args it switches to last branch. 
gch() { 
    if [ -n "$1" ]; then 
     echo `current_git_branch` >"/tmp/last_git_branch_used.txt" 
     git checkout "[email protected]" 
    else 
     if [ ! -f "/tmp/last_git_branch_used.txt" ]; then echo >&2 "ERROR: Please run gch with 1 argument first." 
     else 
      echo `current_git_branch` >"/tmp/last_git_branch_used.temp" 
      git checkout `cat /tmp/last_git_branch_used.txt` 
      mv "/tmp/last_git_branch_used."{temp,txt} 
     fi 
    fi 
} 
+0

¿Sigue así cómo abordaría el problema, un poco más de un año después? Solo curiosidad porque estaba buscando exactamente esto. :) –

+0

Sí, este fragmento exacto todavía está en mi perfil de bash. Una desventaja de esto es que el 'last_git_branch_used.txt' no contiene información sobre el repositorio de git, por lo que si está cambiando de una rama a otra de diferentes repositorios, esto no es tan útil. Pero sigo pensando que he ahorrado un millón de teclas. – skensell

+2

Lo he usado durante los últimos días y me resulta muy útil. Hago la mayor parte de mi trabajo en un repositorio, así que definitivamente es una limitación con la que puedo vivir. Por cierto, funciona bien con zsh (lo cual no es sorprendente, ya que zsh se deriva de bash). Compartiré esto con el resto de mi equipo. ¡Gracias! –

0

que tienen una función fiesta de la siguiente manera:

function gitredocommit { 
    lastcomment=`git log | grep Date -A 2 -m 1 | tail -1 | sed -e 's/^ *//' -e 's/ *$//' | grep -v Merge` 
    if [ -n "$lastcomment" ]; then 
    git reset --soft HEAD^; git add ../; git commit -m"$lastcomment" 
    else 
    echo "last commit was a merge, won't redo it" 
    fi 
} 

Se crea una nueva rama, hacer una primera (y última) se comprometen y luego con esto se puede hacer cosas nuevas y sobrescribir este cometido. Si necesita actualizar desde el maestro lo haces con

git rebase master 

por supuesto, por lo que su compromiso es siempre en la parte superior de la rama. Esto funciona siempre que no combine la rama en el maestro.

+1

¿Es la línea 'lastcomment =' la forma de detectar si un commit es una fusión o no ?? –

+0

vea el final de la línea, use la mágica barra de desplazamiento horizontal. –

+0

Lo siento, ese fue mi intento de decir "Esa es una manera completamente loca de detectar si algo es una confesión de fusión y tiene implicaciones de rendimiento horribles". Intenta usar 'git rev-parse HEAD^2' en su lugar. –