¿Cómo copio una versión de un único archivo de una rama de Git a otra?

Resuelto madlep asked hace 16 años • 8 respuestas

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?

madlep avatar Nov 21 '08 08:11 madlep
Aceptado

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.txtymydir
  • 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
madlep avatar Nov 21 '2008 04:11 madlep

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 restoremodifica archivos solo en el directorio de trabajo

git checkout otherbranch -- path/to/myfile.txtcopia 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 addlo ejecutaras. git restorede forma predeterminada cambia solo el directorio de trabajo.

Para obtener el mismo resultado que para git checkout otherbranch -- path/to/myfile.txtpuedes escribirgit restore --source otherbranch --staged --worktree path/to/myfile.txt

  • de forma predeterminada git restoreelimina archivos del directorio de trabajo cuando están ausentes en la otra rama

git restorese puede utilizar para restaurar toda la carpeta con git restore --source otherbranch path/to/dir. Puede realizar una operación similar con git checkoutpero, git restorede forma predeterminada, eliminará los archivos que no estén en otherbranch. Para obtener la opción git checkoutde uso del comportamiento --overlay.

Por ejemplo, si hay menos archivos otherbranchque en el directorio de trabajo actual (y estos archivos son rastreados ), sin --overlayopción git restorelos 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 otherbranchpero con archivos adicionales de mi rama actual".

Para obtener realmente el mismo resultado que para git checkout otherbranch -- path/to/dirusted, puede escribirgit restore --source otherbranch --staged --worktree --overlay path/to/dir

  • git restoreno utiliza la redirección de shell para crear archivos (solo problema de Powershell)

git show otherbranch:path/to/myfile.txt > path/to/myfile.txtutiliza 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 restorecambio de archivos se realiza todo mediante el gitejecutable.

Mariusz Pawelski avatar Mar 25 '2020 18:03 Mariusz Pawelski

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
lkraav avatar Aug 17 '2011 20:08 lkraav

Utilice el comando de pago :

  git diff --stat "$branch"
  git checkout --merge "$branch" "$file"
  git diff --stat "$branch"
RzR avatar Mar 06 '2010 14:03 RzR
  1. 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 mastergit checkout master

  2. 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_branchsignifica dónde tiene ese archivo seguido del nombre del archivo que necesita copiar.

Mohideen bin Mohammed avatar Jun 29 '2017 08:06 Mohideen bin Mohammed