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> 

Який редактор ви використовуєте? Можливо, у ньому є плагін / аддон / модуль, що додає підтримку для Git?
Якуб Нарбський

Я використовую textmate. У нього є якась підтримка git, я не перевіряв, чи може це зробити.
neoneye

У Textmate є git bundle: github.com/timcharper/git-tmbundle (ви повинні перевірити сторінку InterfacesFrontendsAndTools на git wiki: git.or.cz/gitwiki )
Jakub Narębski

До речі, інтерфейс VC в Emacs (для якого Git також має підтримку у вигляді vc-git.el) має команду "Показати іншу версію". Якщо у TexMate Git Bundle (git-tmbundle) його немає, можливо, варто було б додати його.
Якуб Нарбський

Я використовую посилання для кращого відстеження свого проекту в TextMate. 25 dirs, 300 файлів. Це допомагає приховувати будівельні та інші невідповідні господині. Однак git / TextMate не надто задоволений цими посиланнями, тому ні :-(
neoneye

Відповіді:


312

Ви можете використовувати "git show" для цього:

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

(Зверніть увагу, що :між HEAD^і main.cpp. Є символ двокрапки [ ] . <revision>:<path>Синтаксис описаний на сторінці git rev-parse , поруч з останньою точкою в розділі "Вказівки змін":

  • <rev>: <шлях>, наприклад HEAD: README,: README, master: ./ README

    Суфікс, :за яким слідує шлях, називає крапку або дерево на заданому шляху в об'єкті дерева, названому частиною перед двокрапкою. :path(із порожньою частиною перед двокрапкою) - особливий випадок описаного нижче синтаксису: вміст, записаний в індексі за заданим шляхом.

    Шлях, починаючи з ./або ../відносно поточного робочого каталогу. Даний шлях буде перетворений на користь кореневого каталогу робочого дерева. Це найкорисніше для адреси блобу або дерева з комірки або дерева, яке має таку саму структуру дерева, як і робоче дерево.

Зверніть увагу, що <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 .. підказка> git show --pretty = повніша голова ^ main.cpp, але це не не вирішую.
neoneye

7
"git show HEAD ^ main.cpp" (з пробілом між HEAD ^ та main.cpp) відрізняється від "git show HEAD ^: main.cpp" (з двокрапкою ':' між HEAD ^ та main.cpp).
Якуб Нарбський

Хм, з товстої кишки я бачу цю помилку, тому я вважав, що двокрапка - помилка. Так, схоже, товста кишка - це шлях, але як це вирішити? підказка> git show HEAD ^: main.cpp fatal: неоднозначний аргумент 'HEAD ^: main.cpp': невідома редакція або шлях не в робочому дереві. Використовуйте '-', щоб відокремити шляхи від запиту на редагування>
neoneye

2
Це, ймовірно, означає, що ви дали неправильне PATHNAME (на жаль, через "git show" магічний git не може дати краще повідомлення про помилку). Це має бути ПОВНЕ ім'я шляху відносно верхнього каталогу вашого проекту: $ (git ls-tree -r
onlyname

3
Замість повного шляху від docs: "Шлях, що починається з ./ або ../, є відносно поточного робочого каталогу." Працює на моїй версії 1.8.5.
LVB

24

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.