git checkout master # first get back to master
git checkout experiment -- app.js # then copy the version of app.js
# from branch "experiment"
¿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
y git restore
comandos, eso sería:
git switch master
git restore -s experiment -- app.js
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):
git restore -s experiment --staged --worktree -- app.js
# shorter:
git restore -s experiment -WS -- app.js
Como Jakub Narębski menciona en los comentarios:
git show experiment:path/to/app.js > path/to/app.js
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:
solo obtendrá el estado más reciente de app.js
Pero, para git checkout
o git 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 ":
$ git show $REVISION:$FILENAME
$ git checkout $REVISION -- $FILENAME
sería lo mismo si $ FILENAME es una ruta completa de un archivo versionado.
$REVISION
puede ser como se muestra en git rev-parse
:
experiment@{yesterday}:app.js # app.js as it was yesterday
experiment^:app.js # app.js on the first commit parent
experiment@{2}:app.js # app.js two commits ago
y así.
Schmijos agrega en los comentarios :
También puedes hacer esto desde un alijo:
git checkout stash -- app.js
Esto es muy útil si está trabajando en dos ramas y no quiere comprometerse.
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í.