Git para principiantes: la guía práctica definitiva

854

Ok, después de ver esta publicación de PJ Hyett , he decidido saltar al final e ir con Git .

Entonces, lo que necesito es una guía práctica para principiantes de Git. "Principiante" se define como alguien que sabe cómo manejar su compilador, comprende hasta cierto punto qué es un Makefile y ha tocado el control de la fuente sin entenderlo muy bien.

"Práctico" se define como que esta persona no quiere entrar en detalles con respecto a lo que Git está haciendo en segundo plano, y ni siquiera le importa (o sabe) que se distribuye. Sus respuestas pueden insinuar las posibilidades, pero intente apuntar al principiante que quiera mantener un repositorio 'principal' en un 'servidor' que esté respaldado y sea seguro, y trate su repositorio local como simplemente un recurso 'cliente'.

Entonces:

Instalación / Configuración

Trabajando con el código

Etiquetado, ramificación, lanzamientos, líneas de base

Otro

  • Describa y vincule a una buena GUI, complemento IDE, etc. que haga que Git sea un recurso de línea que no sea de comando, pero por favor enumere sus limitaciones y su calidad.
    • msysgit : plataforma cruzada, incluida con Git
    • gitk : visor de historial multiplataforma, incluido con Git
    • gitnub : Mac OS X
    • gitx - Visor de historial de Mac OS X
    • smartgit : multiplataforma, comercial, beta
    • tig - GUI de consola para Linux
    • qgit - GUI para Windows, Linux
    • Extensiones Git : paquete para Windows, incluye GUI amigable
  • ¿Alguna otra tarea común que un principiante debería saber?
  • ¿Cómo trabajo de manera efectiva con un repositorio de subversión configurado como mi fuente de control de origen?

Otras referencias para principiantes de Git

Profundizando en Git

Revisaré las entradas de vez en cuando y las "ordenaré" para que tengan una apariencia / sensación consistentes y sea fácil escanear la lista. plantilla de información adicional ". También vincularé a las entradas de la lista de viñetas anterior para que sea fácil encontrarlas más tarde.

Adam Davis
fuente

Respuestas:

118

¿Cómo se crea un nuevo proyecto / repositorio?

Un repositorio git es simplemente un directorio que contiene un .gitdirectorio especial .

Esto es diferente de los sistemas de control de versiones "centralizados" (como la subversión), donde un "repositorio" está alojado en un servidor remoto, que se encuentra checkouten un directorio de "copia de trabajo". Con git, su copia de trabajo es el repositorio.

Simplemente ejecute git initen el directorio que contiene los archivos que desea rastrear.

Por ejemplo,

cd ~/code/project001/
git init

Esto crea una .gitcarpeta (oculta) en el directorio actual.

Para hacer un nuevo proyecto, ejecute git initcon un argumento adicional (el nombre del directorio que se creará):

git init project002

(This is equivalent to: mkdir project002 && cd project002 && git init)

Para verificar si la ruta actual actual está dentro de un repositorio git, simplemente ejecute git status: si no es un repositorio, informará "fatal: no es un repositorio git"

También puede enumerar el .gitdirectorio y verificar que contiene archivos / directorios similares a los siguientes:

$ ls .git
HEAD         config       hooks/       objects/
branches/    description  info/        refs/

Si por alguna razón desea "desgititar" un repositorio (desea dejar de usar git para rastrear ese proyecto). Simplemente elimine el .gitdirectorio en el nivel base del repositorio.

cd ~/code/project001/
rm -rf .git/

Precaución: Esto destruirá todo el historial de revisiones, todas sus etiquetas, todo lo que git ha hecho. No tocará los archivos "actuales" (los archivos que puede ver actualmente), ¡pero los cambios anteriores, los archivos eliminados, etc. serán irrecuperables!

dbr
fuente
3
Git hace que sus objetos sean de solo lectura, por lo que querrás rm -rf .gitborrar la base de datos de git.
Josh Lee el
Normalmente, será necesario crear un archivo .gitignore durante el uso normal para especificar los archivos / árboles que se ignorarán en el control de versiones, por lo que para completar la última parte sobre "desarmado", además de eliminar .git, también deberá eliminarlo. archivo gitignore. :)
Monoman
¿Qué tal repositorios desnudos? De alguna manera están "centralizados", y creo que son algo bueno para muchos proyectos que necesitan algún tipo de centralización (por ejemplo: proyectos desarrollados por muchas personas)
Peoro
WRT se ejecuta git statuspara garantizar que se encuentre dentro de un repositorio: este tiene un problema: si tiene la variable de entorno $ GIT_DIR establecida en su shell actual, git ignorará su ubicación actual y usará el repositorio en $ GIT_DIR. Debería saber que ayer perdí una hora.
sanmiguel
110

GUI para git


Git GUI

Incluido con git: se ejecuta git guidesde la línea de comandos y el instalador msysgit de Windows lo agrega al menú Inicio.

Git GUI puede hacer la mayoría de lo que necesitarías hacer con git. Incluyendo cambios de etapa, configurar git y repositorios, cambios de inserción, crear / pagar / eliminar ramas, fusionar y muchas otras cosas.

Una de mis características favoritas son los accesos directos "línea de escenario" y "trozo de escenario" en el menú contextual, que le permite confirmar partes específicas de un archivo. Puede lograr lo mismo a través de git add -i, pero me resulta más fácil de usar.

No es la aplicación más bonita, pero funciona en casi todas las plataformas (se basa en Tcl / Tk)

Capturas de pantalla | un screencast


GitK

También incluido con git. Es un visor de historial de git y le permite visualizar el historial de un repositorio (incluidas las ramas, cuando se crean y se fusionan). Puede ver y buscar confirmaciones.

Va muy bien con git-gui.


Gitnub

Aplicación Mac OS X Principalmente un equivalente de git log, pero tiene cierta integración con github (como la "Vista de red").

Se ve bonito y se adapta a Mac OS X. Puede buscar repositorios. El mayor critismo de Gitnub es que muestra la historia de forma lineal (una sola rama a la vez): no visualiza ramificaciones y fusiones, lo que puede ser importante con git, aunque esta es una mejora planificada.

Descargar enlaces, cambiar registro y capturas de pantalla | repositorio git


GitX

Pretende ser un "clon gitk para OS X".

Puede visualizar el historial de ramificaciones no lineales, realizar confirmaciones, ver y buscar confirmaciones, y tiene algunas otras características interesantes como poder "Quicklook" cualquier archivo en cualquier revisión (presione el espacio en la vista de lista de archivos), exportar cualquier archivo (a través de arrastrar y soltar).

Está mucho mejor integrado en OS X que git-gui/ gitk, y es rápido y estable incluso con repositorios excepcionalmente grandes.

El repositorio git original de Pieter no ha actualizado recientemente (más de un año en el momento de la escritura). Una rama más mantenida de forma activa está disponible en brotherbard / gitx : agrega "barra lateral, captar, jalar, empujar, agregar control remoto, fusionar, selección de cereza, rebase, clonar, clonar a"

Descargar | Capturas de pantalla | repositorio git | horquilla de hermano | tenedor laullon


SmartGit

Desde la página de inicio:

SmartGit es un front-end para el sistema de control de versiones distribuido Git y se ejecuta en Windows, Mac OS X y Linux. SmartGit está destinado a desarrolladores que prefieren una interfaz gráfica de usuario en lugar de un cliente de línea de comandos, para ser aún más productivos con Git, el DVCS más potente de la actualidad.

Puedes descargarlo desde su sitio web .

Descargar


TortugaGit

Versión TortoiseSVN Git para usuarios de Windows.

Está transfiriendo TortoiseSVN a TortoiseGit La última versión 1.2.1.0 Esta versión puede completar tareas regulares, como commit, show log, diff two version, create branch and tag, Create patch, etc. Ver ReleaseNotes para más detalles. Bienvenido a contribuir con este proyecto.

Descargar


QGit

QGit es un visor de GUI git construido en Qt / C ++.

Con qgit podrá explorar el historial de revisiones, ver el contenido del parche y los archivos modificados, siguiendo gráficamente las diferentes ramas de desarrollo.

Descargar


gitg

gitg es un visor de repositorio de git dirigido a gtk + / GNOME. Uno de sus objetivos principales es proporcionar una experiencia de usuario más unificada para las interfaces de usuario de git en varios escritorios. Esto no es escribir una aplicación multiplataforma, sino mediante una estrecha colaboración con clientes similares para otros sistemas operativos (como GitX para OS X).

Caracteristicas

  • Examinar el historial de revisiones.
  • Maneje repositorios grandes (carga el repositorio de Linux, más de 17000 revisiones, menos de 1 segundo).
  • Cometer cambios.
  • Etapa / desatraca trozos individuales.
  • Revertir cambios.
  • Mostrar diferencias coloreadas de cambios en las revisiones.
  • Examinar el árbol para una revisión dada.
  • Exportar partes del árbol de una revisión dada.
  • Proporcione cualquier especificación de referencia que pueda comprender un comando como 'git log' para construir el historial.
  • Mostrar y cambiar entre ramas en la vista del historial.

Descargar: lanzamientos o fuente


Gitbox

Gitbox es una interfaz gráfica de Mac OS X para el sistema de control de versiones Git. En una sola ventana verá ramas, historial y estado del directorio de trabajo.

Las operaciones cotidianas son fáciles: cambios en el escenario y en el escenario con una casilla de verificación. Comprometerse, jalar, fusionarse y empujar con un solo clic. Haga doble clic en un cambio para mostrar una diferencia con FileMerge.app.

Descargar


Gity

El sitio web de Gity no tiene mucha información, pero a partir de las capturas de pantalla allí parece ser una interfaz gráfica de usuario de código abierto OS X rica en funciones.

Descarga o fuente


Fusión

Meld es una herramienta de combinación y diferencia visual. Puede comparar dos o tres archivos y editarlos en su lugar (las diferencias se actualizan dinámicamente). Puede comparar dos o tres carpetas e iniciar comparaciones de archivos. Puede explorar y ver una copia de trabajo de los sistemas de control de versiones populares, como CVS, Subversion, Bazaar-ng y Mercurial [ y Git ].

Descargas


Katana

Una GUI Git para OSX por Steve Dekorte.

De un vistazo, vea qué ramas remotas tienen cambios para extraer y los repositorios locales tienen cambios para impulsar. Las operaciones git de agregar, confirmar, empujar, tirar, etiquetar y restablecer son compatibles, así como las diferencias visuales y la navegación visual de la jerarquía del proyecto que destaca los cambios y adiciones locales.

Gratis por 1 repositorio, $ 25 por más.

Descargar


Sprout (anteriormente GitMac)

Se enfoca en hacer que Git sea fácil de usar. Cuenta con una interfaz de usuario nativa de Cocoa (tipo mac), exploración rápida de repositorios, clonación, push / pull, ramificación / fusión, diferencia visual, ramas remotas, fácil acceso a la Terminal y más.

Al hacer que las acciones de Git más utilizadas sean intuitivas y fáciles de realizar, Sprout (anteriormente GitMac) hace que Git sea fácil de usar. Compatible con la mayoría de los flujos de trabajo de Git, Sprout es ideal para diseñadores y desarrolladores, colaboración en equipo y usuarios avanzados y novatos por igual.

Descargar | Sitio web


Torre

Una GUI de Git rica en funciones para Mac OSX. Prueba gratuita de 30 días, $ 59USD para una licencia de usuario único.

Descargar | Sitio web


EGit

EGit es un proveedor de Eclipse Team para el sistema de control de versiones Git. Git es un SCM distribuido, lo que significa que cada desarrollador tiene una copia completa de todo el historial de cada revisión del código, lo que hace que las consultas contra el historial sean muy rápidas y versátiles.

El proyecto EGit está implementando herramientas Eclipse además de la implementación JGit Java de Git.

Descargar | Sitio web


Extensiones Git

Código abierto para Windows: instala todo lo que necesita para trabajar con Git en un solo paquete, fácil de usar.

Git Extensions es un conjunto de herramientas para hacer que trabajar con Git en Windows sea más intuitivo. La extensión de shell se integrará en el Explorador de Windows y presenta un menú contextual en archivos y directorios. También hay un complemento de Visual Studio para usar git de Visual Studio.

Descargar

Muchas gracias a dbr por elaborar sobre las cosas de git gui.


SourceTree

SourceTree es un cliente gratuito de Mac para Git, Mercurial y SVN. Creado por Atlassian, la gente detrás de BitBucket, parece funcionar igualmente bien con cualquier sistema de VC, lo que le permite dominar una sola herramienta para usar con todos sus proyectos, sin embargo, están controlados por versión. Lleno de funciones y GRATIS.

Preparado por expertos y repleto de funciones para usuarios principiantes y avanzados:

Revise los conjuntos de cambios entrantes y salientes. Recolección de cerezas entre ramas. Manejo de parches, rebase, escondite / estantería y mucho más.

Descargar | Sitio web


dylanfm
fuente
2
Tiene algunas buenas respuestas (especialmente gitcasts y la respuesta push / pull), pero ¿podría recomendar dividirlo en respuestas separadas? ¡El interrogador le pidió que "no intente agrupar mucha información en una sola respuesta"!
dbr
3
Tal vez debería agregar TortoiseGit code.google.com/p/tortoisegit a su lista, para los usuarios de Windows ...
kret
1
Gity ( macendeavor.com/gity ) es una opción, pero todavía está en desarrollo (OS X)
Dave DeLong
2
Tower ("El cliente Git más poderoso para Mac") es un nuevo y hermoso cliente para Git.
rubiii
59

Bueno, a pesar del hecho de que solicitó que no "simplemente" vinculemos con otros recursos, es bastante tonto cuando ya existe un recurso comunitario (y creciente) que es realmente bastante bueno: el Libro de la Comunidad Git . En serio, estas más de 20 preguntas en una pregunta no serán concisas y consistentes. El Git Community Book está disponible como HTML y PDF y responde muchas de sus preguntas con respuestas claras, bien formateadas y revisadas por pares y en un formato que le permite saltar directamente a su problema en cuestión.

Por desgracia, si mi publicación realmente te molesta, la eliminaré. Solo dilo.

Pat Notz
fuente
2
Si no está usando git porque es un DVCS, ¿por qué molestarse en usar git? Esta pregunta es tonta y desvía recursos que podrían gastarse en otras cosas para satisfacer un objetivo cuestionable.
Randal Schwartz
56

Cómo configurarlo para ignorar archivos:

La capacidad de hacer que git ignore los archivos que no desea que rastree es muy útil.

Para ignorar un archivo o conjunto de archivos, debe proporcionar un patrón. La sintaxis del patrón para git es bastante simple, pero poderosa. Es aplicable a los tres archivos diferentes que mencionaré a continuación.

  • Una línea en blanco no ignora ningún archivo, generalmente se usa como separador.
  • Líneas mirando con # sirven como comentarios.
  • El !El prefijo es opcional y negará el patrón. Cualquier patrón negado que coincida anulará los patrones de precedencia inferior.
  • Admite expresiones avanzadas y comodines
    • Ej: El patrón: *. [Oa] ignorará todos los archivos en el repositorio que terminen en .o o .a (archivos de objeto y archivo)
  • Si un patrón tiene un directorio que termina con una barra oblicua, solo coincidirá con este directorio y las rutas debajo de él. Esto excluye los archivos regulares y los enlaces simbólicos del partido.
  • Una barra inclinada inicial coincidirá con todos los archivos en ese nombre de ruta.
    • Ej: El patrón /*.c coincidirá con el archivo foo.c pero no con bar / awesome.c

Gran ejemplo de la página de manual de gitignore (5) :

$ git status
[...]
# Untracked files:
[...]
#       Documentation/foo.html
#       Documentation/gitignore.html
#       file.o
#       lib.a
#       src/internal.o
[...]
$ cat .git/info/exclude
  # ignore objects and archives, anywhere in the tree.
  *.[oa]
$ cat Documentation/.gitignore
# ignore generated html files,
*.html
# except foo.html which is maintained by hand
!foo.html
$ git status
[...]
# Untracked files:
[...]
#       Documentation/foo.html
[...]

En general, hay tres formas diferentes de ignorar los archivos no rastreados.

1) Ignorar para todos los usuarios del repositorio:

Agregue un archivo llamado .gitignore a la raíz de su copia de trabajo.

Edite .gitignore para que coincida con sus preferencias respecto de qué archivos deben / no deben ignorarse.

git add .gitignore 

y comprometerse cuando haya terminado.

2) Ignore solo su copia del repositorio:

Agregar / editar el archivo $ GIT_DIR / info / exclude en su copia de trabajo, con sus patrones preferidos.

Ej: Mi copia de trabajo es ~ / src / project1, así que editaría ~ / src / project1 / .git / info / exclude

Ya terminaste!

3) Ignorar en todas las situaciones, en su sistema:

Los patrones globales de ignorar para su sistema pueden ir en un archivo llamado lo que desee.

El mío personalmente se llama ~ / .gitglobalignore

Entonces puedo informar a git de este archivo editando mi archivo ~ / .gitconfig con la siguiente línea:

core.excludesfile = ~/.gitglobalignore

Ya terminaste!

Creo que la página de manual de gitignore es el mejor recurso para obtener más información.

Brian Gianforcaro
fuente
¿Podría alguien, por favor, agregar un detalle menor pero importante a esta publicación? Esto funciona solo para archivos que git ya no ha rastreado. Para 'destrabar' el archivo pero dejarlo en el sistema de archivos, necesita 'git rm --cached filename'. ¡Gracias!
Nikita Rybak
Solo quiero señalar que agregar la línea core.excludesfile no funcionó para mí. Tuve que [git config --global core.excludesfile ~ / .gitglobalignore] para que funcione.
Distrito de codificación el
Ahora hay un proyecto en Github llamado gitignore que tiene archivos gitignore para una variedad de lenguajes y entornos de desarrollo: github.com/github/gitignore
Ryan Lundy
47

¿Cómo se 'etiqueta' un conjunto particular de revisiones?

¿Cómo 'marca' 'etiqueta' o 'libera' un conjunto particular de revisiones para un conjunto particular de archivos para que siempre pueda extraerlo más tarde?

Utilizando el git tag comando.

Para simplemente "etiquetar" la revisión actual, simplemente debería ejecutar ...

git tag -a thetagname
git tag -a 0.1
git tag -a 2.6.1-rc1 -m 'Released on 01/02/03'

Para enumerar las etiquetas actuales, simplemente ejecute git tagsin argumentos, o-l (L minúscula):

$ git tag -a thetagname # and enter a message, or use -m 'My tag annotation'
$ git tag -l
thetagname

Para eliminar una etiqueta, utiliza el -d bandera:

$ git tag -d thetagname 
Deleted tag 'thetagname'
$ git tag
[no output]

Para etiquetar una confirmación específica (anterior), simplemente haga ...

git tag [tag name] [revision SHA1 hash]

Por ejemplo:

git tag 1.1.1 81b15a68c6c3e71f72e766931df4e6499990385b

Nota: por defecto, git crea una etiqueta "ligera" (básicamente una referencia a una revisión específica). La forma "correcta" es usar la -abandera. Esto iniciará su editor pidiendo un mensaje de etiqueta (idéntico a pedir un mensaje de confirmación, también puede usar la -mbandera para proporcionar el mensaje de etiqueta en la línea de comando). El uso de una etiqueta anotada crea un objeto con su propia ID, fecha, etiquetador (autor) y, opcionalmente, una firma GPG (usando la -setiqueta). Para más información sobre esto, vea esta publicación

git tag mytagwithmsg -a -m 'This is a tag, with message'

Y para enumerar las etiquetas con anotaciones, use la -n1bandera para mostrar 1 línea de cada mensaje de etiqueta ( -n245para mostrar las primeras 245 líneas de cada anotación, y así sucesivamente):

$ git tag -l -n1
mytagwithmsg    This is a tag, with message

Para obtener más información, consulte la página de manual de git-tag (1)

dbr
fuente
La etiqueta git no crea etiquetas por defecto, solo referencias ligeras. Debe usar -a o -s para crear un objeto de etiqueta (que usarán cosas como describe): rockstarprogrammer.org/post/2008/oct/16/…
Dustin
Ah interesante. Gracias, he actualizado la respuesta para reflejar esto
dbr
¿Y cómo se etiqueta una revisión previamente comprometida? (lo siento, es demasiado largo, así que lo hojeé, ¿me perdí algo?)
Hasen
Hasen J: información agregada para responder, básicamentegit tag tagname revision_SHA1
dbr
1
Para insertar etiquetas en el repositorio remoto, agregue --tags cuando use git push (información del área de ayuda de github).
Héctor Ramos el
46

Ejemplo de flujo de trabajo con GIT.

Git es extremadamente flexible y se adapta bien a cualquier flujo de trabajo, pero no imponer un flujo de trabajo en particular podría tener el efecto negativo de dificultar la comprensión de lo que puede hacer con git más allá del flujo de trabajo lineal de "respaldo", y cuán útil puede ser la ramificación, por ejemplo .

Esta publicación de blog explica muy bien un flujo de trabajo muy simple pero efectivo que es realmente fácil de configurar usando git.

citando de la publicación del blog: consideramos que origin / master es la rama principal donde el código fuente de HEAD siempre refleja un estado listo para producción:

El flujo de trabajo se ha vuelto lo suficientemente popular como para haber realizado un proyecto que implementa este flujo de trabajo: git-flow

Bonita ilustración de un flujo de trabajo simple, donde realiza todos sus cambios en el desarrollo y solo presiona para dominar cuando el código está en estado de producción:

flujo de trabajo simple

Ahora supongamos que desea trabajar en una nueva función o en refactorizar un módulo. Podría crear una nueva rama, lo que podríamos llamar una rama "característica", algo que llevará algún tiempo y podría romper algún código. Una vez que su característica es "lo suficientemente estable" y quiere moverla "más cerca" de la producción, fusiona su rama de características para desarrollarla. Cuando todos los errores se resuelven después de la fusión y su código pasa todas las pruebas sólidas, empuja sus cambios a maestro.

Durante todo este proceso, encuentra un terrible error de seguridad, que debe corregirse de inmediato. Podría tener una rama llamada hotfixes, que realiza cambios que se empujan más rápidamente a la producción que la rama normal de "desarrollo".

Aquí tienes una ilustración de cómo podría verse esta función / revisión / desarrollo / flujo de trabajo de producción (bien explicado en la publicación del blog, y repito, la publicación del blog explica todo el proceso con mucho más detalle y mucho mejor que yo) .

Ejemplo de flujo de trabajo de Git

fresnos
fuente
Soy un novato git, y este diagrama lo hace más confuso para mí.
finnw
¿Cuál, el primero o el último? Realmente no quería hacer la publicación demasiado tiempo, pero agregaré una pequeña explicación de ambos diagramas más adelante.
Ashwoods
Leer el artículo completo. Este diagrama también me confundió, pero la publicación del blog está muy bien escrita nvie.com/posts/a-successful-git-branching-model
Felipe Sabino
¿esta mejor ahora? solo quería tener una descripción general aproximada, no volver a publicar toda la publicación del blog aquí :)
ashwoods
39

Aquí hay una copia de la publicación de PJ Hyett, ya que ya no está disponible:

Git no es difícil

23 de noviembre de 2008

Cuando le decimos a las personas por qué deberían usar Git sobre Subversion, la línea de referencia es: "Git hace Subversion mejor que Subversion, pero hace mucho más que eso".

El "mucho más" se compone de un montón de cosas que hacen que Git realmente brille, pero puede ser bastante abrumador para aquellos que vienen de otros SCM como Subversion.

Dicho esto, no hay nada que te impida usar Git al igual que usas Subversion mientras haces la transición.

Suponiendo que haya instalado el software necesario y tenga un repositorio remoto en alguna parte, así es como tomaría el código y empujaría sus cambios con Subversion:

$ svn checkout svn://foo.googlecode.com/svn/trunk foo
# make your changes
$ svn commit -m "my first commit"

¿Y cómo lo harías en Git?

$ git clone [email protected]:pjhyett/foo.git
# make your changes
$ git commit -a -m "my first commit"
$ git push

Un comando más para hacerlo realidad en Git. Ese comando adicional tiene grandes implicaciones, pero para los fines de esta publicación, de eso estamos hablando, un comando adicional.

Mira, realmente no es tan difícil.

Actualización: sería negligente no mencionar también que el equivalente a actualizar su copia local en Subversion en comparación con Git es svn updatey git pull, respectivamente. Solo un comando en ambos casos.

Adam Davis
fuente
En el primer ejemplo, veo que está revisando una ruta relativa, ./foopero no hay una ruta especificada para el clon get, ¿a dónde va a ir?
JD Isaacks el
33

Cómo instalar Git

En Windows:

Instalar msysgit

Hay varias descargas:

  • Git: use esto a menos que necesite específicamente una de las otras opciones a continuación.
  • PortableGit: utilícelo si desea ejecutar Git en una PC sin instalarlo en esa PC (por ejemplo, ejecutar Git desde una unidad USB)
  • msysGit: use esto si desea desarrollar Git. Si solo quiere usar Git para su código fuente, pero no quiere editar el código fuente de Git , no necesita esto.

Esto también instala un shell Cygwin bash, por lo que puede usarlo giten un shell más agradable (que cmd.exe), y también incluye git-gui (accesible mediante git guicomando, o elStart > All Programs > Git menú)

Mac OS X

Usa el instalador git-osx , o también puede instalar desde la fuente

A través de un administrador de paquetes

Instale gitusando su administrador de paquetes nativo. Por ejemplo, en Debian (o Ubuntu):

apt-get install git-core

O en Mac OS X, a través de MacPorts :

sudo port install git-core+bash_completion+doc

... o fink:

fink install git

... o Homebrew :

brew install git

En distribuciones basadas en Red Hat, como Fedora:

yum install git

En Cygwin, el paquete Git se puede encontrar en la sección "desarrollo"

Desde la fuente (Mac OS X / Linux / BSD / etc.)

En Mac OS X, si tiene instaladas las Herramientas para desarrolladores, puede compilar Git desde la fuente muy fácilmente. Descargue la última versión de Git como .tar.bzo .tar.gzdesde http://git-scm.com/ y extráigala (haga doble clic en Finder)

En Linux / BSD / etc. Debería ser muy parecido. Por ejemplo, en Debian (y Ubuntu), debe instalar el build-essentialpaquete a través de apt.

Luego, en una Terminal, cddonde extrajo los archivos (la ejecución cd ~/Downloads/git*/debería funcionar), y luego ejecute ...

./configure && make && sudo make install

Esto instalará Git en el lugar predeterminado ( /usr/local- así gitestará en/usr/local/bin/git )

Le pedirá que ingrese su contraseña (para sudo), esto es para que pueda escribir en el /usr/local/directorio, al que solo puede acceder el usuario "root", por lo que se requiere sudo.

Si desea instalarlo en un lugar separado (para que los archivos de Git no se mezclen con otras herramientas), use --prefixcon el comando configure:

./configure --prefix=/usr/local/gitpath
make
sudo make install

Esto instalará el gitbinario en /usr/local/bin/gitpath/bin/git- para que no tenga que escribir eso cada vez que lo haga, debe agregarlo $PATHagregando la siguiente línea en su ~/.profile:

export PATH="${PATH}:/usr/local/bin/gitpath/bin/"

Si no tiene acceso a sudo, puede usarlo --prefix=/Users/myusername/bine instalarlo en su directorio personal. Recuerda agregar~/bin/ a$PATH

El script x-git-update-to-latest-version automatiza mucho de esto:

Este script actualiza mi clon local del repositorio de git (localmente en ~/work/track/git), y luego configura, instala (en /usr/local/git- git describe) y actualiza el /usr/local/gitenlace simbólico.

De esta manera, puedo tener /usr/local/git/binen mi PATHy siempre estoy usando la última versión.

La última versión de este script también instala las páginas man. Debe ajustar su MANPATHpara incluir el /usr/local/git/share/mandirectorio.

dbr
fuente
55
En Fedora: yum install git. Para la ejecución de la GUI yum install git-gui.
Cristian Ciupitu
2
En Mac,sudo port install git-core+bash_completion+doc
Singletoned
Descargué fink para mac, pero ejecutar fink install git me da un error: "Falló: ¡no se encontró ningún paquete para la especificación 'git'!"
quano
@quano Debería estar allí, pdb.finkproject.org/pdb/package.php/git - verifique que Fink esté correctamente actualizado - Creo que correr fink self-updatedebería ayudar
dbr
32

Git Reset

Digamos que haces un tirón, lo combinas con tu código y decides que no te gusta. Use git-log, o tig, y encuentre el hash de donde quiera volver (probablemente su último commit antes del pull / merge) copie el hash, y haga:

# Revert to a previous commit by hash:
git-reset --hard <hash>

En lugar del hash, puede usar HEAD ^ como acceso directo para el commit anterior.

# Revert to previous commit:
git-reset --hard HEAD^
Dean Rather
fuente
44
Este es el análogo a una reversión en la mayoría de los otros sistemas de control de versiones centralizados.
Jeremy Wall
"$ git-reset --hard HEAD ^" debe ser una abreviatura para el padre de head (es decir, el estado anterior antes de la última confirmación).
Ben Page
66
solo un viejo git resetdebería desencadenar accidentalmentegit add
slf
31

¿Cómo se configura un repositorio de equipo compartido?

Aquí se describe cómo configurar un repositorio normal , pero ¿cómo se configura un repositorio de equipo que todos puedan extraer y empujar desde y hacia?

Usar un sistema de archivos NFS compartido

Suponiendo que su equipo ya tiene, por ejemplo, una membresía de grupo compartida que se puede usar.

mkdir /your/share/folder/project.git
cd /your/share/folder/project.git
newgrp yourteamgroup # if necessary
git init --bare --shared

Para comenzar a usar este repositorio, lo más fácil es comenzar desde un repositorio local que ya haya estado usando:

cd your/local/workspace/project
git remote add origin /your/share/folder/project.git
git push origin master

Otros ahora pueden clonar esto y comenzar a trabajar:

cd your/local/workspace
git clone /your/share/folder/project.git

Usando SSH

Configure una cuenta de usuario en el servidor de destino. Si usa una cuenta sin contraseña, una cuenta con contraseña o el uso authorized_keysrealmente depende de su nivel de seguridad requerido. Eche un vistazo a Configuración de Git sobre SSH para obtener más información.

Si todos los desarrolladores usan la misma cuenta para acceder a este repositorio compartido, no es necesario que use la --sharedopción anterior.

Después de iniciar el repositorio de la misma manera que antes, realiza el empuje inicial de esta manera:

cd your/local/workspace/project
git remote add origin user@server:/path/to/project.git
git push origin master

¿Ves la similitud con lo anterior? Además, lo único que podría suceder es que SSH solicite una contraseña si la cuenta tiene una contraseña. Si recibe este mensaje en una cuenta sin contraseña, el servidor SSH probablemente se haya deshabilitadoPermitEmptyPasswords .

La clonación ahora se ve así:

cd your/local/workspace
git clone user@server:/path/to/project.git
Asgeir S. Nilsen
fuente
además de NFS: ¿cómo se configura el servidor git para que funcione a través de ssh? - ¿Como una pequeña instancia de github.com?
Dafydd Rees
¿Es necesario tener un grupo de bits fijos en los directorios relevantes, o git se encarga de todo eso? Si es esto último, ¿cómo sabe git qué grupo usar en los permisos para los archivos Unix?
Norman Ramsey
He agregado una sección sobre SSH según lo solicitado. La parte adhesiva es necesaria si no todos los desarrolladores tienen el grupo compartido como su grupo principal. Si alguno de los usuarios tiene un grupo primario diferente, creará de manera predeterminada archivos con la propiedad de este grupo. Esto sucede debajo de git y, por lo tanto, no siempre está bajo el control de git.
Asgeir S. Nilsen
¿Para qué grupo git repo-config core.sharedRepository es útil?
systempuntoout
28

git statuses tu amigo, úsalo con frecuencia. Bueno para responder preguntas como:

  • ¿Qué acaba de hacer ese comando?
  • ¿En qué rama estoy?
  • ¿Qué cambios estoy a punto de cometer y he olvidado algo?
  • ¿Estaba en medio de algo la última vez que trabajé en este proyecto (hace días, semanas o quizás meses)?

A diferencia, por ejemplo svn status, se git statusejecuta casi instantáneamente incluso en proyectos grandes. A menudo me resultaba tranquilizador mientras aprendía git a usarlo con frecuencia, para asegurarme de que mi modelo mental de lo que estaba sucediendo era preciso. Ahora lo uso principalmente para recordarme a mí mismo lo que he cambiado desde mi última confirmación.

Obviamente, es mucho más útil si su .gitignore está configurado correctamente.

Peter Burns
fuente
27

Cometer cambios

Una vez que haya editado un archivo, debe confirmar sus cambios en git. Cuando ejecute este comando, solicitará un mensaje de confirmación, que es solo un simple texto que le dice a todos lo que ha cambiado.

$ git commit source/main.c

Confirmará el archivo main.c en el directorio ./source/

$ git commit -a # the -a flag pulls in all modified files

confirmará todos los archivos modificados (pero no los nuevos, deben agregarse al índice con git-add). Si desea confirmar solo ciertos archivos, primero deberá organizarlos con git-add y luego confirmar sin el indicador -a.

La confirmación solo cambia su repositorio local, aunque no los repositorios remotos. Si desea enviar las confirmaciones al repositorio remoto, deberá realizar una inserción.

$ git push <remote> <branch> # push new commits to the <branch> on the <remote> repository

Para alguien que viene de CVS o SVN, esto es un cambio, ya que la confirmación en el repositorio central ahora requiere dos pasos.

Adam Davis
fuente
27

¿Cómo se ramifica?

La rama predeterminada en un repositorio git se llama master .

Para crear una nueva sucursal use

git branch <branch-name>

Para ver una lista de todas las ramas en el tipo de repositorio actual

git branch

Si desea cambiar a otra sucursal, puede usar

git checkout <branch-name>

Para crear una nueva rama y cambiar a ella en un solo paso

git checkout -b <branch-name>

Para eliminar una rama, use

git branch -d <branch-name>

Para crear una rama con los cambios de la rama actual, haga

git stash
git stash branch <branch-name>
Markus Dulghier
fuente
11
debe mencionar el acceso directo git checkout -b <nombre de rama> que crea una rama y cambia a ella en un solo paso. Es probablemente el caso de uso más común para un usuario git principiante e incluso avanzado.
Jeremy Wall
21

Obteniendo el último código

$ git pull <remote> <branch> # fetches the code and merges it into 
                             # your working directory
$ git fetch <remote> <branch> # fetches the code but does not merge
                              # it into your working directory

$ git pull --tag <remote> <branch> # same as above but fetch tags as well
$ git fetch --tag <remote> <branch> # you get the idea

Eso cubre prácticamente todos los casos para obtener la última copia del código del repositorio remoto.

Jeremy Wall
fuente
20

El libro gratuito Pro Git es definitivamente mi favorito, especialmente para principiantes.

Peter Mortensen
fuente
18

Git Magic es todo lo que necesitarás. ¡Garantizada o le devolvemos su dinero!

Andrés
fuente
14
Suspiro, quiero que me devuelvan mi dinero. Software defectuoso (msysGit) con un tutorial incompleta (gitmagic) == horas de trabajo, que no es libre
SamGoody
16

¿Cómo se fusionan las ramas?

Si desea fusionar una rama (por ejemplo, mastera release), asegúrese de que su rama actual sea la rama de destino en la que desea fusionar (use git brancho git statuspara ver su rama actual).

Luego usa

git merge master

(dónde master está el nombre de la rama que desea fusionar con la rama actual).

Si hay algún conflicto, puede usar

git diff

para ver los conflictos pendientes tienes que resolverlos.

Markus Dulghier
fuente
2
Hay git mergetool que hace una diferencia de tres vías con su herramienta favorita (gvimdiff, kdiff3 o algunas más)
Dave Vogt
13

¿Cómo ve el historial de revisiones de un archivo?

git log -- filename
Pierre-Antoine LaFayette
fuente
12

Cómo rastrear sucursales remotas

Suponiendo que hay un repositorio remoto desde el que clonó su repositorio local y también suponiendo que hay una rama llamada 'some_branch' en ese repositorio remoto, aquí le mostramos cómo rastrearlo localmente:

# list remote branches
git branch -r

# start tracking one remote branch
git branch --track some_branch origin/some_branch

# change to the branch locally
git checkout some_branch

# make changes and commit them locally
....

# push your changes to the remote repository:
git push
innaM
fuente
Parece que en git 1.7 las ramas remotas se rastrean automáticamente cuando haces una rama local a partir de ellas. No sé en qué versión comenzó este comportamiento.
Doppelganger
En realidad, puede enumerar todas las ramas remotas mediante el uso degit remote show REMOTENAME
Felipe Sabino
11

Un buen artículo para entender cómo funciona Git es The Git Parable . Muy recomendable!

EricSchaefer
fuente
10

¿Cómo compara dos revisiones de un archivo, o su archivo actual y una revisión anterior?

El comando de comparación es git diff.

Para comparar 2 revisiones de un archivo:

$ git diff <commit1> <commit2> <file_name>

Eso difiere commit1 contra commit2; si cambia el orden, los archivos se distribuyen al revés, lo que puede no ser lo que espera ...

Para comparar el archivo provisional actual con el repositorio:

$ git diff --staged <file_name>

Para comparar el archivo actual sin etapas con el repositorio:

$ git diff <file_name>
kret
fuente
9

¿Por qué otro cómo? Hay muy buenos en la red, como la guía git, que es perfecta para comenzar. Tiene buenos enlaces, incluido el libro git al que se puede contribuir (alojado en git hub) y que es perfecto para esta tarea colectiva.

En stackoverflow, ¡realmente preferiría ver tus trucos favoritos!

El mío, que descubrí recientemente, se git stashexplica aquí , lo que le permite guardar su trabajo actual e ir a otra sucursal

EDITAR: como la publicación anterior, si realmente prefiere el formato stackoverlow con publicaciones como wiki, eliminaré esta respuesta

Piotr Lesnicki
fuente
No, no lo borres. Su respuesta es perfectamente válida, y señalar a otros a buenos recursos no es algo malo. También me gustaría las operaciones más comunes enumeradas aquí, pero es un poco de trabajo y no espero que otros lo hagan. Lo haré con el tiempo a medida que aprendo y esto será una referencia para mí.
Adam Davis
9

IU de consola - Tig

Instalación:

apt-get install tig

Uso

Dentro de un repositorio de git, escriba 'tig', para ver un registro interactivo, presione 'enter' en cualquier registro para ver más información al respecto. h para obtener ayuda, que enumera la funcionalidad básica.

Trivialidades

"Tig" es "Git" al revés.

Dean Rather
fuente
¿No debería ser una "IU de consola", ya que "consola" y "gráfico" son un poco ... contradictorias?
dbr
es mucho más gráfico que git-log ... sin embargo, es mucho más interactivo ...
Dean Rather
8

¿Cómo puedo crear una rama en un repositorio remoto?

Suponiendo que ha clonado su repositorio remoto desde algún repositorio remoto único.

# create a new branch locally
git branch name_of_branch
git checkout name_of_branch
# edit/add/remove files    
# ... 
# Commit your changes locally
git add fileName
git commit -m Message
# push changes and new branch to remote repository:
git push origin name_of_branch:name_of_branch
innaM
fuente
11
¿Por qué name_of_branch: name_of_branch?
Seun Osewa
¿Si porque? Hasta donde sé, solo necesitas git push origin name_of_branchy la sucursal ya estará creada en tu control remoto
Felipe Sabino
el primero name_of_branches el nombre local, el segundo es el nombre de la sucursal remota (deseada), por lo que podría ser local_name_of_branch:remote_name_of_branchsi desea que los nombres difieran. Si desea que sean iguales, aún debe especificarlo de esta manera b / c git no supone que desea que el nombre sea el mismo a menos que lo indique (también hay otros métodos para hacerlo, sin embargo)
johnny
8

Comencé con el tutorial oficial de Git . Creo que es lo suficientemente práctico para principiantes (¡era, y sigo siendo, un principiante, por su definición! Apenas entiendo los makefiles, solo he jugado un poco con Apache Subversion, etc.)

Hasen
fuente
8

¿Cómo elimino una rama en un repositorio remoto?

Realice un empuje en su control remoto :antes del nombre de la sucursal

git push origin :mybranchname

ser originel nombre de su control remoto y mybranchnameel nombre de la sucursal que se va a eliminar

http://help.github.com/remotes/

Felipe Sabino
fuente
7

Empujar y tirar de cambios

De manera simplificada, solo haz git pushy git pull. Los cambios se fusionan y, si hay un conflicto, git le informará y podrá resolverlo manualmente.

Cuando ingresa por primera vez a un repositorio remoto, debe hacer un git push origin master(el maestro es la rama maestra). A partir de entonces, solo debes hacer el git push.

Empuje etiquetas con git push --tags.

dylanfm
fuente
7

Código de salida

Primero vaya a un directorio vacío, use "git init" para convertirlo en un repositorio, luego clone el repositorio remoto en el suyo.

git clone [email protected]:/dir/to/repo

De donde sea que clones inicialmente es de donde se extraerá "git pull" por defecto.

Dean Rather
fuente
77
Creo que clone hace el paso init para que elimines la necesidad de ejecutar init primero. git init es principalmente para crear el primer repositorio o para configuraciones especiales con múltiples controles remotos que desea configurar de manera diferente a un clon estándar.
Jeremy Wall