Reputation: 2921
I'm trying to use Git for our software development. I found that if I delete a branch in Git, I could lose my code forever. That surprised me. I thought as a version control system, it should be able to let me do anything (even stupid one) without worry about harming my work.
The steps below are what I did:
The question is how can I roll back the action of deleting a branch?
Or, how can I get all history in Git, even something which has disappeared in log?
Upvotes: 36
Views: 31568
Reputation: 1329092
To avoid the issue in the first place, Jefromi advices in the comments:
Another tip: only use
git branch -d
, notgit branch -D
.
You'll be warned if you're about to delete something that might make you lose work, then you can take a second to think before using-D
.
(Or, you can go delete fromgitk
so you really see what you're deleting.)
-d
Delete a branch.
The branch must be fully merged in its upstream branch, or inHEAD
if no upstream was set with--track
or--set-upstream
.
But if you did "lose" your work, see one of the many blogs about reflog (as James Kyburz suggests in the comments):
back to list Git reflog to the rescue September 09, 2010 — written by Chris Sloan | 0 comments »
The other day, I was working on a feature for Real Travel using our current branching strategy in that each release we do is a separate branch.
Not sure if it was a cause of lack of sleep from late hours pulled, but I accidentally deleted my local and remote copy of the branch before I merged it back into the master branch for release.
After a quick state of shock and thoughts running through my head of losing hours of work, I calmed down and relied on my Git knowledge.
Reading your full commit history:There are two ways to read the commit history in git. The first way shows a list of details commits while the other shows the log in reference to the current
HEAD
.
// log of detailed commits by users
$> git log
// reference log compared to the current HEAD
$> git reflog
Using the
reflog
command, I was able to find out exactly where the last reference to my deleted branch was.
An example output of thereflog
might look like this:
c7f3d98 HEAD@{0}: commit: Merged in some code
f5716c8 HEAD@{1}: pull : Fast-forward
d93c27b HEAD@{2}: commit: Added some items to project
...
Now the reflog will not show exactly where the branch was deleted, but if you remember your last commit to that branch and have a detailed enough message, it should be easy to find and restore.
Restoring your branch is straight forward by checking out the HEAD you want to a new branch.
$> git checkout -b my_new_branch HEAD@{5}
You can also use the hash too to checkout the new branch.
$> git checkout -b my_new_branch d93c27b
Simple enough and now I can move on with actually merging the branch in before deletion.
Upvotes: 73