Estoy usando git y estoy trabajando en la rama maestra. Esta rama tiene un archivo llamado app.js
.
Tengo una experiment
rama en la que hice un montón de cambios y toneladas de confirmaciones. Ahora quiero traer todos los cambios realizados solo app.js
desde from experiment
hasta master
branch.
¿Cómo puedo hacer eso?
Una vez más, no quiero una fusión. Solo quiero traer todos los cambios app.js
de experiment
rama en master
rama.
git
git-checkout
Nick Vanderbilt
fuente
fuente
master
puede diferirexperiment
, por ejemplo, puede contener cambios combinados de otras ramas que se perderían en el archivo que se acaba de copiar. PS, por otro lado, no quiere fusionarse, pero hasta donde yo sé, elgit merge
término es solo para rama, no para archivo específico, por lo que no hay contradicción aquí.Respuestas:
¿Ver también git cómo deshacer cambios de un archivo?
Actualización de agosto de 2019, Git 2.23
Con los nuevos
git switch
ygit restore
comandos, eso sería:Por defecto, solo se restaura el árbol de trabajo.
Si también desea actualizar el índice (es decir, restaurar el contenido del archivo y agregarlo al índice en un comando):
Como Jakub Narębski menciona en los comentarios:
también funciona, excepto que, como se detalla en la pregunta SO " ¿Cómo recuperar un solo archivo de una revisión específica en Git? ", debe usar la ruta completa desde el directorio raíz del repositorio.
De ahí la ruta / to / app.js utilizada por Jakub en su ejemplo.
Como Frosty menciona en el comentario:
Pero, para
git checkout
ogit show
, en realidad puede hacer referencia a cualquier revisión que desee, como se ilustra en la pregunta SO " git checkout revision de un archivo en git gui ":sería lo mismo si $ FILENAME es una ruta completa de un archivo versionado.
$REVISION
puede ser como se muestra engit rev-parse
:y así.
Schmijos agrega en los comentarios :
fuente
experiment:./app.js
. (No tiene que especificar la ruta completa). Aprendí esto gracias al mensaje de error muy útil que git me dio: "¿Quiso decir 'mybranch: full / path / to / my / file.xsl' aka 'mybranch: ./file.xsl '? " ¡Sí, lo hice! Creo que nunca me ha encantado tanto un mensaje de error fatal.git restore -s new-feature path/to/app.js
Todo es mucho más simple, usa git checkout para eso.
Supongamos
you're on master
branch, para obtenerapp.js from new-feature
branch do:Esto le traerá el contenido del archivo deseado. Puede, como siempre, usar parte de sha1 en lugar del nombre de la rama de la nueva característica para obtener el archivo como estaba en esa confirmación en particular.
Nota :
new-feature
debe ser una sucursal local , no remota.fuente
git checkout origin/source_branch path/to/file
porque si ha descuidado actualizar la rama fuente de su repositorio local, puede obtener una versión anterior del archivo ... Pregúnteme cómo lo sé. ;)Ejemplo:
Esto no funcionará si el nombre de su sucursal tiene un punto.
fuente
Complementario a las respuestas de VonC y chhh.
o
fuente
--
) entre el nombre de la rama y las rutas es opcional? ¿Es solo para evitar que las rutas, que comenzarían con un guión, sean tratadas como opciones / interruptores?--
es opcional, pero es más útil para evitar conflictos con los nombres de las sucursales. Por ejemplo,git checkout -- foo
significa "retirar el archivo foo de HEAD" (es decir, sobrescribir los cambios locales en foo , es decir, un subconjunto degit reset --hard
), perogit checkout foo
podría significar eso o "vamos a ramificar foo ".O si desea todos los archivos de otra rama:
fuente
.
hace una gran diferencia: en lugar de pasar a otra rama, copia todos los archivos desde allí mientras te deja en la actual. Obtiene contenido de otra rama sin entrar en él.Revise el archivo en github y extráigalo desde allí.
Este es un enfoque pragmático que no responde directamente al OP, pero algunos han encontrado útil:
Si la rama en cuestión está en GitHub, puede navegar a la rama y el archivo deseados utilizando cualquiera de las muchas herramientas que ofrece GitHub, luego haga clic en 'Sin formato' para ver el texto plano y (opcionalmente) copie y pegue el texto como deseado.
Me gusta este enfoque porque le permite ver el archivo remoto en su totalidad antes de llevarlo a su máquina local.
fuente
Si desea el archivo de una confirmación particular (cualquier rama), diga 06f8251f
git checkout 06f8251f path_to_file
por ejemplo, en windows:
git checkout 06f8251f C: \ A \ B \ C \ D \ file.h
fuente
Otra forma es crear un parche con las diferencias y aplicarlo en la rama maestra, por ejemplo. Digamos que la última confirmación antes de comenzar a trabajar en app.js es 00000aaaaa y la confirmación que contiene la versión que desea es 00000bbbbb
Luego de ejecutar esto en la rama de experimento:
Esto creará un archivo con todas las diferencias entre esos dos commits para app.js que puede aplicar donde lo desee. Puede guardar ese archivo en cualquier lugar fuera del proyecto
Luego, en master solo ejecutas:
ahora verá los cambios en los proyectos como si los hubiera hecho manualmente.
fuente
Espero que esto te ayudará. Por favor, avíseme si tiene alguna consulta.
fuente