¿Cómo copio una versión de un único archivo de una rama de Git a otra?
Tengo dos ramas que están completamente fusionadas.
Sin embargo, una vez realizada la fusión, me doy cuenta de que la fusión ha estropeado un archivo (alguien más hizo un formato automático, gah), y sería más fácil cambiar a la nueva versión en la otra rama, y luego reinserte mi cambio de una línea después de llevarlo a mi rama.
Entonces, ¿cuál es la forma más sencilla de hacer esto en Git?
Ejecute esto desde la rama donde desea que termine el archivo:
git checkout otherbranch myfile.txt
Fórmulas generales:
git checkout <commit_hash> <relative_path_to_file_or_dir>
git checkout <remote_name>/<branch_name> <file_or_dir>
Algunas notas (de comentarios):
- Usando el hash de confirmación, puedes extraer archivos de cualquier confirmación
- Esto funciona para archivos y directorios.
- Sobrescribe el archivo
myfile.txt
ymydir
- Los comodines no funcionan, pero las rutas relativas sí
- Se pueden especificar varias rutas
Una alternativa:
git show commit_id:path/to/file > path/to/file
Yo usaría git restore
(disponible desde Git 2.23):
git restore --source otherbranch path/to/myfile.txt
¿Por qué es mejor que otras opciones?
- por defecto
git restore
modifica archivos solo en el directorio de trabajo
git checkout otherbranch -- path/to/myfile.txt
copia el archivo al directorio de trabajo (sus archivos en el disco) pero también al área de preparación. Tiene el mismo efecto que si copiaras el archivo manualmente y git add
lo ejecutaras. git restore
de forma predeterminada cambia solo el directorio de trabajo.
Para obtener el mismo resultado que para git checkout otherbranch -- path/to/myfile.txt
puedes escribirgit restore --source otherbranch --staged --worktree path/to/myfile.txt
- de forma predeterminada
git restore
elimina archivos del directorio de trabajo cuando están ausentes en la otra rama
git restore
se puede utilizar para restaurar toda la carpeta con git restore --source otherbranch path/to/dir
. Puede realizar una operación similar con git checkout
pero, git restore
de forma predeterminada, eliminará los archivos que no estén en otherbranch
. Para obtener la opción git checkout
de uso del comportamiento --overlay
.
Por ejemplo, si hay menos archivos otherbranch
que en el directorio de trabajo actual (y estos archivos son rastreados ), sin --overlay
opción git restore
los eliminará. Pero este es un buen comportamiento predeterminado porque lo más probable es que desee que el estado del directorio sea "igual que otherbranch
", no "igual otherbranch
pero con archivos adicionales de mi rama actual".
Para obtener realmente el mismo resultado que para git checkout otherbranch -- path/to/dir
usted, puede escribirgit restore --source otherbranch --staged --worktree --overlay path/to/dir
git restore
no utiliza la redirección de shell para crear archivos (solo problema de Powershell)
git show otherbranch:path/to/myfile.txt > path/to/myfile.txt
utiliza la redirección de shell estándar. Si usa PowerShell, es posible que haya un problema con la codificación del texto o que se produzca un archivo corrupto si es binario (actualización: solucionado en PowerShell 7.4 ). El git restore
cambio de archivos se realiza todo mediante el git
ejecutable.
Terminé con esta pregunta en una búsqueda similar. En mi caso, buscaba extraer un archivo de otra rama al directorio de trabajo actual que era diferente de la ubicación original del archivo. Respuesta :
git show TREEISH:path/to/file > path/to/local/file
Utilice el comando de pago :
git diff --stat "$branch"
git checkout --merge "$branch" "$file"
git diff --stat "$branch"
Asegúrate de estar en la sucursal donde necesitas una copia del archivo.
Por ejemplo: quiero un archivo de subrama en master, por lo que debes realizar el pago o debería estar en master
git checkout master
Ahora revise solo el archivo específico que desea desde la subrama a master ,
git checkout sub_branch file_path/my_file.ext
Aquí
sub_branch
significa dónde tiene ese archivo seguido del nombre del archivo que necesita copiar.