git-checkout старая версия файла под новым именем

264

У меня есть файл " main.cpp", открытый в моем редакторе.

Я хочу увидеть предыдущую версию " main.cpp" в редакторе тоже.

То, как я делаю это сейчас, похоже на это.

close "main.cpp" in the editor

prompt> mv main.cpp tmp
prompt> git checkout HEAD^ main.cpp
prompt> mv main.cpp old_main.cpp
prompt> mv tmp main.cpp
prompt>

open "main.cpp" and "old_main.cpp" in the editor

Можно ли это упростить, чтобы мне не пришлось закрывать "main.cpp" в редакторе?

То, на что я надеюсь, это вариант, git-checkoutкоторый может это сделать.


ОБНОВЛЕНИЕ: я использую git на Mac OSX 10.5.7

prompt> git --version
git version 1.6.0.4
prompt> 

ОБНОВЛЕНИЕ 2: Якуб Наребски ответ:

prompt> git show HEAD^:dir1/dir2/dir3/main.cpp > old_main.cpp
prompt>

ОБНОВЛЕНИЕ 3: ответ Карми, для конкретной ревизии:

prompt> git show 4c274dd91dc:higgs/Higgs.xcodeproj/project.pbxproj > old_project.pbxproj
prompt> 
neoneye
источник
Какой редактор вы используете? Возможно, он имеет плагин / аддон / модуль добавления поддержки Git?
Якуб Наребски
Я использую textmate. У него есть какая-то поддержка git, но я не проверял, может ли он это сделать.
neoneye
Textmate имеет пакет git: github.com/timcharper/git-tmbundle (вы должны были проверить страницу InterfacesFrontendsAndTools на вики-сайте git: git.or.cz/gitwiki )
Якуб Наренбский
Кстати, интерфейс VC в Emacs (для которого Git также имеет поддержку в виде vc-git.el) имеет команду «Показать другую версию». Если у TexMate Git Bundle (git-tmbundle) его нет, возможно, стоит добавить его.
Якуб Наребски
Я использую символические ссылки для лучшего отслеживания моего проекта в TextMate. 25 папок, 300 файлов. Это помогает скрыть builddirs и другие несоответствующие директории. Однако git / TextMate не слишком довольны этими символическими
ссылками

Ответы:

312

Вы можете использовать «git show» для этого:

prompt> git show HEAD^:main.cpp > old_main.cpp

(Обратите внимание, что :между HEAD^и main.cpp. Есть символ двоеточия [ ] .) <revision>:<path>Синтаксис описан в man - странице git rev-parse , рядом с последним пунктом в разделе «Указание ревизий»:

  • <rev>: <путь>, например, HEAD: README,: README, master: ./ README

    Суффикс, :за которым следует путь, именует BLOB-объект или дерево по указанному пути в объекте tree-ish, названном частью перед двоеточием. :path(с пустой частью перед двоеточием) - это особый случай синтаксиса, описанного ниже: содержимое записывается в индекс по заданному пути.

    Путь, начинающийся с ./или ../относительно текущего рабочего каталога. Указанный путь будет преобразован относительно корневого каталога рабочего дерева. Это наиболее полезно для обращения к BLOB-объекту или дереву из коммита или дерева, которое имеет ту же структуру дерева, что и рабочее дерево.

Обратите внимание, что <path>здесь указан полный путь относительно верхнего каталога вашего проекта, то есть каталога с .git/каталогом. (Или, если быть более точным, к « <revision> » (который обычно может быть любым <tree-ish> , то есть чем-то, что представляет дерево))

Если вы хотите использовать путь относительно текущего каталога, вам нужно использовать ./<path>синтаксис (или ../pathперейти от текущего каталога).

Изменить 2015-01-15: добавлена ​​информация о синтаксисе относительного пути


В большинстве случаев вы можете получить тот же результат, используя git cat-fileкоманду низкого уровня (слесарное дело) :

prompt> git cat-file blob HEAD^:main.cpp > old_main.cpp
Якуб Наребски
источник
3
Я заинтересован в полной копии, но git-show показывает мне только различия .. Я попытался поиграть с опцией --pretty .. prompt> git show --pretty = более полная HEAD ^ main.cpp, но это не так не решить это.
neoneye
7
"git show HEAD ^ main.cpp" (с пробелом между HEAD ^ и main.cpp) отличается от "git show HEAD ^: main.cpp" (с двоеточием ':' между HEAD ^ и main.cpp).
Якуб Наребски
Хм, с двоеточием я вижу эту ошибку, поэтому я думал, что двоеточие было ошибкой. Да, кажется, что двоеточие - путь, но как мне решить это? prompt> git show HEAD ^: main.cpp fatal: неоднозначный аргумент 'HEAD ^: main.cpp': неизвестная ревизия или путь не в рабочем дереве. Используйте '-', чтобы отделить пути от подсказки ревизий>
neoneye
2
Это, вероятно, означает, что вы указали неправильное имя PATHNAME (к сожалению, из-за «git show» magic git не может дать более качественное сообщение об ошибке). Это должен быть полный путь относительно верхнего каталога вашего проекта: $ (git ls-tree -r - name-only HEAD ^ | grep main.cpp)
Якуб Наренбский
3
Вместо полного пути из документов: «Путь, начинающийся с ./ или ../, относится к текущему рабочему каталогу». Работает на моей версии 1.8.5.
LVB
24

Просто добавлю к ответу Якуба: вам даже не нужно перенаправлять вывод в файл с помощью >, если вы заинтересованы только в просмотре содержимого файла в терминале. Вы можете просто бежать $ git show 58a3db6:path/to/your/file.txt.

карми
источник