如何显示几个提交前删除的git文件

时间:2017-06-13 08:10:32

标签: git

我删除了几个提交前的文件,现在我需要它的一部分 如何显示它以便我可以复制粘贴?

我试过这个:

git show HEAD~2 -- path/to/file

但我根本没有输出。 自动完成功能不适用于已删除的文件,因此我对文件名不是100%肯定,但我肯定是99%。

7 个答案:

答案 0 :(得分:4)

列出两次提交之间所有已更改的文件。

 git diff --name-only START_COMMIT..END_COMMIT

使用--name-status还会显示添加,删除,修改以及文件

等更改
git diff --name-status START_COMMIT..END_COMMIT

答案 1 :(得分:1)

您可以检查删除它的提交(git checkout "old-commit-hash"),复制所需的文件,然后再次检查当前数据(git commit "current-commit-hash")。

可以使用git log

查找哈希值

答案 2 :(得分:1)

您可以使用命令git whatchanged找到已删除文件的名称。它显示了先前提交修改的文件列表。删除的文件标有字母D.识别文件名后,要恢复它,请键入git checkout <hash_id>~ -- <filename>,其中<hash_id>表示使用指定的<filename>删除文件的提交哈希值

如果您只想查看该文件,请输入git show <hash_id> -- <filename>。此命令打印指定提交所做文件的更改(包括删除)。

答案 3 :(得分:1)

我认为你的问题是:

  1. 您删除了一个文件
  2. 然后提交
  3. 很多提交的内容
  4. 现在需要该档案的信息。
  5. 如果是这种情况,你所做的是正确的。但更多的事情要实现它。

    1. git log --pretty=format:"%h - %an, %ad --> %s" --date=iso
      这将使您以可读格式提交日期。 让我们有100个提交,你的提交日期是HEAD的30日左右(然后采取一些&#39;最后40&#39;提交)

    2. git log --pretty=format:"%h - %an, %ad --> %s" --date=iso | head -40 | awk '{print $1}' 如果这提供40次提交作为输出,请执行以下操作。

    3. while read commit ; do echo -e "\n\nFile committed in $commit are : " ; git show --pretty="format:" --name-only $commit ; done< <(git log --pretty=format:"%h - %an, %ad --> %s" --date=iso | head -40 | awk '{print $1}')

    4. 然后将提交ID与您的文件一起使用。

    5. 然后你可以去找你的命令。

答案 4 :(得分:1)

git cat-file -p HEAD~2:path/to/file

答案 5 :(得分:0)

使用gitk。

一种简单的方法,如果您碰巧使用gitk gui,只需在终端中运行gitk,然后浏览git树列表即可删除文件。

使用CLI方式:

git log --your_file_path 

git log --full-history -- your_file_path

如果您只想查看树中已删除的文件Check this answer

答案 6 :(得分:0)

这将显示您对特定文件的最后更改:

var SELECTION_START = 0;
var SELECTION_END = 1;

var selection = [getCellPos(), getCellPos()];

$tbl = $("#table-1");

function startSelection(event) {
    if (event.button === 2) { return false; }

    clearSelectionBorders();
    if (this !== $tbl.find('td.highlighted').last()[0]) {
        setSelection(this, SELECTION_START);
    }
    setSelection(this, SELECTION_END);

    $tbl.find("tr > *").mouseenter(moveSelection);
}

function stopSelection() {
    applySelectionHighlight();
    applySelectionBorders();

    $tbl.find("tr > *").off('mouseenter');
}

function moveSelection() {
    setSelection(this, SELECTION_END);
}

function setSelection(element, position) {
    element = $(element);
    var cellPos = getCellPos(element);
    selection[position] = cellPos;
    applySelectionHighlight();
}

function getCellPos(element) {
    element = $(element);
    if (element.length) return {
        col: element.index(),
        row: element.parent().parent().is($tbl.find('thead')) ? 0 : element.parent().index() + 1
    };
    return {
        row: -1,
        col: -1
    };
}

function getSelectionRect() {
    var rect = {
        x: 0,
        y: 0,
        width: 0,
        height: 0
    };
    rect.x = Math.min(selection[SELECTION_START].col, selection[SELECTION_END].col);
    rect.y = Math.min(selection[SELECTION_START].row, selection[SELECTION_END].row);
    rect.width = Math.max(selection[SELECTION_START].col, selection[SELECTION_END].col) + 1;
    rect.height = Math.max(selection[SELECTION_START].row, selection[SELECTION_END].row) + 1;

    if (rect.x === 0 && rect.width === 1) rect.width = $tbl.find('tr:first-child > *').length;
    if (rect.y === 0 && rect.height === 1) rect.height = $tbl.find('tr').length;

    return rect;
}

function applySelectionHighlight() {
    clearSelectionHighlight();

    var selectionRect = getSelectionRect();
    $tbl.find('thead tr > *').slice(selectionRect.x, selectionRect.width).addClass('highlighted');
    $tbl.find('tr').slice(selectionRect.y, selectionRect.height).each(function () {
        $(this).find('> th:first-child').addClass('highlighted');
        $(this).find('> *').slice(selectionRect.x, selectionRect.width).addClass('highlighted');
    });
}

function clearSelectionHighlight() {
    $tbl.find('tr > *').removeClass('highlighted');
}

function applySelectionBorders() {
    var allHighlighted = $tbl.find('.highlighted');
    allHighlighted.each(function (i, item) {
        var index = $(item).index();
        var b = $tbl.find("td.highlighted:last").addClass("autofill-cover");
        if (!$(item).prev().is('td.highlighted')) {
            $(item).addClass('left');
        }
        if (!$(item).next().is('td.highlighted')) {
            $(item).addClass('right');
        }
        if (!$(item).closest('tr').prev().find('td:nth-child(' + (index + 1) + ')').hasClass('highlighted')) {
            $(item).addClass('top');
        }
        if (!$(item).closest('tr').next().find('td:nth-child(' + (index + 1) + ')').hasClass('highlighted')) {
            $(item).addClass('bottom');
        }
    });
}

function clearSelectionBorders() {
    $tbl.find('td').removeClass('top bottom left right');
}

function clearAll() {
    selection = [getCellPos(), getCellPos()];
    clearSelectionHighlight()
    clearSelectionBorders();
}

$tbl.find("tr > *").mousedown(startSelection);
$(window).mouseup(stopSelection);

$(document).mousedown(function (event) {
    if ($(event.target).parents($tbl).length === 0) clearAll();
});

但是,这有时不太方便,因为您会看到更改,但由于每个更改行前面都有git log -1 -p -- <file_path> ,因此复制粘贴过程可能会非常棘手。

如果要恢复文件,以便可以轻松地从中复制粘贴:

  • 获取已删除文件的提交的SHA:

    -
  • 使用插入符号(git rev-list -n 1 HEAD -- <file_path> )符号在提交之前签出文件:

    ^