Git还原已删除的文件并保留文件历史记录

fus*_*har 8 git git-revert git-blame

假设我有一个文件a.txt.有一天,我删除了它,提交并推送了.

第二天,我想恢复最后一次提交,带回来a.txt.我尝试过使用git revert,但是当我这样做时git blame,所有行都显示了恢复提交哈希.最初的责备历史丢失了.

我可以恢复文件并保留文件历史记录,即好像之前没有删除过文件吗?请注意,我不得在推送提交时更改历史记录.

谢谢!

Mat*_*hew 7

CAN做到这一点!这是如何做:

  1. 从要撤消的删除之前的提交中启动新分支.
  2. 合并违规的变化git merge <sha> -s ours.
  3. 如果提交除了要保留的删除之外还有其他更改:
    1. 使用重新应用对工作副本的更改git diff <sha>^..<sha> | git apply.
    2. 丢弃删除(许多技术可用; git checkout -p可能适合您).
  4. 将此分支合并回主分支(例如master).

这产生了一个有两个分支的历史; 文件被删除的文件和永不删除文件的文件.因此,git能够跟踪文件历史记录而无需诉诸诸如此类的英雄事迹-C -C -C.(事实上​​,即使使用-C -C -C,文件也不会"恢复",因为git看到的是一个新文件被创建以前存在的文件的副本.使用这种技术,您将相同的文件重新引入存储库. )


Big*_*her 0

git reset您可以通过使用而不是 来做到这一点git revertgit reset删除新的提交并签出以前的提交。如果您已经推送到上游,则不建议这样做。

NAME
       git-reset - Reset current HEAD to the specified state

SYNOPSIS
       git reset [-q] [<tree-ish>] [--] <paths>...
       git reset (--patch | -p) [<tree-ish>] [--] [<paths>...]
       git reset [--soft | --mixed | --hard | --merge | --keep] [-q] [<commit>]

DESCRIPTION
       In the first and second form, copy entries from <tree-ish> to the index. In the third form, set the
       current branch head (HEAD) to <commit>, optionally modifying index and working tree to match. The
       <tree-ish>/<commit> defaults to HEAD in all forms.
Run Code Online (Sandbox Code Playgroud)

既然你已经推动了:

  • 如果当天没有拉动的活跃协作者,请使用git reset并强制推送git push -f