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

У меня есть файл "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, который может это сделать.


UPDATE: im с помощью git на mac osx 10.5.7

prompt> git --version
git version 1.6.0.4
prompt> 

UPDATE2: Ответ Якуба Нарбского:

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

UPDATE3: ответ Karmi для конкретной версии:

prompt> git show 4c274dd91dc:higgs/Higgs.xcodeproj/project.pbxproj > old_project.pbxproj
prompt> 

Ответ 1

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

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

(Обратите внимание, что между HEAD^ и main.cpp` есть символ двоеточия : '.) "<version> : <path> " синтаксис описан в git rev-parse manpage, рядом с последним в разделе "Указание ревизий":

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

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

         

    Путь, начинающийся с ./ или ../, относится к текущему рабочему каталогу. Данный путь будет преобразован относительно исходного корневого каталога деревьев. Это наиболее полезно для обращения к блобу или дереву из фиксации или дерева, которое имеет ту же структуру дерева, что и рабочее дерево.

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

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

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


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

prompt> git cat-file blob HEAD^:main.cpp > old_main.cpp

Ответ 2

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

Ответ 3

Команда show git не работала для меня (с использованием 1.6.4.msysgit). Может быть, что-то связано с символом разделителя путей Windows?

В итоге я просто загрузил и использовал QGit.... намного проще!