Se ramifica desde un commit anterior usando Git

1798

Si tengo n commits, ¿cómo puedo ramificar desde el n-3 commit?

Puedo ver el hash de cada commit.

Dole Douglas
fuente

Respuestas:

2547

Puede crear la rama a través de un hash:

git branch branchname <sha1-of-commit>

O usando una referencia simbólica:

git branch branchname HEAD~3

Para pagar la rama al crearla, use

git checkout -b branchname <sha1-of-commit or HEAD~3>
CB Bailey
fuente
42
Git 1.8.2 me permite usar el sha1 corto para la primera forma.
Dan Benamy
53
@MattFenwick Git le permitirá usar hashes acortados en todos los lugares donde se permite un hash, siempre que el hash acortado sea '' único '' en el repositorio. Entonces, si no funcionó, intente agregar otro personaje del hash.
meter
29
Para empujar la nueva rama correctamente al servidor ... necesitaba este último paso:git push origin BRANCH_NAME
Gene Bo
3
para iniciar una rama desde la <sha1-of-commit>ejecución git checkout -b <name-of-branch> <sha1-of-commit>pero si la rama ya existegit checkout -B <name-of-branch> <sha1-of-commit>
mostafazh
258

Para hacer esto en github.com:

  1. Ve a tu proyecto.
  2. Haga clic en "Compromisos".
  3. Haga clic en <> ("Examinar el repositorio en este punto del historial") en la confirmación desde la que desea bifurcar.
  4. Haga clic en el "árbol: xxxxxx" arriba en la esquina superior izquierda. Justo debajo de la barra de estadísticas del idioma, tendrá la opción de "Buscar o crear sucursal" (simplemente escriba un nuevo nombre de sucursal allí)Ramificación de compromiso anterior
OneSolitaryNoob
fuente
44
La pregunta no es sobre github, sino sobre git. La mayoría de los servidores git no son github.
Anders Tornblad
46
A pesar del hecho de que esto es Github no git, ¡todavía fue inmensamente útil!
Liz
Desafortunadamente, todavía muestra cambios de otras confirmaciones, que quería evitar, y es por eso que busqué esta pregunta
Maxim
83

La magia se puede hacer mediante git reset .

  1. Cree una nueva rama y cámbiela (para que todas sus últimas confirmaciones estén almacenadas aquí)

    git checkout -b your_new_branch

  2. Vuelva a su rama de trabajo anterior (suponga que es maestra)

    git checkout master

  3. Elimine las últimas confirmaciones x, mantenga el maestro limpio

    git reset --hard HEAD~x # in your case, x = 3

A partir de este momento, todas las últimas confirmaciones x están solo en la nueva rama, ya no en su rama de trabajo anterior (maestra).

Jing Li
fuente
77
Esto es lo que estaba buscando, ya que elimina las confirmaciones del Maestro y lo hace como si hubiera recordado hacer la rama antes de que se realizaran esas confirmaciones. Gracias.
superbeck
77
Eso sí, no hay que olvidar que una git reset --hardno es una buena idea si ya ha empujado el origen se comprometen a ...
LuisF
1
puede git push --force hacerlo si ya había empujado la rama antes
milan
Pero tenga mucho cuidado al usar --force blog.developer.atlassian.com/force-with-lease
peater el
74

Si no está seguro de qué confirmación desea bifurcar de antemano, puede verificar las confirmaciones y examinar su código (ver fuente, compilar, probar)

git checkout <sha1-of-commit>

una vez que encuentre la confirmación de la que desea bifurcarse, puede hacerlo desde la confirmación (es decir, sin volver al maestro primero) simplemente creando una bifurcación de la manera habitual:

git checkout -b <branch_name>
stanm
fuente
22
git checkout -b <branch-name> <sha1-of-commit>
Tyler Long
fuente
1
¿Cómo es esto diferente de " git branch branchname <sha1-of-commit>" (de la respuesta aceptada)?
Peter Mortensen el
No lo sé. Creo que son equivalentes. Siempre uso git checkout -bpara crear una nueva sucursal.
Tyler Long
10
stackoverflow.com/a/7987711/3590629 git branch ... crea la rama pero te deja en la rama actual. git checkout -b ... crea la rama y te cambia a ella.
esme_louise
9

Una forma rápida de hacerlo en su repositorio de Github sería la siguiente:

  • Encuentra el commit específico de tu sucursal
  • Junto al ID de SHA, haga clic en 'Examinar el repositorio en este punto de la historia'
  • Aquí puede crear una nueva rama a partir de esta confirmación ingrese la descripción de la imagen aquí
Vatsal Parekh
fuente
1
Esto realmente está desactualizado
regetskcob 03 de
2
La pregunta no es sobre github.
Anders Tornblad
8

Simplemente ejecute:

git checkout -b branch-name <commit>

Por ejemplo :

git checkout -b import/january-2019 1d0fa4fa9ea961182114b63976482e634a8067b8

El checkoutcomando con el parámetro -bcreará una nueva rama Y lo cambiará a él

d1jhoni1b
fuente
1
Éste me gusta mucho. Gracias
The Fool
¿Es posible crear una rama basada en la confirmación SHA de una rama de características que se eliminó mediante una solicitud de extracción? ¿O tengo que ramificar desde la confirmación de la solicitud de extracción en el maestro?
user2966445
ejecute git fetchy git branchordene en la carpeta de su proyecto utilizando el terminal, luego verifique si la rama de la característica existe, si este es el caso, entonces sí, por supuesto que no podrá crear una rama a partir de ramas eliminadas, también podría revertir la eliminación de una rama en caso de que rama se fue
d1jhoni1b
4

Una gran pregunta relacionada es: ¿Cómo diablos lo resuelves usando la --helpopción de git? Intentemos esto:

git branch --help

Vemos esta salida:

NAME
       git-branch - List, create, or delete branches    

SYNOPSIS
       git branch [--color[=<when>] | --no-color] [-r | -a]
               [--list] [-v [--abbrev=<length> | --no-abbrev]]
               [--column[=<options>] | --no-column]
               [(--merged | --no-merged | --contains) [<commit>]] [--sort=<key>]
               [--points-at <object>] [<pattern>...]
       git branch [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]
       git branch (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>]
       git branch --unset-upstream [<branchname>]
       git branch (-m | -M) [<oldbranch>] <newbranch>
       git branch (-d | -D) [-r] <branchname>...
       git branch --edit-description [<branchname>]

Gobbledegook.

Busque en el texto posterior la palabra "commit". Encontramos esto:

   <start-point>
       The new branch head will point to this commit. It may be given as a branch name, a
       commit-id, or a tag. If this option is omitted, the current HEAD will be used instead.

¡Estamos llegando a alguna parte!

Ahora, concéntrate en esta línea del gobbledegook:

git branch [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]

Condense eso a esto:

git branch <branchname> [<start-point>]

Y hecho.

Chaqueta morada
fuente
1
Odio a git. Gracias.
Byron Whitlock
4

Para hacer esto en Eclipse:

  • Vaya a la perspectiva "Exploración del repositorio de Git".
  • Expanda "Etiquetas" y elija la confirmación desde la que desea crear la rama.
  • Haga clic derecho en el compromiso y elija "Crear rama".
  • Proporcione un nombre de sucursal.

Creará una sucursal local para usted. Luego, cada vez que envíe sus cambios, su sucursal se enviará al servidor remoto.

Saurabhcdt
fuente
3

Puedes hacerlo en Stash.

  1. Haga clic en el compromiso
  2. En la parte superior derecha de la pantalla, haga clic en "Etiquetar esta confirmación"
  3. Luego puede crear la nueva rama a partir de la etiqueta que acaba de crear.
David Ruan
fuente
¿Qué GUI es esto? GitHub?
ostrichofevil
Atlassian Stash
David Ruan
3

Pude hacerlo así:

git branch new_branch_name `git log -n 1 --skip 3 --format=%H`

Donde debe ingresar el valor de omisión. 0 es el último, 1 es el anterior, 2 es el commit anterior, etc.

Mike Graf
fuente
44
¿Por qué no solo usar HEAD~1(donde 1 especifica 1 commit back)?
jduncanator
1
Su camino está cubierto por la respuesta seleccionada y funciona bien. La mía es diferente a la respuesta seleccionada.
Mike Graf
3

Esto crea la rama con un comando:

git push origin <sha1-of-commit>:refs/heads/<branch-name>

Prefiero esta manera mejor que las publicadas anteriormente, porque crea la rama inmediatamente (no requiere un comando de inserción adicional después).

Alexander Samoylov
fuente
3

Usando Sourcetree | La forma más fácil.

  • Primero, revise la rama en la que desea realizar la confirmación específica para crear una nueva rama.
  • Luego mire la barra de herramientas, seleccione Repositorio> Rama ... el acceso directo es Comando + Mayús + B.
  • Y seleccione la confirmación específica que desea realizar. ¡Y asigne un nuevo nombre de sucursal y luego cree una sucursal!

ingrese la descripción de la imagen aquí

Dary
fuente
Finalmente encontré esta útil respuesta. Gracias
Firda Sahidi
1

Esto es lo que hice:

C:\Users\[path]\build>git checkout -b responsivenavigation 8a75b001096536b3216022484af3026aa9c7bb5b
Switched to a new branch 'responsivenavigation'

C:\Users\jaimemontoya\Dropbox\CuponClub\androidapp\build>git branch
  master
* responsivenavigation

En este caso, 8a75b001096536b3216022484af3026aa9c7bb5bwas y old commit pertenecientes a la mastersucursal.

Jaime Montoya
fuente
1

Ir a un commit particular de un repositorio git

A veces, cuando se trabaja en un repositorio de git, desea volver a una confirmación específica (revisión) para tener una instantánea de su proyecto en un momento específico. Para hacerlo todo lo que necesita es el hash SHA-1 del commit que puede encontrar fácilmente revisando el registro con el comando:

git log --abbrev-commit --pretty=oneline

que le dará una lista compacta de todos los commits y la versión corta del hash SHA-1.

Ahora que conoce el hash del commit al que desea ir, puede usar uno de los siguientes 2 comandos:

git checkout HASH

o

git reset --hard HASH

revisa

git checkout <commit> <paths>

Le dice a git que reemplace el estado actual de las rutas con su estado en el commit dado. Las rutas pueden ser archivos o directorios.

Si no se da ninguna rama, git asume el compromiso HEAD.

git checkout <path> // restores path from your last commit. It is a 'filesystem-undo'.

Si no se proporciona ninguna ruta, git se mueve HEADa la confirmación dada (cambiando así la confirmación en la que está sentado y trabajando).

git checkout branch //means switching branches.

Reiniciar

git reset <commit> //re-sets the current pointer to the given commit.

Si está en una rama (normalmente debería estarlo), HEADy esta rama se mueve para confirmar.

Si está en HEADestado desconectado , git reset solo se mueve HEAD. Para restablecer una rama, primero compruébelo.

Si desea saber más sobre la diferencia entre git reset y git checkout, le recomendaría que lea el blog oficial de git .

LYES - CHIOUKH
fuente
2
gracias por su respuesta, FYI: Este: git log --abbrev-commit --pretty=oneline se pueden abreviar agit log --oneline
Suhaib
0

Seleccione Confirmar

Para los usuarios de Git GUI, puede visualizar todo el historial (si es necesario) y luego hacer clic con el botón derecho en el compromiso del que desea bifurcarse e ingresar el nombre de la bifurcación.

Ingrese el nombre de la sucursal

Visualiza toda la historia

Ivan
fuente
Esto funcionará solo si el usuario usa cualquier sistema operativo basado en UI como Windows y MAC
Saurabhcdt
Así es. Mi respuesta comienza específicamente con las palabras "Para usuarios de Git GUI ...". No he dado una respuesta que funcione para todos, eso ya está hecho. He dado un método alternativo que podría ser más fácil para mucha gente. Creo que la razón por la que no me gusta mi respuesta es porque no es una solución para todos, pero eso ya existe con un par de miles de votos a favor. Sin embargo, eso no hace que mi respuesta sea incorrecta "¡Para usuarios de Git GUI!". CREATE NEW BRANCH está allí en la GUI. ¡Dudo que sea la única persona en el mundo que lo usa!
Ivan
0

Para hacer la respuesta aceptada en Visual Studio 2015 y 2017:

Haga clic en modificaciones

Haga clic en alteraciones (flecha roja arriba)

Haga clic en Acciones para ver el historial

Haga clic en Acciones (flecha roja arriba) y haga clic en Ver historial en el menú desplegable

Y se abrirá una nueva pestaña:

Pestaña Historial

Y debe hacer clic derecho en la confirmación anterior a la que desea que su código vuelva: haga clic derecho en la confirmación anterior

Elija pagar una nueva sucursal y ¡listo!

A continuación, aunque no es parte de la pregunta de OP, pero hago mucho y este es un paso engañoso, al menos para mí: si desea volver a una confirmación anterior, sin pagar una nueva rama, ¡NO elija revertir (! ?); debe elegir redefinir --mixed o --hard:

haga clic derecho en la confirmación anterior y redefina

Marcelo Scofano
fuente
Comparta sus respuestas en inglés, ya que la mayoría de nosotros aquí no hablamos ni conocemos otros idiomas extranjeros además del inglés.
Shamiul Hasan Rumman
@ShamiulHasanRumman, en el texto que explica las imágenes, por lo general a continuación, traduje el término señalado con la Flecha Roja al inglés, como ese Haga clic en Acciones (flecha roja arriba) ¿ No fue suficiente?
Marcelo Scofano
@MarceloScofano, ¿fue difícil cambiar el editor en inglés antes de tomar las capturas de pantalla?
Andrew Surdu
1
@AndreiSurdu: como nunca tuve la necesidad de hacer eso, esperaba que para cambiar al inglés tuviera que instalar un paquete adicional. Pero tiene razón, solo necesita un reinicio de VS, ninguna instalación en absoluto. Intentaré cambiar las imágenes de arriba tan pronto como tenga tiempo libre.
Marcelo Scofano
0

si usas el árbol fuente es bastante sencillo.

  • Haga clic derecho en el commit desde donde necesita crear una nueva sucursal
  • Haga clic en 'rama'
  • Escriba el nombre de la nueva rama en el cuadro de diálogo que aparece y haga clic en 'crear rama'
Ibtisam Asif
fuente
0

Si está buscando una solución basada en la línea de comandos, puede ignorar mi respuesta. Te voy a sugerir que uses GitKraken . Es un extraordinario git UI client. Muestra el árbol Git en la página de inicio. Puedes mirarlos y saber qué está pasando con el proyecto. Simplemente seleccione una confirmación específica, haga clic derecho sobre ella y seleccione la opción 'Crear una rama aquí'. Le dará un cuadro de texto para ingresar el nombre de la sucursal. Ingrese el nombre de la sucursal, seleccione 'Aceptar' y estará listo. Es realmente muy fácil de usar.

Shamiul Hasan Rumman
fuente