53

Using Chris's answer on another question I could prepend a snapshot-history to my git repository. Since one of the files is not part of my history but only in the snapshots, the first original commit now also contains the deletion of this file. How can I undo that?

At first I thought this was the opposite of How do I remove sensitive files from git’s history, but actually I don't want to insert a file into history but just remove the deletion from history.

Community
  • 1
  • 1
Tobias Kienzler
  • 25,759
  • 22
  • 127
  • 221
  • 1
    Git does not track intention, only content. If the file exists in an ancestor and is removed in a child commit, then “remove the deletion from history” and “re-insert the into history” amount to the same thing: make sure the file shows up in the child and its children. – Chris Johnsen Jun 30 '10 at 20:10

2 Answers2

72
git checkout <commit> <filename>
kubi
  • 48,104
  • 19
  • 94
  • 118
70

I got it:

git tag originalHead # just in case
git rebase -i <id of the parent of the commit that deleted the file>
# change pick to edit for that commit
git checkout <id of the previous commit> <filename> # thanks for reminding, kubi
git commit --amend
git rebase --continue
git tag -d originalHead

edit unfortunately this will leave all tags at the old timeline, see here

Community
  • 1
  • 1
Tobias Kienzler
  • 25,759
  • 22
  • 127
  • 221
  • Seriously! git rebase -i This saved my life – HV Sharma Mar 19 '20 at 19:35
  • What does it mean/what are the consequences of leaving all tags at the old timeline? – FreelanceConsultant Feb 23 '22 at 16:13
  • @FreelanceConsultant Your log won't show them at the "proper" commits (also for `git describe`) and the originally tagged ones won't ever be removed by `git clean`. Using `git diff` (or any command actually) with tags will not compare the proper commits as well. Basically everything you do involving history will use the "wrong" commits in a way – Tobias Kienzler Feb 24 '22 at 21:26