Чи є швидка команда Git, щоб побачити стару версію файлу?


1509

Чи є команда в Git переглядати (скидається на stdout, або в $PAGERабо $EDITOR) певну версію певного файлу?



Якщо ви прийшли до цього питання, тому що ви хочете перевірити старішу версію бінарного файлу (наприклад, зображення), тоді краще зробити замовлення на стару фіксацію, подивитися, що вам потрібно побачити, а потім повернутися до HEAD. Для цього зробіть git checkout <sha1-of-the-commit-you-need>згодом,git checkout HEAD
Хомеро Есмеральдо

Відповіді:


1730

Ви можете використовувати git showшлях з кореня сховища ( ./або ../для відносного шляху):

$ git show REVISION:path/to/file

Замініть REVISIONсвою фактичну редакцію (це може бути Git commit SHA, ім'я тегу, ім'я гілки, відносне ім’я фіксації чи будь-який інший спосіб ідентифікації комісії в Git)

Наприклад, щоб переглянути версію файлу <repository-root>/src/main.cз 4 коміток тому, використовуйте:

$ git show HEAD~4:src/main.c

Git для Windows вимагає нахилення косої риски навіть у шляхах відносно поточного каталогу. Для отримання додаткової інформації ознайомтеся з довідковою сторінкою git-show.


5
Насправді, здається, це не працює - ти спробував? Для "git show HEAD: path / to / file.c" я отримую помилку "неоднозначний аргумент".
Майк


20
Якщо ви маєте вікна, це може бути річ, що розділяє шлях; якщо я git show HEAD: dir \ subdir \ файл, я отримую неоднозначний аргумент. Якщо я роблю git show HEAD: dir / subdir / file, він працює як очікувалося.
Метт Макмін

12
Шлях, який ви повинні вказати після:: - від кореня сховища git. (це було дано нижче як відповідь, але я думаю, це було задумано як коментар до цієї відповіді)
MatrixFrog

9
Якщо ви хочете побачити це у розділі Vim, щоб вони прокручувались разом, я написав короткий пост у блозі, де було показано, як це зробити.
Флавіу

257

Це за датою виглядає приблизно так:

git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt

Зауважте, що HEAD@{2013-02-25}в цьому сховищі (за допомогою рефлогу ) "HEAD був 2013-02-25" , а не "останній запис до 2013-02-25 у цій гілці історії".


5
Дивовижно. Заощаджує моє багато часу замість того, щоб їхати в Github і подивитися на коміт.
Фізер Хан

"Точка" на шляху до файлу була моєю проблемою. Дякую!
tomascharad

5
Ця команда корисна masterзамість HEAD@{2013-02-25}, якщо ви перебуваєте на гілці,
проведіть стрічку

1
Ви можете включити час, а-ля git log --since='2016-04-28 23:59:59 +0100'?
dumbbledad

7
Те, що цей синтаксис використовує рефлог, є важливим і його слід чітко підкреслити, оскільки рефлог не містить усіх комітів . Дивіться blog.endpoint.com/2014/05/git-checkout-at-specific-date.html
Аліса Хітон

113

Якщо вам подобаються графічні інтерфейси, ви можете використовувати gitk:

  1. почати gitk з:

    gitk /path/to/file
    
  2. Виберіть версію у верхній частині екрана, наприклад, за описом чи датою. За замовчуванням у нижній частині екрана відображається різниця для цієї версії (що відповідає перемикачу "патч").

  3. Щоб побачити файл для вибраної версії:

    • Клацніть перемикач "дерево". Це покаже корінь дерева файлів у цій версії.
    • Перейдіть до файлу.

7
Це також працює з tig , який є прокляттям git repo глядача.
Матвій Г

1
@Paul Slocum: Можливо, ця команда - це не звичайна команда, не вбудована git. Я думаю, що ця команда працює лише для Windows.
Енвіл

Зверніть увагу, це працює, лише якщо ви починаєте з кореня вашого git сховища.
Марк

Якщо ви хочете перевірити проти певного перегляду з gitk ви також можете використовувати цей ярлик: gitk REVISION /path/to/file. Це може стати в нагоді, якщо, наприклад, ви хочете перевірити певну версію.
Крістіан.D

89

Ви також можете вказати командуcommit hash (часто її також називають commit ID) .git show


Коротко

git show <commitHash>:/path/to/file


Крок за кроком

  1. Показати журнал усіх змін для даного файлу за допомогою git log /path/to/file
  2. У наведеному списку змін він відображає commit hashтакі, як commit 06c98...(06c98 ... що є хеш фіксації)
  3. Скопіюйте commit hash
  4. Виконайте команду, git show <commitHash>:/path/to/fileвикористовуючи commit hashкрок 3 та path/to/fileкрок 1.

Примітка: додавання ./значень при заданні відносного шляху здається важливим, тобто git show b2f8be577166577c59b55e11cfff1404baf63a84:./flight-simulation/src/main/components/nav-horiz.html.


1
якщо ви не знаєте шлях до файлу, використовуйте git show <SHA1> --name-onlyйого.
Тіна

ця команда op - навіть авто завершується з пам'яті - перевірена на видаленому каталозі ... не може отримати більше
опції,


23

Щоб швидко побачити відмінності від старих версій файлу:

git show -1 filename.txt > для порівняння з останньою версією файлу

git show -2 filename.txt > для порівняння з другою останньою редакцією

git show -3 fielname.txt > для порівняння з останньою третьою останньою редакцією


18
Ці команди показують відмінності від поточної для мене версії, але не показують весь файл.
Жан Пол

18

git log -pпокаже вам не лише журнали фіксації, але й різницю кожного комітету (за винятком об'єднань). Потім ви можете натиснути /, ввести ім'я файлу та натиснути enter. Натисніть nабо, pщоб перейти до наступного / попереднього події. Таким чином, ви не просто побачите зміни у файлі, а й інформацію про фіксацію.


3
Схоже git log -pm, також було б показано об'єднання комітетів.
sanbor

2
Ви також можете запустити, git log -p -- filename.txtщоб обмежити історію лише потрібним файлом.
Жан Пол

3

Ви можете використовувати такий сценарій, щоб скинути всі версії файлу для розділення файлів:

напр

git_dump_all_versions_of_a_file.sh path/to/somefile.txt

Отримайте сюди сценарій як відповідь на інше подібне запитання


1
git_root, git_log_shortі git_log_message_for_commitвідсутні.
mogsie

Гарний улов! Я подвійно опублікував цю відповідь у двох різних місцях, а щойно видалив цю і пов’язав з іншою, де люди мені розповідали про це раніше ... дякую @mogsie!
Бред Паркс

Цей сценарій дуже корисний!
XMAN

3

ШЛЯХ 1: (я віддаю перевагу цьому)

  1. Знайти ідентифікатор фіксації за допомогою:git reflog
  2. Список файлів з фіксації git diff-tree --no-commit-id --name-only -r <commitHash>

приклад: git diff-tree --no-commit-id --name-only -r d2f9ba4// "d2f9ba4" - це ідентифікатор фіксації з "1."

  1. Відкрийте потрібний файл з командою:

git show <commitHash>:/path/to/file

приклад: git show d2f9ba4:Src/Ext/MoreSwiftUI/ListCustom.swift// "Src / ..." - шлях до файлу з "2."

ШЛЯХ 2:

  1. Знайти ідентифікатор фіксації за допомогою:git reflog
  2. зробити жорсткий перезавантаження цього зобов’язання: git reset --hard %commit ID%

git reset - твердий c14809fa

  1. внесіть будь-які непотрібні зміни та зробіть нові зобов’язання у потрібну гілку :)

0

Допоможіть отримати декілька файлів із заданої версії

Намагаючись вирішити конфлікти злиття, цей помічник дуже корисний:

#!/usr/bin/env python3

import argparse
import os
import subprocess

parser = argparse.ArgumentParser()
parser.add_argument('revision')
parser.add_argument('files', nargs='+')
args = parser.parse_args()
toplevel = subprocess.check_output(['git', 'rev-parse', '--show-toplevel']).rstrip().decode()
for path in args.files:
    file_relative = os.path.relpath(os.path.abspath(path), toplevel)
    base, ext = os.path.splitext(path)
    new_path = base + '.old' + ext
    with open(new_path, 'w') as f:
        subprocess.call(['git', 'show', '{}:./{}'.format(args.revision, path)], stdout=f)

GitHub вище за течією .

Використання:

git-show-save other-branch file1.c path/to/file2.cpp

Результат: наведені нижче містять альтернативні версії файлів:

file1.old.c
path/to/file2.old.cpp

Таким чином, ви зберігаєте розширення файлу, щоб ваш редактор не скаржився, і ви можете легко знайти старий файл поруч із новим.


@MickeyPerlstein, якщо ти можеш досягти того ж інтерфейсу з кращою реалізацією, я все чую.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

можливо я не розумію (і якщо так, то вибачте), але чи не просто так: "git show version: ./ path> new_path"?
Міккі Перлштайн

@MickeyPerlstein Привіт, так, моя команда генерує CLI, але вона перетинає декілька файлів і створює вихідне ім'я з введення, тож вам не доведеться надто друкувати. Нічого революційного, звичайно, але зручно.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.