tag remove practices crear best git emacs magit

remove - git tag best practices



Usando emacs(y magit?) Para visitar un archivo en commit/branch/etc dado (4)

Si quiero ver cómo se veía foo.bar en un cierto compromiso <COMMIT_ID> entonces puedo invocar:

git show <COMMIT_ID>:foo.bar

Niza ... ¿Cómo puedo hacerlo en emacs ? Utilizando magit ? Utilizando vc ? Digamos que estoy visitando el archivo foo.bar y quiero ver cómo se veía en <COMMIT_ID> .


Hay un paquete llamado git-timemachine que hace que el proceso de visualización de versiones anteriores de un archivo sea casi completamente transparente; Consulte el enlace para obtener instrucciones de instalación y una demostración. (Si ya está utilizando MELPA, solo haga Mx package-install RET git-timemachine RET ).

La forma en que funciona es que usted llama a Mx git-timemachine RET desde un búfer que visita un archivo rastreado. Entonces tú puedes:

  • p Visita anterior version historica
  • n Visita la próxima versión histórica
  • w Copia el hash abreviado de la versión histórica actual
  • W Copia el hash completo de la versión histórica actual
  • q Salir de la máquina del tiempo.

Tenga en cuenta que si conoce el hash del compromiso que desea visitar, el comando personalizado de la solución de @phils le servirá mejor para ese caso de uso específico. Pero para navegar entre diferentes versiones de un archivo, encuentro que usar git-timemachine es incluso más fácil que usar la funcionalidad que proporciona VC.

Por supuesto, puede enlazar git-timemachine a un enlace clave de su elección.


La forma canónica de hacerlo en Emacs es usar VC: Cx v ~ desde el búfer del archivo, le pedirá una revisión y luego mostrará ese archivo tal como estaba en esa revisión. Debería funcionar para cualquier sistema de control soportado por VC, como Git, Bzr, ...


Si está viendo la confirmación en magit, simplemente presione Entrar en el archivo o parte del archivo que le interesa.


  • Cx v l para ver el historial del archivo.
  • nyp para moverse entre comillas.
  • f para visitar el archivo a partir de la confirmación en el punto.

Eso está sujeto a la log-view-find-revision , y si miramos el código que vemos, el bit crítico es:

(switch-to-buffer (vc-find-revision file revision)))

Así que podríamos envolver eso en una función personalizada así:

(defun my-vc-visit-file-revision (file revision) "Visit FILE as it was at REVISION." (interactive (list (expand-file-name (read-file-name (if (buffer-file-name) (format "File (%s): " (file-name-nondirectory (buffer-file-name))) "File: "))) (read-string "Revision: "))) (require ''vc) (switch-to-buffer (vc-find-revision file revision)))

Edición: Stefan ha proporcionado una mejor respuesta, pero si le gustó poder seleccionar el archivo y la revisión, aquí tiene una versión de mi función que mantiene la selección de archivos interactivos, pero usa el código de vc-revision-other-window Para la revisión de manejo.

Llegué a la conclusión de que el uso de otra ventana por defecto tiene más sentido, así que he hecho lo mismo aquí, a menos que proporcione un argumento de prefijo, en cuyo caso utiliza la ventana actual.

(defun my-vc-visit-file-revision (file rev) "Visit revision REV of FILE in another window. With prefix argument, uses the current window instead. If the current file is named `F'', the revision is named `F.~REV~''. If `F.~REV~'' already exists, use it instead of checking it out again." ;; based on `vc-revision-other-window''. (interactive (let ((file (expand-file-name (read-file-name (if (buffer-file-name) (format "File (%s): " (file-name-nondirectory (buffer-file-name))) "File: "))))) (require ''vc) (unless (vc-backend file) (error "File %s is not under version control" file)) (list file (vc-read-revision "Revision to visit (default is working revision): " (list file))))) (require ''vc) (unless (vc-backend file) (error "File %s is not under version control" file)) (let ((revision (if (string-equal rev "") (vc-working-revision file) rev)) (visit (if current-prefix-arg ''switch-to-buffer ''switch-to-buffer-other-window))) (funcall visit (vc-find-revision file revision))))