How to Retrieve a Discarded Commit from a Closed Pull Request
Have you ever encountered the heart-stopping moment of accidentally discarding a crucial commit during your development process? I certainly did while working on GitHub. Initially, I wanted to share my experience and knowledge on "How to Retrieve a Discarded Commit from a Closed Pull Request" in this blog post. However, after discovering a powerful solution that saved the day, I knew I had to re-title it to "Saved by git fetch
and GitHub".
Objective
In this article, I'll guide you through the steps I took to recover that lost commit, sparing you from future Git stress. So let's dive in and uncover the magic behind git fetch
and GitHub's functionality.
A little backstory...☁
Here's what happened: I synced a branch of a forked repository with changes from the main branch of the parent repository. In doing so, I accidentally discarded a crucial commit. Realizing the mistake, I began my quest to recover the commit but made several unsuccessful attempts.
Salvation steps 🏆
Despite the many trial and errors, I eventually found a solution that worked. I discovered the following steps that led to a successful retrieval:
- First, I checked the commit history of the pull request (PR) on the parent repository associated with the forked repository. There, I found this entry: "@user123 force-pushed the
Test-Feature
branch 2 times, most recently fromq7a4399
towa8a5fa
". - Armed with this information, I clicked on the
q7a4399
commit link, which redirected me to the commit page. From there, I clicked the "Browse Files" button in the top-right corner of the GitHub page, leading me to a tree page for commitq7a4399
. - On the commit page, I copied the fully spelt hexadecimal object name or the full commit ID from the page's URL. The hexadecimal commit ID looked like this:
q7a439948dd813bdcdd5b153effca041d197591d
. - To retrieve the lost commit, I employed the
git fetch
command with the following syntax:
git fetch origin +q7a439948dd813bdcdd5b153effca041d197591d:Test-Feature
The command's structure is as follows:
git fetch [<repository> [<refspec>...]]
where:
-
repository: Refers to the Git repository (in this case, "
origin
" as a shorthand for my remote GitHub repository). -
refspec: Specifies which refs to fetch and which local refs to update. The format of the parameter is an optional plus "+", followed by the source
<src>
, followed by a colon ":", and finally, the destination ref<dst>
.<src>
typically represents a ref, but can also be a fully spelt hexadecimal object name. (E.g.+<src>:<dst>
=>+q7a439948dd813bdcdd5b153effca041d197591d:Test-Feature
)
For more details on the
git fetch
command, you can refer to its documentation or use the "git fetch --help" command to access the manpage.
By following these steps, I successfully relieved myself from the stress caused by the lost commit.
Conclusion
In conclusion, Git is a powerful tool that requires continuous learning to improve our understanding and expertise. Take the time to explore its capabilities, and you'll find it invaluable in your development workflow.