Entiendo que esta es una mala idea para muchos escenarios. Estoy aprendiendo a Git y experimentando. Ningún código será dañado en este ejercicio.¿Cómo cambiar el nombre de los mensajes de confirmación en Git?
He creado una estructura como esta:
* [cf0149e] (HEAD, branch_2) more editing
* [8fcc106] some edit
|
| * [59e643e] (branch_2b) branch 2b
|/
|/
| * [0f4c880] (branch_2_a) branch 2a
|/
|/
* [a74eb2a] checkout 1
* [9a8dd6a] added branch_2 line
|
|
| * [bb903de] (branch_3) branch 3
|/
|
| * [674e08c] (branch_1) commit 1
| * [7d3db01] added branch_1 line
|/
* [328454f] (0.0.0) test
Ahora quiero ir a través de este gráfico y cambiar el nombre de varias confirmaciones de manera que tengan sentido.
Por ejemplo:
* | [a74eb2a] checkout 1
* | [9a8dd6a] added branch_2 line
renamed to:
* | [a74eb2a] branch 2 commit 2
* | [9a8dd6a] branch 2 commit 1
Tenga en cuenta que:
[cf0149e] (HEAD, branch_2) more editing
[59e643e] (branch_2b) branch 2b
[0f4c880] (branch_2_a) branch 2a
están todos ramificado de:
[a74eb2a] checkout 1
He experimentado con
git rebase -i 328454f
luego cambiando "recoger" a "editar" en las confirmaciones que quería modificar y posteriormente se ejecuta
git commit --amend -m "the new message"
como el proceso de rebase continuó.
El problema con este enfoque es que, después del último git rebase --continue
termino con dos nuevos commits (duplicados de los dos que quería cambiar el nombre) en la rama en la que estaba. Por ejemplo, si corría el rebase mientras estaba en CABEZA "branch_2" la gráfica podría ser algo como esto:
* [cf0149e] (HEAD, branch_2) more editing
* [8fcc106] some edit
* [3ff23f0] branch 2 commit 2
* [2f287a1] branch 2 commit 1
|
| * [59e643e] (branch_2b) branch 2b
| /
|/
| | * [0f4c880] (branch_2_a) branch 2a
| |/
| |/
| * [a74eb2a] checkout 1
| * [9a8dd6a] added branch_2 line
|/
|
| * [bb903de] (branch_3) branch 3
|/
|
| * [674e08c] (branch_1) commit 1
| * [7d3db01] added branch_1 line
|/
* [328454f] (0.0.0) test
En otras palabras, ahora tengo dos conjuntos de confirmaciones que representan exactamente el mismo estado de código.
Todo lo que quería hacer era cambiar los mensajes de confirmación.
También quiero cambiar el nombre del mensaje inicial de "prueba" a algo así como "Versión inicial". Parece que no puedo hacerlo con git commit --amend -m "Initial version"
porque termino en modo sin cabeza si pago esa confirmación.
¿Qué estoy haciendo mal? Seguramente no puede ser tan difícil.
EDITAR:
Aquí hay un enfoque que acabo de probar que funciona. Por supuesto, vuelve a escribir la historia. Entonces, fuera de casos muy especiales, es una mala idea. Estos son los pasos:
Verifique la rama que se va a modificar. Crear archivos de revisión:
git format-patch HEAD~x // Where x is how far back from HEAD you need to patch
Editar archivos del parche para cambiar el mensaje de confirmación. Ahora reinicie la cabeza.
git reset --hard HEAD~x // Same x as before
aplicar los parches:
git am 000*
nuevas confirmaciones se crearán nuevos de SHA1. Si ahora cualquier rama necesita hacer referencia a las nuevas confirmaciones con los mensajes corregidos, debe usar git rebase
para moverlos.
Para usar mi propio ejemplo, después de aplicar el procedimiento de parches que terminó arriba con esto:
* [7761415] (HEAD, branch_2) branch 2 commit 4
* [286e1b5] branch 2 commit 3
* [53d638c] branch 2 commit 2
* [52f82f7] branch 2 commit 1
| * [bb903de] (branch_3) branch 3
|/
| * [59e643e] (branch_2b) branch 2b
| | * [0f4c880] (branch_2_a) branch 2a
| |/
| * [a74eb2a] checkout 1
| * [9a8dd6a] added branch_2 line
|/
| * [674e08c] (branch_1) commit 1
| * [7d3db01] added branch_1 line
|/
* [328454f] (0.0.0) test
lo tanto, tengo mi branch_2 comete muy bien marcada. Ahora quiero mover branch_2a de manera que se ramifica de [53d638c] branch 2 commit 2
Pedido branch_2a
git checkout branch_2a
rebase que
git rebase 53d638c
Ahora tengo:
* [fb4d1c5] (HEAD, branch_2a) branch 2a
| * [7761415] (branch_2) branch 2 commit 4
| * [286e1b5] branch 2 commit 3
|/
* [53d638c] branch 2 commit 2
* [52f82f7] branch 2 commit 1
| * [bb903de] (branch_3) branch 3
|/
| * [59e643e] (branch_2b) branch 2b
| * [a74eb2a] checkout 1
| * [9a8dd6a] added branch_2 line
|/
| * [674e08c] (branch_1) commit 1
| * [7d3db01] added branch_1 line
|/
* [328454f] (0.0.0) test
mismo procedimiento con branch_2b da como resultado esto:
* [ca9ff6c] (HEAD, branch_2b) branch 2b
| * [fb4d1c5] (branch_2a) branch 2a
|/
| * [7761415] (branch_2) branch 2 commit 4
| * [286e1b5] branch 2 commit 3
|/
* [53d638c] branch 2 commit 2
* [52f82f7] branch 2 commit 1
| * [bb903de] (branch_3) branch 3
|/
| * [674e08c] (branch_1) commit 1
| * [7d3db01] added branch_1 line
|/
* [328454f] (0.0.0) test
Que es exactamente lo que estaba buscando. No demasiado desordenado. Nuevamente, no es algo que quieras hacer fuera de casos muy especiales. En mi caso, solo estoy jugando para aprender a Git, por lo que lo anterior no afecta realmente a un repositorio de código real. Es bueno saber que puedes hacer esto si es necesario.
Ahora vamos a cambiar el nombre del primer compromiso.
No puede. Se supone que Git no está orientado al servidor. Si lo empujas a otro lugar, eso es todo. –
¿Cómo obtuvieron esos diagramas geniales de sus ramas y todo? ¿Fue eso un comando git o lo dibujaste utilizando ASCII? –