Flujo de trabajo de desarrollo #
Ya tiene su propia copia bifurcada del repositorio de Matplotlib , siguiendo Hacer su propia copia (bifurcación) de Matplotlib . Ha configurado su bifurcación . Ha configurado git siguiendo Configure git . Ahora estás listo para un trabajo real.
Resumen del flujo de trabajo #
En lo que sigue, nos referiremos a la main
rama ascendente de Matplotlib como "troncal".
No uses tu
main
sucursal para nada. Considere eliminarlo.Cuando esté iniciando un nuevo conjunto de cambios, obtenga cualquier cambio del tronco e inicie una nueva rama de características a partir de eso.
Cree una nueva rama para cada conjunto separable de cambios: "una tarea, una rama" ( flujo de trabajo de ipython git ).
Asigne un nombre a su rama a los fines de los cambios, por ejemplo,
bugfix-for-issue-14
orefactor-database-code
.Si puede evitarlo, evite fusionar troncales o cualquier otra rama en su rama característica mientras está trabajando.
Si se encuentra fusionándose desde el troncal, considere Rebasar en el troncal
Pregunta en la lista de correo de Matplotlib si te quedas atascado.
¡Pide revisión de código!
Esta forma de trabajar ayuda a mantener el trabajo bien organizado, con un historial legible. Esto, a su vez, facilita que los mantenedores del proyecto (que podrías ser tú) vean lo que has hecho y por qué lo hiciste.
Consulte el flujo de trabajo de linux git y el flujo de trabajo de ipython git para obtener alguna explicación.
Considere eliminar su rama principal #
Puede sonar extraño, pero eliminar su propia main
rama puede ayudar a reducir la confusión sobre en qué rama se encuentra. Consulte la eliminación de main en github para obtener más información.
Actualice el espejo del baúl #
En primer lugar, asegúrese de haber realizado la vinculación de su repositorio con el repositorio original .
De vez en cuando, debe obtener los cambios ascendentes (troncal) de github:
git fetch upstream
Esto extraerá cualquier confirmación que no tenga y configurará las ramas remotas para que apunten a la confirmación correcta. Por ejemplo, 'troncal' es la rama a la que hace referencia (remoto/nombre de la sucursal) upstream/main
y, si ha habido confirmaciones desde la última vez que lo comprobó, upstream/main
cambiará después de realizar la búsqueda.
Hacer una nueva rama de función #
Cuando esté listo para realizar algunos cambios en el código, debe iniciar una nueva rama. Las ramas que son para una colección de ediciones relacionadas a menudo se denominan "ramas de funciones".
Crear una nueva rama para cada conjunto de cambios relacionados facilitará que alguien que revise su rama vea lo que está haciendo.
Elija un nombre informativo para la sucursal para recordarse a sí mismo y al resto de nosotros para qué sirven los cambios en la sucursal. Por ejemplo add-ability-to-fly
, o
bugfix-for-issue-42
.
# Update the mirror of trunk
git fetch upstream
# Make new feature branch starting at current trunk
git branch my-new-feature upstream/main
git checkout my-new-feature
En general, querrá mantener sus ramas de características en su bifurcación pública de github
de Matplotlib . Para hacer esto, empujas esta nueva rama a tu repositorio de github. Generalmente (si siguió las instrucciones en estas páginas y de forma predeterminada), git tendrá un enlace a su repositorio de github, llamado origin
. Subes a tu propio repositorio en github con:
git push origin my-new-feature
En git >= 1.7 puedes asegurarte de que el enlace esté configurado correctamente usando la
--set-upstream
opción:
git push --set-upstream origin my-new-feature
A partir de ahora, git sabrá que my-new-feature
está relacionado con la
my-new-feature
rama en el repositorio de github.
El flujo de trabajo de edición #
Resumen #
# hack hack
git add my_new_file
git commit -am 'NF - some message'
git push
Con más detalle #
Haz algunos cambios
Vea con qué archivos han cambiado (consulte el estado de git ). Verás una lista como esta:
git status
# On branch ny-new-feature # Changed but not updated: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: README # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # INSTALL no changes added to commit (use "git add" and/or "git commit -a")
Compruebe cuáles son los cambios reales con ( git diff ).
git diff
Agregue cualquier archivo nuevo al control de versiones (consulte git add ).
git add new_file_name
Para confirmar todos los archivos modificados en la copia local de su repositorio, haga . Tenga en cuenta las opciones para . La bandera solo indica que va a escribir un mensaje en la línea de comando. La bandera, puedes confiar en ella, o ¿ves por qué la bandera -a? — y la útil descripción del caso de uso en el problema de la copia de trabajo enredada . La página del manual de git commit también puede ser útil.
git commit -am 'A commit message'
-am
commit
m
a
Para enviar los cambios a su repositorio bifurcado en github, haga (vea git push ).
git push
Pida que se revisen o fusionen sus cambios #
Cuando esté listo para pedirle a alguien que revise su código y considere una fusión:
Vaya a la URL de su repositorio bifurcado, digamos
https://github.com/your-user-name/matplotlib
.Use el menú desplegable 'Cambiar sucursales' cerca de la parte superior izquierda de la página para seleccionar la sucursal con sus cambios:
Haga clic en el botón 'Extraer solicitud':
Introduzca un título para el conjunto de cambios y alguna explicación de lo que ha hecho. Di si hay algo por lo que te gustaría prestar especial atención, como un cambio complicado o algún código con el que no estés satisfecho.
Si no cree que su solicitud esté lista para fusionarse, simplemente dígalo en su mensaje de solicitud de extracción. Esta sigue siendo una buena manera de obtener una revisión preliminar del código.
Algunas otras cosas que quizás quieras hacer #
Eliminar una rama en github #
git checkout main
# delete branch locally
git branch -D my-unwanted-branch
# delete branch on github
git push origin :my-unwanted-branch
Tenga en cuenta los dos puntos :
antes my-unwanted-branch
. Consulte también:
https://help.github.com/articles/pushing-to-a-remote/#deleting-a-remote-branch-or-tag
Varias personas compartiendo un solo repositorio #
Si desea trabajar en algunas cosas con otras personas, donde todos se comprometen en el mismo repositorio, o incluso en la misma rama, simplemente compártalo a través de github.
Primero bifurque Matplotlib en su cuenta, a partir de Hacer su propia copia (bifurcación) de Matplotlib .
Luego, vaya a la página de github de su repositorio bifurcado, digamos
https://github.com/your-user-name/matplotlib
Haga clic en el botón 'Administrar' y agregue a cualquier otra persona al repositorio como colaborador:
Ahora todas esas personas pueden hacer:
git clone https://github.com/your-user-name/matplotlib.git
Recuerda que los enlaces que empiezan por https
o git@
son de lectura-escritura, y que
git@
utilizan el protocolo ssh.
Luego, sus colaboradores pueden comprometerse directamente en ese repositorio con lo habitual:
git commit -am 'ENH - much better code'
git push origin main # pushes directly into your repo
Explora tu repositorio #
Para ver una representación gráfica de las ramas y confirmaciones del repositorio:
gitk --all
Para ver una lista lineal de confirmaciones para esta rama:
git log
También puede mirar el visualizador de gráficos de red para su repositorio de github.
Finalmente, el alias de salida de registro Fancy lg
le dará un gráfico razonable basado en texto del repositorio.
Rebasando en troncal #
Digamos que pensó en algún trabajo que le gustaría hacer. Actualiza el espejo del tronco y crea
una nueva rama de características llamada
cool-feature
. En esta etapa, el tronco está en algún compromiso, llamémoslo E. Ahora realiza algunos compromisos nuevos en su cool-feature
rama, llamémoslos A, B, C. Tal vez sus cambios tomen un tiempo, o regrese a ellos después de un tiempo. Mientras tanto, el tronco ha progresado desde la confirmación E hasta la confirmación (digamos) G:
A---B---C cool-feature
/
D---E---F---G trunk
En esta etapa, considera fusionar el tronco con su rama de función, y recuerda que esta página aquí le advierte severamente que no lo haga, porque el historial se desordenará. La mayoría de las veces, solo puede solicitar una revisión y no preocuparse de que el maletero se haya adelantado un poco. Pero a veces, los cambios en el tronco pueden afectar sus cambios y necesita armonizarlos. En esta situación, es posible que prefiera hacer una rebase.
rebase toma sus cambios (A, B, C) y los reproduce como si se hubieran realizado en el estado actual de trunk
. En otras palabras, en este caso, toma los cambios representados por A, B, C y los reproduce encima de G. Después de la reorganización, su historial se verá así:
A'--B'--C' cool-feature
/
D---E---F---G trunk
Ver rebase sin lágrimas para más detalles.
Para hacer una rebase en el tronco:
# Update the mirror of trunk
git fetch upstream
# go to the feature branch
git checkout cool-feature
# make a backup in case you mess up
git branch tmp cool-feature
# rebase cool-feature onto trunk
git rebase --onto upstream/main upstream/main cool-feature
En esta situación, en la que ya está en la rama cool-feature
, el último comando se puede escribir de manera más sucinta como:
git rebase upstream/main
Cuando todo se ve bien, puede eliminar su rama de respaldo:
git branch -D tmp
Si no se ve bien, es posible que deba echar un vistazo a Recuperación de errores .
Si ha realizado cambios en los archivos que también han cambiado en el tronco, esto puede generar conflictos de combinación que debe resolver; consulte la página del manual de git rebase para obtener algunas instrucciones al final de la sección "Descripción". Hay algo de ayuda relacionada con la fusión en el manual de usuario de git; consulte la resolución de una fusión .
Recuperarse de los errores #
A veces, estropeas fusiones o rebases. Afortunadamente, en git es relativamente sencillo recuperarse de tales errores.
Si te equivocas durante un rebase:
git rebase --abort
Si notas que te equivocaste después del rebase:
# reset branch back to the saved point
git reset --hard tmp
Si olvidó hacer una rama de respaldo:
# look at the reflog of the branch
git reflog show cool-feature
8630830 [email protected]{0}: commit: BUG: io: close file handles immediately
278dd2a [email protected]{1}: rebase finished: refs/heads/my-feature-branch onto 11ee694744f2552d
26aa21a [email protected]{2}: commit: BUG: lib: make seek_gzip_factory not leak gzip obj
...
# reset the branch to where it was before the botched rebase
git reset --hard [email protected]{2}
Reescribiendo el historial de confirmaciones #
Nota
Haga esto solo para sus propias ramas de funciones.
¿Hay un error tipográfico vergonzoso en una confirmación que hiciste? O tal vez cometiste varios comienzos en falso que te gustaría que la posteridad no viera.
Esto se puede hacer a través de la reorganización interactiva .
Supongamos que el historial de confirmación se ve así:
git log --oneline
eadc391 Fix some remaining bugs
a815645 Modify it so that it works
2dec1ac Fix a few bugs + disable
13d7934 First implementation
6ad92e5 * masked is now an instance of a new object, MaskedConstant
29001ed Add pre-nep for a copule of structured_array_extensions.
...
y 6ad92e5
es la última confirmación en la cool-feature
rama. Supongamos que queremos hacer los siguientes cambios:
Vuelva a escribir el mensaje de compromiso para
13d7934
algo más sensato.Combina las confirmaciones
2dec1ac
,a815645
,eadc391
en una sola.
Hacemos lo siguiente:
# make a backup of the current state
git branch tmp HEAD
# interactive rebase
git rebase -i 6ad92e5
Esto abrirá un editor con el siguiente texto:
pick 13d7934 First implementation
pick 2dec1ac Fix a few bugs + disable
pick a815645 Modify it so that it works
pick eadc391 Fix some remaining bugs
# Rebase 6ad92e5..eadc391 onto 6ad92e5
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
Para lograr lo que queremos, le haremos los siguientes cambios:
r 13d7934 First implementation
pick 2dec1ac Fix a few bugs + disable
f a815645 Modify it so that it works
f eadc391 Fix some remaining bugs
Esto significa que (i) queremos editar el mensaje de confirmación para
13d7934
y (ii) colapsar las últimas tres confirmaciones en una sola. Ahora guardamos y salimos del editor.
Git abrirá inmediatamente un editor para editar el mensaje de confirmación. Después de revisarlo, obtenemos el resultado:
[detached HEAD 721fc64] FOO: First implementation
2 files changed, 199 insertions(+), 66 deletions(-)
[detached HEAD 0f22701] Fix a few bugs + disable
1 files changed, 79 insertions(+), 61 deletions(-)
Successfully rebased and updated refs/heads/my-feature-branch.
y la historia ahora se ve así:
0f22701 Fix a few bugs + disable
721fc64 ENH: Sophisticated feature
6ad92e5 * masked is now an instance of a new object, MaskedConstant
Si salió mal, la recuperación es posible nuevamente como se explicó anteriormente .