Los objetivos de diseño de Git incluyen velocidad, integridad de datos y soporte para flujos de trabajo distribuidos y no lineales: miles de ramas paralelas que se ejecutan en diferentes computadoras. [10] [11] [12]
Git fue creado para su uso en el desarrollo del kernel de Linux por Linus Torvalds y otros desarrolladores del kernel. [13]
Al igual que con la mayoría de los otros sistemas de control de versiones distribuidos, y a diferencia de la mayoría de los sistemas cliente-servidor , Git mantiene una copia local de todo el repositorio , también conocido como repo, con capacidades de seguimiento de versiones e historial, independientemente del acceso a la red o un servidor central . Un repositorio se almacena en cada computadora en un directorio estándar con archivos ocultos adicionales para proporcionar capacidades de control de versiones. [14] Git proporciona características para sincronizar cambios entre repositorios que comparten historial; copiados (clonados) entre sí. Para la colaboración, Git admite la sincronización con repositorios en máquinas remotas . Aunque todos los repositorios (con el mismo historial) son pares, los desarrolladores a menudo usan un servidor central para alojar un repositorio para mantener una copia integrada.
Torvalds quería un sistema distribuido que pudiera utilizar como BitKeeper, pero ninguno de los sistemas libres disponibles satisfacía sus necesidades. Citó un ejemplo de un sistema de gestión de control de código fuente que necesitaba 30 segundos para aplicar un parche y actualizar todos los metadatos asociados, y señaló que esto no sería escalable a las necesidades del desarrollo del núcleo Linux, donde la sincronización con otros mantenedores podría requerir 250 acciones de este tipo a la vez. Para su criterio de diseño, especificó que la aplicación del parche no debería tardar más de tres segundos, y agregó tres objetivos más: [10]
Tomemos el Sistema de Versiones Concurrentes (CVS) como ejemplo de lo que no se debe hacer; en caso de duda, tome la decisión exactamente opuesta. [12]
Admite un flujo de trabajo distribuido similar a BitKeeper. [12]
Incluir salvaguardas muy fuertes contra la corrupción, ya sea accidental o maliciosa. [11]
Estos criterios eliminaron todos los sistemas de control de versiones en uso en ese momento, por lo que inmediatamente después del lanzamiento del desarrollo del kernel de Linux 2.6.12-rc2, Torvalds se propuso escribir el suyo propio. [12]
El desarrollo de Git comenzó el 3 de abril de 2005. [24] Torvalds anunció el proyecto el 6 de abril y se convirtió en autohospedador al día siguiente. [24] [25] La primera fusión de múltiples ramas tuvo lugar el 18 de abril. [26] Torvalds logró sus objetivos de rendimiento; el 29 de abril, el naciente Git fue evaluado registrando parches en el árbol del núcleo de Linux a una velocidad de 6,7 parches por segundo. [27] El 16 de junio, Git logró el lanzamiento del núcleo 2.6.12. [28]
El 26 de julio de 2005, Torvalds entregó el mantenimiento a Junio Hamano, uno de los principales colaboradores del proyecto. [29] Hamano fue responsable del lanzamiento de la versión 1.0 el 21 de diciembre de 2005. [30]
Nombramiento
Torvalds bromeó sarcásticamente sobre el nombre git (que significa "persona desagradable" en la jerga inglesa británica ): "Soy un bastardo egoísta y nombro a todos mis proyectos con mi nombre. Primero ' Linux ', ahora 'git'". [31] [32] La página del manual describe a Git como "el estúpido rastreador de contenido". [33]
El archivo read-me del código fuente explica con más detalle: [34]
"Git" puede significar cualquier cosa, dependiendo de tu estado de ánimo.
Combinación aleatoria de tres letras que se puede pronunciar y que no se utiliza en ningún comando común de UNIX. El hecho de que sea una pronunciación incorrecta de "get" puede ser relevante o no.
Estúpido. Despreciable y despreciable. Sencillo. Elige la palabra que quieras del diccionario de jerga.
"Rastreador de información global": estás de buen humor y realmente te funciona. Los ángeles cantan y, de repente, una luz llena la habitación.
"Maldito camión idiota lleno de mierda": cuando se rompe.
El código fuente de Git se refiere al programa como "el administrador de información del infierno".
Características
Diseño
El diseño de Git es una síntesis de la experiencia de Torvalds con Linux en el mantenimiento de un gran proyecto de desarrollo distribuido, junto con su profundo conocimiento del rendimiento del sistema de archivos obtenido en el mismo proyecto y la necesidad urgente de producir un sistema funcional en poco tiempo. Estas influencias llevaron a las siguientes opciones de implementación: [13]
Fuerte apoyo al desarrollo no lineal
Git admite la creación rápida de ramas y fusiones, e incluye herramientas específicas para visualizar y navegar por un historial de desarrollo no lineal. En Git, una suposición básica es que un cambio se fusionará con más frecuencia de la que se escribe, ya que se transmite a varios revisores. En Git, las ramas son muy ligeras: una rama es solo una referencia a una confirmación.
Desarrollo distribuido
Al igual que Darcs , BitKeeper , Mercurial , Bazaar y Monotone , Git proporciona a cada desarrollador una copia local del historial de desarrollo completo, y los cambios se copian de un repositorio a otro. Estos cambios se importan como ramas de desarrollo agregadas y se pueden fusionar de la misma manera que una rama desarrollada localmente. [35]
Compatibilidad con sistemas y protocolos existentes
Torvalds ha descrito a Git como muy rápido y escalable, [37] y las pruebas de rendimiento realizadas por Mozilla [38] mostraron que era un orden de magnitud más rápido que Mercurial y GNU Bazaar al comparar repositorios grandes ; obtener el historial de versiones de un repositorio almacenado localmente puede ser cien veces más rápido que obtenerlo del servidor remoto. [39]
Autenticación criptográfica del historial
El historial de Git se almacena de tal manera que el ID de una versión en particular (un commit en términos de Git) depende del historial de desarrollo completo que condujo a ese commit. Una vez que se publica, no es posible cambiar las versiones anteriores sin que se note. La estructura es similar a un árbol de Merkle , pero con datos agregados en los nodos y las hojas. [40] ( Mercurial y Monotone también tienen esta propiedad).
Diseño basado en kits de herramientas
Git fue diseñado como un conjunto de programas escritos en C y varios scripts de shell que proporcionan envoltorios alrededor de esos programas. [41] Aunque la mayoría de esos scripts han sido reescritos desde entonces en C para mayor velocidad y portabilidad, el diseño permanece y es fácil encadenar los componentes. [42]
Estrategias de fusión conectables
Como parte del diseño de su conjunto de herramientas, Git tiene un modelo bien definido de una fusión incompleta y tiene múltiples algoritmos para completarla, culminando en informar al usuario que no puede completar la fusión automáticamente y que es necesaria una edición manual. [43]
La interrupción de operaciones o la reversión de cambios dejarán objetos sueltos e inútiles en la base de datos. Por lo general, estos son una pequeña fracción del historial de objetos deseados en constante crecimiento. Git realizará automáticamente la recolección de basura cuando se hayan creado suficientes objetos sueltos en el repositorio. La recolección de basura se puede llamar explícitamente usando git gc. [44] [45]
Empaquetado periódico explícito de objetos
Git almacena cada objeto recién creado como un archivo separado. Aunque se comprime individualmente, esto ocupa una gran cantidad de espacio y es ineficiente. Esto se soluciona mediante el uso de paquetes que almacenan una gran cantidad de objetos comprimidos en delta entre sí en un archivo (o flujo de bytes de red) llamado packfile . Los paquetes se comprimen utilizando la heurística de que los archivos con el mismo nombre probablemente sean similares, sin depender de esto para su corrección. Se crea un archivo de índice correspondiente para cada packfile, que indica el desplazamiento de cada objeto en el packfile. Los objetos recién creados (con el historial recién agregado) aún se almacenan como objetos individuales, y se necesita un reempaquetado periódico para mantener la eficiencia del espacio. El proceso de empaquetado del repositorio puede ser muy costoso computacionalmente. Al permitir que los objetos existan en el repositorio en un formato suelto pero generado rápidamente, Git permite que la costosa operación de empaquetado se posponga hasta más tarde, cuando el tiempo importa menos, por ejemplo, al final de una jornada laboral. Git realiza el reempaquetado periódico de forma automática, pero también es posible el reempaquetado manual con el git gccomando . [46] Para la integridad de los datos, tanto el archivo de paquete como su índice tienen una suma de comprobación SHA-1 [47] en su interior, y el nombre de archivo del archivo de paquete también contiene una suma de comprobación SHA-1. Para comprobar la integridad de un repositorio, ejecute el git fsckcomando. [48] [49]
Otra propiedad de Git es que captura instantáneas de los árboles de directorios de los archivos. Los primeros sistemas para rastrear versiones de código fuente, el Sistema de Control de Código Fuente (SCCS) y el Sistema de Control de Revisión (RCS), trabajaban en archivos individuales y enfatizaban el ahorro de espacio que se obtenía de las versiones (en su mayoría similares) con deltas intercalados (SCCS) o codificación delta (RCS). Los sistemas de control de revisión posteriores mantuvieron esta noción de que un archivo tiene una identidad a lo largo de múltiples revisiones de un proyecto. Sin embargo, Torvalds rechazó este concepto. [50] En consecuencia, Git no registra explícitamente las relaciones de revisión de archivos en ningún nivel por debajo del árbol de código fuente.
Desventajas
Estas relaciones de revisión implícitas tienen algunas consecuencias importantes:
Es ligeramente más costoso examinar el historial de cambios de un archivo que el de todo el proyecto. [51] Para obtener un historial de los cambios que afectan a un archivo determinado, Git debe recorrer el historial global y luego determinar si cada cambio modificó ese archivo. Sin embargo, este método de examinar el historial permite a Git producir con igual eficiencia un único historial que muestra los cambios en un conjunto arbitrario de archivos. Por ejemplo, un subdirectorio del árbol de fuentes más un archivo de encabezado global asociado es un caso muy común.
Los cambios de nombre se manejan de forma implícita en lugar de explícita. Una queja común con CVS es que utiliza el nombre de un archivo para identificar su historial de revisión, por lo que mover o cambiar el nombre de un archivo no es posible sin interrumpir su historial o cambiar el nombre del historial y, por lo tanto, hacer que el historial sea inexacto. La mayoría de los sistemas de control de revisión posteriores a CVS resuelven esto al darle a un archivo un nombre único de larga duración (análogo a un número de inodo ) que sobrevive al cambio de nombre. Git no registra dicho identificador, y esto se afirma como una ventaja. [52] [53] Los archivos de código fuente a veces se dividen o fusionan, o simplemente se renombran, [54] y registrar esto como un simple cambio de nombre congelaría una descripción inexacta de lo que sucedió en el historial (inmutable). Git aborda el problema detectando cambios de nombre mientras se navega por el historial de instantáneas en lugar de registrarlo al hacer la instantánea. [55] (En resumen, dado un archivo en la revisión N , un archivo del mismo nombre en la revisión N − 1 es su ancestro predeterminado. Sin embargo, cuando no hay un archivo con el mismo nombre en la revisión N − 1, Git busca un archivo que existió solo en la revisión N − 1 y es muy similar al nuevo archivo). Sin embargo, requiere un trabajo más intensivo de CPU cada vez que se revisa el historial, y hay varias opciones disponibles para ajustar la heurística. Este mecanismo no siempre funciona; a veces, un archivo que se renombra con cambios en la misma confirmación se lee como una eliminación del archivo anterior y la creación de un nuevo archivo. Los desarrolladores pueden evitar esta limitación confirmando el cambio de nombre y los cambios por separado.
Estrategias de fusión
Git implementa varias estrategias de fusión; se puede seleccionar una estrategia no predeterminada en el momento de la fusión: [56]
recursivo : este es el valor predeterminado al extraer o fusionar una rama, y es una variante del algoritmo de fusión de tres vías.
Cuando hay más de un ancestro común que se puede utilizar para una fusión de tres vías, se crea un árbol fusionado de los ancestros comunes y se lo utiliza como árbol de referencia para la fusión de tres vías. Se ha informado que esto da como resultado menos conflictos de fusión sin causar fusiones incorrectas según las pruebas realizadas en confirmaciones de fusión anteriores tomadas del historial de desarrollo del kernel de Linux 2.6. Además, esto puede detectar y manejar fusiones que involucran cambios de nombre.
— Linus Torvalds [57]
Pulpo : Este es el valor predeterminado cuando se fusionan más de dos cabezas.
En muchos sentidos, puedes ver a Git simplemente como un sistema de archivos: es direccionable por contenido y tiene una noción de control de versiones, pero realmente lo diseñé abordando el problema desde el punto de vista de una persona de sistemas de archivos (hey, los kernels son lo que hago) y, en realidad, no tengo absolutamente ningún interés en crear un sistema SCM tradicional.
A partir de este enfoque de diseño inicial, Git ha desarrollado el conjunto completo de características esperadas de un SCM tradicional, [59] con características que se crean principalmente según sea necesario y luego se perfeccionan y amplían con el tiempo.
Git tiene dos estructuras de datos : un índice mutable (también llamado etapa o caché ) que almacena en caché información sobre el directorio de trabajo y la próxima revisión que se confirmará; y una base de datos de objetos que almacena objetos inmutables.
El índice sirve como punto de conexión entre la base de datos de objetos y el árbol de trabajo.
Un blob es el contenido de un archivo . Los blobs no tienen un nombre de archivo propio, marcas de tiempo ni otros metadatos (el nombre de un blob internamente es un hash de su contenido). En Git, cada blob es una versión de un archivo, en el que se encuentran los datos del archivo. [61]
Un objeto de árbol es el equivalente de un directorio. Contiene una lista de nombres de archivos, [62] cada uno con algunos bits de tipo y una referencia a un objeto blob o de árbol que es el contenido de ese archivo, enlace simbólico o directorio. Estos objetos son una instantánea del árbol de origen. (En total, esto comprende un árbol Merkle , lo que significa que solo un único hash para el árbol raíz es suficiente y realmente se usa en las confirmaciones para señalar con precisión el estado exacto de las estructuras de árbol completas de cualquier número de subdirectorios y archivos).
Un objeto de confirmación vincula objetos de árbol entre sí para formar un historial. Contiene el nombre de un objeto de árbol (del directorio de origen de nivel superior), una marca de tiempo, un mensaje de registro y los nombres de cero o más objetos de confirmación principales. [63]
Un objeto de etiqueta es un contenedor que contiene una referencia a otro objeto y puede contener metadatos adicionales relacionados con otro objeto. Por lo general, se utiliza para almacenar una firma digital de un objeto de confirmación correspondiente a una versión particular de los datos que Git rastrea. [64]
Un objeto packfile recopila varios otros objetos en un paquete comprimido en zlib para lograr compacidad y facilidad de transporte a través de protocolos de red. [65]
Cada objeto se identifica mediante un hash SHA-1 de su contenido. Git calcula el hash y utiliza este valor para el nombre del objeto. El objeto se coloca en un directorio que coincide con los dos primeros caracteres de su hash. El resto del hash se utiliza como nombre de archivo para ese objeto.
Git almacena cada revisión de un archivo como un blob único. Las relaciones entre los blobs se pueden encontrar examinando el árbol y los objetos de confirmación. Los objetos recién agregados se almacenan en su totalidad mediante la compresión zlib. Esto puede consumir una gran cantidad de espacio en disco rápidamente, por lo que los objetos se pueden combinar en paquetes , que utilizan la compresión delta para ahorrar espacio y almacenan los blobs como sus cambios en relación con otros blobs.
Además, Git almacena etiquetas llamadas refs (abreviatura de referencias) para indicar las ubicaciones de varias confirmaciones. Se almacenan en la base de datos de referencia y son respectivamente: [66]
Cabezas (ramas) : referencias con nombre que se avanzan automáticamente a la nueva confirmación cuando se realiza una confirmación encima de ellas.
CABEZA : Una cabeza reservada que se comparará con el árbol de trabajo para crear una confirmación.
Etiquetas : como referencias de ramas, pero fijadas a una confirmación en particular. Se utilizan para etiquetar puntos importantes en el historial.
git init, que se utiliza para crear un repositorio git.
git clone [URL], que clona o duplica un repositorio git desde una URL externa.
git add [file], que agrega un archivo al directorio de trabajo de git (archivos que están a punto de confirmarse).
git commit -m [commit message], que confirma los archivos del directorio de trabajo actual (por lo que ahora son parte del historial del repositorio).
Se puede crear un archivo .gitignore en un repositorio Git como un archivo de texto sin formato. Git no rastreará los archivos enumerados en el archivo .gitignore . [69] : 3–4 Esta función se puede utilizar para ignorar archivos con claves o contraseñas, varios archivos extraños y archivos grandes (que GitHub se negará a cargar). [70]
Referencias de Git
Todos los objetos de la base de datos de Git a los que no se hace referencia pueden limpiarse mediante un comando de recolección de basura o de forma automática. Un objeto puede ser referenciado por otro objeto o por una referencia explícita. Git tiene diferentes tipos de referencias. Los comandos para crear, mover y eliminar referencias varían. git show-refenumera todas las referencias. Algunos tipos son:
cabezas : se refiere a un objeto localmente,
remotos : se refiere a un objeto que existe en un repositorio remoto,
stash : se refiere a un objeto que aún no se ha confirmado,
meta : por ejemplo , una configuración en un repositorio vacío, derechos de usuario; el espacio de nombres refs/meta/config se introdujo retrospectivamente y lo utiliza Gerrit , [71]
etiquetas : ver arriba.
Implementaciones
Git (la implementación principal en C) se desarrolla principalmente en Linux , aunque también es compatible con la mayoría de los sistemas operativos principales, incluidos los BSD ( DragonFly BSD , FreeBSD , NetBSD y OpenBSD ), Solaris , macOS y Windows . [72] [73]
El primer puerto de Windows de Git fue principalmente un marco de emulación de Linux que aloja la versión de Linux. Instalar Git bajo Windows crea un directorio de Archivos de programa con un nombre similar que contiene el puerto Mingw-w64 de la Colección de compiladores GNU , Perl 5, MSYS2 (en sí mismo una bifurcación de Cygwin , un entorno de emulación similar a Unix para Windows) y varios otros puertos de Windows o emulaciones de utilidades y bibliotecas de Linux. Actualmente, las compilaciones nativas de Windows de Git se distribuyen como instaladores de 32 y 64 bits. [74] El sitio web oficial de Git actualmente mantiene una compilación de Git para Windows, que aún usa el entorno MSYS2. [75]
La implementación de Git en JGit es una biblioteca de software Java pura , diseñada para ser incorporada en cualquier aplicación Java. JGit se utiliza en la herramienta de revisión de código Gerrit y en EGit, un cliente Git para el IDE Eclipse . [76]
Go-git es una implementación de código abierto de Git escrita en Go puro . [77] Actualmente se utiliza para respaldar proyectos como una interfaz SQL para repositorios de código Git [78] y para proporcionar cifrado para Git. [79]
Dulwich es una implementación de Git escrita en Python puro con soporte para CPython 3.6 y posteriores y Pypy. [80]
La implementación libgit2 de Git es una biblioteca de software ANSI C sin otras dependencias, que se puede crear en múltiples plataformas, incluidas Windows, Linux, macOS y BSD. [81] Tiene enlaces para muchos lenguajes de programación, incluidos Ruby , Python y Haskell . [82] [83] [84]
JS-Git es una implementación en JavaScript de un subconjunto de Git. [85]
GameOfTrees es una implementación de código abierto de Git para el proyecto OpenBSD. [86]
Servidor Git
Como Git es un sistema de control de versiones distribuido, se puede utilizar como servidor de forma inmediata. Se envía con un comando integrado git daemonque inicia un servidor TCP simple que se ejecuta en el protocolo Git. [87] [88] Los servidores HTTP de Git dedicados ayudan (entre otras características) agregando control de acceso, mostrando el contenido de un repositorio de Git a través de las interfaces web y administrando múltiples repositorios. Los repositorios de Git ya existentes se pueden clonar y compartir para que otros los usen como un repositorio centralizado. También se puede acceder a ellos a través de un shell remoto simplemente teniendo el software de Git instalado y permitiendo que un usuario inicie sesión. [89] Los servidores de Git generalmente escuchan en el puerto TCP 9418. [90]
Código abierto
Alojamiento del servidor Git mediante el binario Git. [91]
Gerrit , un servidor Git configurable para admitir revisiones de código y brindar acceso a través de ssh, un Apache MINA o OpenSSH integrado, o un servidor web Jetty integrado . Gerrit proporciona integración para LDAP, Active Directory, OpenID, OAuth, Kerberos/GSSAPI, certificados de cliente X509 https. Con Gerrit 3.0, todas las configuraciones se almacenarán como repositorios Git y no se requiere ninguna base de datos para ejecutarse. Gerrit tiene una función de solicitud de extracción implementada en su núcleo, pero carece de una GUI para ello.
Phabricator , una rama de Facebook. Como Facebook utiliza principalmente Mercurial , la compatibilidad con Git no es tan destacada. [92]
Proyectos externos como gitolite, [93] que proporcionan scripts sobre el software Git para proporcionar un control de acceso detallado.
Existen otras soluciones FLOSS para autoalojamiento, entre las que se incluyen Gogs, [94] Gitea , una bifurcación de Gogs, así como Forgejo , que a su vez es una bifurcación de Gitea. Gogs, así como los dos derivados mencionados anteriormente, se desarrollan utilizando el lenguaje Go . Las tres soluciones están disponibles bajo la licencia MIT .
Servidor Git como servicio
Existen muchas ofertas de repositorios Git como servicio. Los más populares son GitHub , SourceForge , Bitbucket y GitLab . [95] [17] [18] [19] [20]
Interfaces gráficas
Git, un potente sistema de control de versiones, puede resultar abrumador con su interfaz de línea de comandos. Los clientes GUI de Git ofrecen una interfaz gráfica de usuario (GUI) para simplificar la interacción con los repositorios de Git.
Estas GUI brindan representaciones visuales del historial de su proyecto, incluidas las ramas, las confirmaciones y los cambios de archivos. También agilizan acciones como preparar cambios, crear confirmaciones y administrar ramas. Las herramientas de comparación visual ayudan a resolver conflictos de fusión que surgen del desarrollo simultáneo.
Git viene con una GUI Tcl/Tk , que permite a los usuarios realizar acciones como crear y modificar confirmaciones, crear y fusionar ramas e interactuar con repositorios remotos. [96]
Además de la GUI oficial, existen muchas interfaces de terceros que proporcionan características similares a la GUI oficial distribuida con Git, como GitHub Desktop, SourceTree y TortoiseGit. [97]
Los clientes GUI hacen que Git sea más fácil de aprender y usar, lo que mejora la eficiencia del flujo de trabajo y reduce los errores. Las opciones más populares incluyen GitKraken Desktop (freemium) y Sourcetree (gratis/pago) multiplataforma, u opciones específicas de la plataforma como GitHub Desktop (gratis) para Windows/macOS y TortoiseGit (gratis) para Windows.
Lista de clientes GUI
Si bien Git proporciona herramientas GUI integradas (git-gui, gitk), una gama más amplia de opciones de terceros satisfacen las preferencias del usuario específicas de la plataforma.
La Fundación Eclipse informó en su encuesta comunitaria anual que, a partir de mayo de 2014, Git es ahora la herramienta de gestión de código fuente más utilizada, con un 42,9% de desarrolladores de software profesionales que informan que utilizan Git como su sistema principal de control de código fuente [98] en comparación con el 36,3% en 2013, el 32% en 2012; o para las respuestas de Git excluyendo el uso de GitHub : 33,3% en 2014, 30,3% en 2013, 27,6% en 2012 y 12,8% en 2011. [99] El directorio de código abierto Black Duck Open Hub informa una aceptación similar entre los proyectos de código abierto. [100]
Stack Overflow ha incluido el control de versiones en su encuesta anual para desarrolladores [101] en 2015 (16.694 respuestas), [102] 2017 (30.730 respuestas), [103] 2018 (74.298 respuestas) [104] y 2022 (71.379 respuestas). [15] Git fue el gran favorito de los desarrolladores que respondieron a estas encuestas, con un 93,9 % en 2022.
Sistemas de control de versiones utilizados por los desarrolladores que respondieron:
El sitio web de empleos de TI del Reino Unido itjobswatch.co.uk informa que a fines de septiembre de 2016, el 29,27 % de las ofertas de trabajo permanentes de desarrollo de software del Reino Unido han citado Git, [105] por delante del 12,17 % para Microsoft Team Foundation Server , [106] el 10,60 % para Subversion , [107] el 1,30 % para Mercurial , [108] y el 0,48 % para Visual SourceSafe . [109]
Extensiones
Existen muchas extensiones de Git , como Git LFS, que comenzó como una extensión de Git en la comunidad de GitHub y ahora es ampliamente utilizada por otros repositorios. Las extensiones suelen ser desarrolladas y mantenidas de forma independiente por diferentes personas, pero en algún momento en el futuro, una extensión ampliamente utilizada puede fusionarse con Git.
Otras extensiones de Git de código abierto incluyen:
git-annex , un sistema de sincronización de archivos distribuido basado en Git
git-flow, un conjunto de extensiones de Git para proporcionar operaciones de repositorio de alto nivel para el modelo de ramificación de Vincent Driessen
git-machete, un organizador de repositorios y una herramienta para automatizar operaciones de rebase/fusión/extracción/envío
Microsoft desarrolló la extensión Virtual File System for Git (VFS for Git; anteriormente Git Virtual File System o GVFS) para manejar el tamaño del árbol de código fuente de Windows como parte de su migración de 2017 desde Perforce . VFS for Git permite que los repositorios clonados utilicen marcadores de posición cuyo contenido se descarga solo una vez que se accede a un archivo. [110]
Convenciones
Git se puede utilizar de distintas maneras, pero algunas convenciones se adoptan comúnmente.
El comando para crear un repositorio local, git init , crea una rama llamada master . [61] [111] A menudo se utiliza como la rama de integración para fusionar cambios en. [112] Dado que el remoto ascendente predeterminado se llama origin , [113] la rama remota predeterminada es origin/master . Algunas herramientas como GitHub y GitLab crean una rama predeterminada llamada main en su lugar. [114] [115] Además, los usuarios pueden agregar y eliminar ramas y elegir cualquier rama para integrar.
Las confirmaciones enviadas generalmente no se sobrescriben, sino que se revierten [116] al confirmar otro cambio que revierte una confirmación anterior. Esto evita que las confirmaciones compartidas sean inválidas porque la confirmación en la que se basan no existe en el remoto. Si las confirmaciones contienen información confidencial, deben eliminarse, lo que implica un procedimiento más complejo para reescribir el historial.
El flujo de trabajo git-flow [117] y las convenciones de nombres se adoptan a menudo para distinguir los historiales inestables específicos de las características (feature/*), los historiales compartidos inestables (develop), los historiales listos para producción (main) y los parches de emergencia para productos lanzados (hotfix).
Una solicitud de extracción , también conocida como solicitud de fusión , es una solicitud de un usuario para fusionar una rama en otra rama. [118] [119] Git en sí no proporciona solicitudes de extracción, pero es una característica común de los servicios en la nube de Git. La función subyacente de una solicitud de extracción no es diferente a la de un administrador de un repositorio que extrae cambios de otro remoto (el repositorio que es la fuente de la solicitud de extracción). Sin embargo, la solicitud de extracción en sí es un ticket administrado por el servidor de alojamiento que realiza estas acciones; no es una característica de Git SCM.
Seguridad
Git no proporciona mecanismos de control de acceso, pero fue diseñado para funcionar con otras herramientas que se especializan en el control de acceso. [120]
El 17 de diciembre de 2014, se encontró un exploit que afectaba a las versiones de Windows y macOS del cliente Git. Un atacante podría ejecutar código arbitrario en un equipo de destino con Git instalado creando un árbol Git malicioso (directorio) llamado .git (un directorio en los repositorios Git que almacena todos los datos del repositorio) en un caso diferente (como .GIT o .Git, necesario porque Git no permite que la versión en minúsculas de .git se cree manualmente) con archivos maliciosos en el subdirectorio .git/hooks (una carpeta con archivos ejecutables que ejecuta Git) en un repositorio que el atacante creó o en un repositorio que el atacante puede modificar. Si un usuario de Windows o Mac descarga una versión del repositorio con el directorio malicioso y luego cambia a ese directorio, el directorio .git se sobrescribirá (debido a la característica de no distinguir entre mayúsculas y minúsculas de los sistemas de archivos de Windows y Mac) y los archivos ejecutables maliciosos en .git/hooks pueden ejecutarse, lo que hace que se ejecuten los comandos del atacante. Un atacante también podría modificar el archivo de configuración .git/config , lo que le permite crear alias maliciosos de Git (alias para comandos de Git o comandos externos) o modificar alias existentes para ejecutar comandos maliciosos cuando se ejecutan. La vulnerabilidad fue parcheada en la versión 2.2.1 de Git, lanzada el 17 de diciembre de 2014, y anunciada al día siguiente. [121] [122]
La versión 2.6.1 de Git, publicada el 29 de septiembre de 2015, contenía un parche para una vulnerabilidad de seguridad (CVE-2015-7545) [123] que permitía la ejecución de código arbitrario. [124] La vulnerabilidad era explotable si un atacante podía convencer a una víctima de clonar una URL específica, ya que los comandos arbitrarios estaban incrustados en la propia URL. [125] Un atacante podía utilizar la vulnerabilidad a través de un ataque de intermediario si la conexión no estaba cifrada, [125] ya que podía redirigir al usuario a una URL de su elección. Los clones recursivos también eran vulnerables ya que permitían al controlador de un repositorio especificar URL arbitrarias a través del archivo gitmodules. [125]
Git utiliza hashes SHA-1 internamente. Linus Torvalds ha respondido que el hash era principalmente para protegerse contra la corrupción accidental, y la seguridad que brinda un hash criptográficamente seguro era solo un efecto secundario accidental, ya que la seguridad principal era firmar en otro lugar. [126] [127] Desde una demostración del ataque SHAttered contra Git en 2017, Git se modificó para usar una variante SHA-1 resistente a este ataque. Desde febrero de 2020 se está escribiendo un plan para la transición de la función hash. [128]
^ Solo GPL-2.0 desde el 11 de abril de 2005. Algunas partes están sujetas a licencias compatibles, como LGPLv2.1 . [6]
^ abcdefghijklmnopqrs No aparece como opción en esta encuesta
Citas
^ «Revisión inicial de «git», el gestor de información del infierno». GitHub . 8 de abril de 2005. Archivado desde el original el 16 de noviembre de 2015 . Consultado el 20 de diciembre de 2015 .
^ "Gráfico de confirmaciones". GitHub . 8 de junio de 2016. Archivado desde el original el 20 de enero de 2016 . Consultado el 19 de diciembre de 2015 .
^ Junio C Hamano (7 de octubre de 2024). "[ANUNCIO] Git v2.47.0" . Consultado el 8 de octubre de 2024 .
^ "Sitio web de Git". Archivado desde el original el 9 de junio de 2022 . Consultado el 9 de junio de 2022 .
^ "Espejo de código fuente de Git". GitHub . Archivado desde el original el 3 de junio de 2022 . Consultado el 9 de junio de 2022 .
^ "Licencia LGPL de Git en github.com". GitHub . 20 de mayo de 2011. Archivado desde el original el 11 de abril de 2016 . Consultado el 12 de octubre de 2014 .
^ "Licencia GPL de Git en github.com". GitHub . 18 de enero de 2010. Archivado desde el original el 11 de abril de 2016 . Consultado el 12 de octubre de 2014 .
^ "Tech Talk: Linus Torvalds on git (at 00:01:30)". 14 de mayo de 2007. Archivado desde el original el 20 de diciembre de 2015. Consultado el 20 de julio de 2014 en YouTube.
^ Chacon y Straub 2014, págs. 29–31.
^ ab Torvalds, Linus (7 de abril de 2005). "Re: Kernel SCM saga..." linux-kernel (Lista de correo). Archivado desde el original el 1 de julio de 2019 . Consultado el 3 de febrero de 2017 ."Estoy escribiendo algunos scripts para intentar rastrear las cosas mucho más rápido".
^ ab Torvalds, Linus (10 de junio de 2007). "Re: fatal: grave inconsistencia en la inflación". git (lista de correo).
^ abcd Linus Torvalds (3 de mayo de 2007). Google tech talk: Linus Torvalds on git. El evento ocurre a las 02:30. Archivado desde el original el 28 de mayo de 2007. Consultado el 16 de mayo de 2007 .
^ ab "Una breve historia de Git". Pro Git (2.ª ed.). Apress. 2014. Archivado desde el original el 25 de diciembre de 2015 . Consultado el 26 de diciembre de 2015 .
^ Chacón, Scott (24 de diciembre de 2014). Pro Git (2ª ed.). Nueva York, Nueva York: Apress . págs. 29 y 30. ISBN978-1-4842-0077-3Archivado desde el original el 25 de diciembre de 2015.
^ ab "Encuesta para desarrolladores de Stack Overflow 2022". Stack Overflow . Consultado el 4 de agosto de 2022 .
^ Krill, Paul (28 de septiembre de 2016). "Guerras de repositorios empresariales: GitHub vs. GitLab vs. Bitbucket". InfoWorld . Consultado el 2 de febrero de 2020 .
^ ab "github.com Análisis competitivo, combinación de marketing y tráfico". Alexa . Archivado desde el original el 31 de marzo de 2013 . Consultado el 2 de febrero de 2020 .
^ ab "sourceforge.net Análisis competitivo, combinación de marketing y tráfico". Alexa . Archivado desde el original el 20 de octubre de 2020 . Consultado el 2 de febrero de 2020 .
^ ab "bitbucket.org Análisis competitivo, combinación de marketing y tráfico". Alexa . Archivado desde el original el 23 de junio de 2017 . Consultado el 2 de febrero de 2020 .
^ ab "gitlab.com Análisis competitivo, combinación de marketing y tráfico". Alexa . Archivado desde el original el 30 de noviembre de 2017 . Consultado el 2 de febrero de 2020 .
^ Brown, Zack (27 de julio de 2018). "Una historia sobre el origen de Git". Linux Journal . Linux Journal. Archivado desde el original el 13 de abril de 2020 . Consultado el 28 de mayo de 2020 .
^ "BitKeeper y Linux: ¿el final del camino?". Linux.com . 11 de abril de 2005. Consultado el 18 de mayo de 2023 .
^ McAllister, Neil (2 de mayo de 2005). «El error de Linus Torvalds con BitKeeper». InfoWorld . Archivado desde el original el 26 de agosto de 2015. Consultado el 8 de septiembre de 2015 .
^ ab Torvalds, Linus (27 de febrero de 2007). "Re: Trivia: ¿Cuándo se autoalojó Git?". git (Lista de correo).
^ Torvalds, Linus (6 de abril de 2005). "La saga Kernel SCM". kernel-linux (lista de correo).
^ Torvalds, Linus (17 de abril de 2005). "¡La primera fusión real de núcleos con Git!". git (Lista de correo).
^ Mackall, Matt (29 de abril de 2005). "Evaluación comparativa de Mercurial 0.4b vs git patchbomb". git (lista de correo).
^ Torvalds, Linus (17 de junio de 2005). "Linux 2.6.12". git-commits-head (Lista de correo).
^ Torvalds, Linus (27 de julio de 2005). "Conozca al nuevo mantenedor". git (Lista de correo).
^ Hamano, Junio C. (21 de diciembre de 2005). "Anuncio: Git 1.0.0". git (lista de correo).
^ "GitFaq: ¿Por qué el nombre 'Git'?". Git.or.cz. Archivado desde el original el 23 de julio de 2012. Consultado el 14 de julio de 2012 .
^ "Tras la polémica, Torvalds empieza a trabajar en 'git'". PC World . 14 de julio de 2012. Archivado desde el original el 1 de febrero de 2011. Torvalds parecía consciente de que su decisión de abandonar BitKeeper también sería polémica. Cuando se le preguntó por qué llamaba al nuevo software 'git', una expresión del argot británico que significa 'una persona podrida', dijo: 'Soy un cabrón egoísta, así que nombro a todos mis proyectos con mi nombre. Primero Linux, ahora git'.
^ "Página del manual de git(1)". Archivado desde el original el 21 de junio de 2012 . Consultado el 21 de julio de 2012 .
^ "Revisión inicial de 'git', el gestor de información del infierno · git/git@e83c516". GitHub . Archivado desde el original el 8 de octubre de 2017 . Consultado el 21 de enero de 2016 .
^ "Git – Flujos de trabajo distribuidos". Git . Archivado desde el original el 22 de octubre de 2014 . Consultado el 15 de junio de 2020 .
^ Gunjal, Siddhesh (19 de julio de 2019). "¿Qué es la herramienta de control de versiones? Explora Git y GitHub". Medium . Consultado el 25 de octubre de 2020 .
^ Torvalds, Linus (19 de octubre de 2006). "Re: Tabla de comparación de VCS". git (Lista de correo).
^ Blog de Jst en Mozillazine «rendimiento de bzr/hg/git». Archivado desde el original el 29 de mayo de 2010. Consultado el 12 de febrero de 2015 .
^ Dreier, Roland (13 de noviembre de 2006). "Oh, qué alivio". Archivado desde el original el 16 de enero de 2009., observando que "git log" es 100 veces más rápido que "svn log" porque este último debe contactar un servidor remoto.
^ "Confianza". Conceptos de Git . Manual del usuario de Git. 18 de octubre de 2006. Archivado desde el original el 22 de febrero de 2017.
^ Torvalds, Linus. "Re: Tabla de comparación de VCS". git (Lista de correo) . Consultado el 10 de abril de 2009 ., que describe el diseño orientado a scripts de Git
^ iabervon (22 de diciembre de 2005). "Git rocks!". Archivado desde el original el 14 de septiembre de 2016., elogiando la capacidad de creación de scripts de Git.
^ "Git – Wiki de Git SCM". git.wiki.kernel.org . Consultado el 25 de octubre de 2020 .
^ Chacón y Straub 2014.
^ "Manual del usuario de Git". 10 de marzo de 2020. Archivado desde el original el 10 de mayo de 2020.
^ Chacon y Straub 2014, pág. 499.
^ Chacon y Straub 2014, págs. 33–34.
^ ab "Git – Archivos de paquetes". Git .
^ Chacon y Straub 2014, pág. 568.
^ Torvalds, Linus (10 de abril de 2005). "Re: más actualizaciones de Git". linux-kernel (Lista de correo).
^ Haible, Bruno (11 de febrero de 2007). "¿Cómo acelerar 'git log'?". git (Lista de correo).
^ Torvalds, Linus (1 de marzo de 2006). "Re: cambios de nombre impuros / seguimiento del historial". git (lista de correo).
^ Hamano, Junio C. (24 de marzo de 2006). "Re: Errores al gitificar GCC y Binutils". git (Lista de correo).
^ Hamano, Junio C. (23 de marzo de 2006). "Re: Errores al gitificar GCC y Binutils". git (Lista de correo).
^ Torvalds, Linus (28 de noviembre de 2006). "Re: git y bzr". git (Lista de correo)., sobre el uso git-blamepara mostrar el código movido entre archivos fuente.
^ Torvalds, Linus (18 de julio de 2007). «git-merge(1)». Archivado desde el original el 16 de julio de 2016.
^ Torvalds, Linus (18 de julio de 2007). «CrissCrossMerge». Archivado desde el original el 13 de enero de 2006.
^ Torvalds, Linus (10 de abril de 2005). "Re: más actualizaciones de Git..." linux-kernel (Lista de correo).
^ Torvalds, Linus (23 de marzo de 2006). "Re: Errores al gitificar GCC y Binutils". git (Lista de correo). Archivado desde el original el 22 de marzo de 2021 . Consultado el 3 de febrero de 2017 .
^ "Git – Objetos Git". Git .
^ ab Chacon & Straub 2014, págs. 81–83.
^ Chacon y Straub 2014, págs. 485–488.
^ Chacon y Straub 2014, págs. 488–490.
^ Chacon y Straub 2014, págs. 495–496.
^ Chacon y Straub 2014, págs. 497–501.
^ "Git – Referencias de Git". Git .
^ "Hoja de trucos de Git" (PDF) . education.github.com . Consultado el 10 de junio de 2024 .
^ "Tutorial de Git" (PDF) . web.stanford.edu . Consultado el 10 de junio de 2024 .
^ "Introducción rápida a Git" (PDF) . data-skills.github.io . Consultado el 10 de junio de 2024 .
^ Ba Tran, Andrew. "Mejores prácticas para subir material a GitHub" (PDF) . journalismcourses.org . Consultado el 10 de junio de 2024 .
^ "Formato de archivo de configuración del proyecto". Gerrit Code Review . Archivado desde el original el 3 de diciembre de 2020. Consultado el 2 de febrero de 2020 .
^ "Descargas". Archivado desde el original el 8 de mayo de 2012 . Consultado el 14 de mayo de 2012 .
^ "versiones de paquetes git – Repology". Archivado desde el original el 19 de enero de 2022 . Consultado el 30 de noviembre de 2021 .
^ "msysGit". GitHub . Archivado desde el original el 10 de octubre de 2016 . Consultado el 20 de septiembre de 2016 .
^ "JGit". Archivado desde el original el 31 de agosto de 2012 . Consultado el 24 de agosto de 2012 .
^ "Git – go-git". Git . Consultado el 19 de abril de 2019 .
^ "Interfaz SQL para repositorios Git, escrita en Go.", github.com , consultado el 19 de abril de 2019
^ "Keybase lanza Git encriptado". keybase.io . Consultado el 19 de abril de 2019 .
^ "Dulwich GitHub Repository README.md". GitHub . Archivado desde el original el 29 de abril de 2024 . Consultado el 29 de abril de 2024 .
^ "libgit2". GitHub . Archivado desde el original el 11 de abril de 2016 . Consultado el 24 de agosto de 2012 .
^ "rugged". GitHub . Archivado desde el original el 24 de julio de 2013 . Consultado el 24 de agosto de 2012 .
^ "pygit2". GitHub . Archivado desde el original el 5 de agosto de 2015 . Consultado el 24 de agosto de 2012 .
^ "hlibgit2". Archivado desde el original el 25 de mayo de 2013. Consultado el 30 de abril de 2013 .
^ "js-git: una implementación de Git en JavaScript". GitHub . Archivado desde el original el 7 de agosto de 2013 . Consultado el 13 de agosto de 2013 .
^ "Juego de árboles". gameoftrees.org . Consultado el 10 de marzo de 2024 .
^ Chacon y Straub 2014, págs. 138-139.
^ "Git – Git Daemon". Git . Consultado el 10 de julio de 2019 .
^ 4.4 Git en el servidor: configuración del servidor Archivado el 22 de octubre de 2014 en Wayback Machine , Pro Git.
^ "1.4 Primeros pasos: instalación de Git". Git. Archivado desde el original el 2 de noviembre de 2013. Consultado el 1 de noviembre de 2013 .
^ Chacon, Scott; Straub, Ben (2014). "Git en el servidor: configuración del servidor". Pro Git (2.ª ed.). Apress. ISBN978-1484200773.
^ Guía del usuario de Diffusion: alojamiento de repositorios Archivado el 20 de septiembre de 2020 en Wayback Machine .
^ "Gitolite: alojamiento de repositorios Git".
^ "Gogs: un servicio Git autohospedado y sin complicaciones".
^ "Lo más destacado de Git 2.26". El blog de GitHub . 22 de marzo de 2020. Archivado del original el 22 de marzo de 2021 . Consultado el 25 de noviembre de 2020 . Es posible que recuerdes cuando Git presentó una nueva versión de su protocolo de búsqueda de red en 2018. Ese protocolo ahora se usa de forma predeterminada en 2.26, así que refresquemos nuestros conocimientos sobre lo que eso significa. El mayor problema con el protocolo anterior es que el servidor enumeraba inmediatamente todas las ramas, etiquetas y otras referencias en el repositorio antes de que el cliente tuviera la oportunidad de enviar algo. Para algunos repositorios, esto podría significar enviar megabytes de datos adicionales, cuando el cliente realmente solo quería saber sobre la rama maestra. El nuevo protocolo comienza con la solicitud del cliente y proporciona una forma para que el cliente le diga al servidor en qué referencias está interesado. Obtener una sola rama solo preguntará sobre esa rama, mientras que la mayoría de los clones solo preguntarán sobre ramas y etiquetas. Esto puede parecer todo, pero los repositorios de servidores pueden almacenar otras referencias (como el encabezado de cada solicitud de extracción abierta en el repositorio desde su creación). Ahora, las recuperaciones de repositorios grandes mejoran en velocidad, especialmente cuando la recuperación en sí es pequeña, lo que hace que el costo del anuncio de referencia inicial sea más caro en términos relativos. ¡Y la mejor parte es que no necesitará hacer nada! Debido a un diseño inteligente, cualquier cliente que hable el nuevo protocolo puede funcionar sin problemas con servidores antiguos y nuevos, volviendo al protocolo original si el servidor no lo admite. La única razón para la demora entre la introducción del protocolo y su conversión en predeterminado fue permitir que los primeros usuarios descubrieran cualquier error.
^ "Git - Documentación de git-gui". Git . Consultado el 1 de julio de 2024 .
^ "Git - Clientes GUI". Git . Consultado el 1 de julio de 2024 .
^ "Resultados de la encuesta sobre la comunidad Eclipse 2014 | Ian Skerrett". Ianskerrett.wordpress.com. 23 de junio de 2014. Archivado desde el original el 25 de junio de 2014 . Consultado el 23 de junio de 2014 .
^ "Resultados de la encuesta comunitaria Eclipse 2012". eclipse.org. Archivado desde el original el 11 de abril de 2016.
^ "Comparación de repositorios – Open Hub". Archivado desde el original el 7 de septiembre de 2014.
^ "Encuesta anual para desarrolladores de Stack Overflow". Stack Exchange, Inc. Consultado el 9 de enero de 2020. La encuesta anual para desarrolladores de Stack Overflow es la encuesta más grande y completa de personas que programan en todo el mundo. Cada año, realizamos una encuesta que abarca todo, desde las tecnologías favoritas de los desarrolladores hasta sus preferencias laborales. Este año es el noveno año en que publicamos los resultados de nuestra encuesta anual para desarrolladores, y casi 90 000 desarrolladores respondieron la encuesta de 20 minutos a principios de este año.
^ "Encuesta para desarrolladores de Stack Overflow 2015". Stack Overflow. Archivado desde el original el 4 de mayo de 2019. Consultado el 29 de mayo de 2019 .
^ "Encuesta para desarrolladores de Stack Overflow 2017". Stack Overflow. Archivado desde el original el 29 de mayo de 2019. Consultado el 29 de mayo de 2019 .
^ "Encuesta para desarrolladores de Stack Overflow 2018". Stack Overflow. Archivado desde el original el 30 de mayo de 2019. Consultado el 29 de mayo de 2019 .
^ "Puestos de trabajo en Git (software), salario medio para los profesionales que trabajan en sistemas de control de versiones distribuidos de Git". Itjobswatch.co.uk. Archivado desde el original el 8 de octubre de 2016. Consultado el 30 de septiembre de 2016 .
^ "Puestos de trabajo en Team Foundation Server, salario medio para las habilidades de Microsoft Team Foundation Server (TFS)". Itjobswatch.co.uk. Archivado desde el original el 29 de octubre de 2016. Consultado el 30 de septiembre de 2016 .
^ "Puestos de trabajo en Subversion, salario medio para las habilidades de Apache Subversion (SVN)". Itjobswatch.co.uk. Archivado desde el original el 25 de octubre de 2016. Consultado el 30 de septiembre de 2016 .
^ "Mercurial Jobs, Average Salary for Mercurial Skills". Itjobswatch.co.uk. Archivado desde el original el 23 de septiembre de 2016. Consultado el 30 de septiembre de 2016 .
^ "Puestos de trabajo en VSS/SourceSafe, salario medio para las habilidades en Microsoft Visual SourceSafe (VSS)". Itjobswatch.co.uk. Archivado desde el original el 29 de octubre de 2016. Consultado el 30 de septiembre de 2016 .
^ "El cambio de Windows a Git está casi completo: 8500 confirmaciones y 1760 compilaciones cada día". Ars Technica . 24 de mayo de 2017. Archivado desde el original el 24 de mayo de 2017 . Consultado el 24 de mayo de 2017 .
^ "git-init". Git . Archivado desde el original el 15 de marzo de 2022.
^ "Git – Branches in a Nutshell". Git . Archivado del original el 20 de diciembre de 2020 . Consultado el 15 de junio de 2020 . La rama "master" en Git no es una rama especial. Es exactamente como cualquier otra rama. La única razón por la que casi todos los repositorios tienen una es que el comando git init la crea de forma predeterminada y la mayoría de las personas no se molestan en cambiarla.
^ Chacon y Straub 2014, págs. 103–109.
^ github/renaming, GitHub, 4 de diciembre de 2020 , consultado el 4 de diciembre de 2020
^ El nombre de la rama predeterminada para los nuevos repositorios ahora es principal, GitLab, 22 de junio de 2021 , consultado el 22 de junio de 2021
^ "Git Revert | Tutorial de Git de Atlassian". Atlassian . Revertir tiene dos ventajas importantes sobre restablecer. Primero, no cambia el historial del proyecto, lo que lo convierte en una operación "segura" para las confirmaciones que ya se han publicado en un repositorio compartido.
^ "Flujo de trabajo de Gitflow | Tutorial de Git de Atlassian". Atlassian . Consultado el 15 de junio de 2020 .
^ Chacon y Straub 2014, págs. 170–174.
^ "Flujo de trabajo de bifurcación | Tutorial de Git de Atlassian". Atlassian . Consultado el 15 de junio de 2020 .
^ "Control de acceso al repositorio Git". Archivado desde el original el 14 de septiembre de 2016 . Consultado el 6 de septiembre de 2016 .
^ Pettersen, Tim (20 de diciembre de 2014). "Securing your Git server against CVE-2014-9390". Archivado desde el original el 24 de diciembre de 2014 . Consultado el 22 de diciembre de 2014 .
^ Hamano, JC (18 de diciembre de 2014). «[Anuncio] Git v2.2.1 (y actualizaciones de las líneas de mantenimiento anteriores)». Grupo de noticias : gmane.linux.kernel. Archivado desde el original el 19 de diciembre de 2014. Consultado el 22 de diciembre de 2014 .
^ «CVE-2015-7545». 15 de diciembre de 2015. Archivado desde el original el 26 de diciembre de 2015. Consultado el 26 de diciembre de 2015 .
^ "Git 2.6.1". GitHub . 29 de septiembre de 2015. Archivado desde el original el 11 de abril de 2016 . Consultado el 26 de diciembre de 2015 .
^ abc Blake Burkhart; et al. (5 de octubre de 2015). «Re: Solicitud CVE: git». Archivado desde el original el 27 de diciembre de 2015 . Consultado el 26 de diciembre de 2015 .
^ "hash – ¿Qué tan seguras son las etiquetas git firmadas? ¿Solo tan seguras como SHA-1 o de alguna manera más seguras?". Stack Exchange de seguridad de la información. 22 de septiembre de 2014. Archivado desde el original el 24 de junio de 2016.
^ "¿Por qué Git utiliza una función hash criptográfica?". Stack Overflow. 1 de marzo de 2015. Archivado desde el original el 1 de julio de 2016.
^ "Git – Documentación de transición de función hash". Git .
Enlaces externos
Sitio web oficial
Wikilibros tiene un libro sobre el tema: Git
Wikimedia Commons tiene medios relacionados con Git .