Estoy usando git y estoy trabajando en la rama maestra. Esta rama tiene un archivo llamado app.js.
Tengo una experimentrama en la que hice un montón de cambios y toneladas de confirmaciones. Ahora quiero traer todos los cambios realizados solo app.jsdesde from experimenthasta masterbranch.
¿Cómo puedo hacer eso?
Una vez más, no quiero una fusión. Solo quiero traer todos los cambios app.jsde experimentrama en masterrama.
git
git-checkout
Nick Vanderbilt
fuente
fuente

masterpuede 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 mergeté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 switchygit restorecomandos, 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 checkoutogit 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.
$REVISIONpuede 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.jsTodo es mucho más simple, usa git checkout para eso.
Supongamos
you're on masterbranch, para obtenerapp.js from new-featurebranch 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-featuredebe ser una sucursal local , no remota.fuente
git checkout origin/source_branch path/to/fileporque 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 -- foosignifica "retirar el archivo foo de HEAD" (es decir, sobrescribir los cambios locales en foo , es decir, un subconjunto degit reset --hard), perogit checkout foopodrí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