2012-03-27 12 views
29

Volví a un viejo proyecto y ejecuté el bonito git status para descubrir qué estaba pasando y ¡me di cuenta de que había demasiadas ramas! Quiero hacer algunas tareas domésticas antes de empezar a trabajar en esto de nuevo, pero no estoy seguro de qué rama proviene de la cual ...GIT - ¿De dónde me ramifiqué?

E.G. ¿"BranchA" deriva de "desarrollar"? ¿"BranchB" deriva de "master" o "branchA" ??

¿Cómo puedo responder a las preguntas de ejemplo anteriores?

+0

¿Has probado 'gitk --all'? – Mat

+0

posible duplicado de [Git: encontrar de qué derivación vino una confirmación] (http://stackoverflow.com/questions/2706797/git-finding-what-branch-a-commit-came-from) – Cascabel

+0

El posible duplicado es realmente un poco endeble - podría ser exactamente lo que quieres para algunas sucursales, pero probablemente no cubra todo. Probablemente debería haberlo vinculado, lo siento. – Cascabel

Respuesta

14

No hay una respuesta canónica para esto, ya que las ramas son simplemente indicadores de ciertas confirmaciones en un DAG. Por ejemplo, master y foo podrían estar apuntando a la misma confirmación; si luego crea una rama desde foo, es efectivamente lo mismo que crear una rama desde master. Dicho esto, si visualizas el gráfico de compromiso (a través de gitk o alguna otra herramienta de historial gráfico), puedes obtener una idea general de dónde están los puntos de bifurcación en el gráfico de compromiso, frente a dónde señalan los distintos apuntadores de bifurcación.

+0

Si usas los "injertos" de git, puedes crear ciclos para que ya no sea un DAG. Aparentemente esto es malo. :-) (No es de extrañar ... aunque en su mayor parte "simplemente funciona" de todos modos, no es que lo haya intentado.) Sospecho que también puedes crear ciclos con 'filter-branch', no es que lo haya intentado tampoco. La fusión directa parece rechazar los intentos de crear ciclos, al menos. – torek

1

Puede utilizar un visor de árbol gráfico, estoy usando gitg para ver las ramas y diffs, aunque estoy usando la línea de comandos para el trabajo real la mayor parte del tiempo.

21

git merge-base le muestra la que es el ancestro común de dos ramas.

Uso simple: git merge-base <branch> <branch> muestra el compromiso común de las dos ramas.

+4

podría mostrar la sintaxis de cómo llamar a esto? – jwfearn

+0

Ver http://git-scm.com/docs/git-merge-base Como indica, usted proporciona dos identificadores de commit para comparar. Entonces, si tienes master y devel branch en algún proyecto, 'git merge-base master devel' te dirá el commit que es el ancestro común de estas dos ramas. – patthoyts

0

Cumpla con una convención de nomenclatura y ahorre toda la confusión.

Al crear una rama desde master, digamos, para implementar una función de correo electrónico, puede ponerle el nombre master_emailfeature. Luego, si necesita crear una sub-bifurcación desde esta rama para implementar ssl para correos electrónicos, puede asignarle el nombre master_emailfeature_sslandtls.

Esto deja en claro qué rama se creó con solo mirar el nombre de la rama.

0

Si desea saber de qué derivación remota se deriva su rama local, este comando puede arrojar algo de luz.

git remote show origin 

de desplazamiento hacia abajo hasta que vea "ramas locales configurados para 'git pull':" y debajo de eso, se visualiza una lista de todas sus ramas locales y la rama remota cada uno se fusionará con.

Cuestiones relacionadas