August 25, 2024
How to Count the Number of Commits After a Specific Commit in Git
I often like to squash multiple commits together into a single commit. For this, I tend to use the git reset --soft HEAD~n command frequently, where n is the number of commits I'd like to cherrypick.
💡 Update: Ben pointed out in the comments that if you know which commit you want to reset to, you can simply do:git reset --soft <commit-id>instead ofHEAD~n. Not sure why I never thought of this 🤦♂️. That said, the rest of the post is still valid to count the number of commits after a commit.
For a small number of commits, it's easy to just count the number of commits manually. However, often I have a long list of commits and counting them all can be tedious. To address this, I was looking for a command that would give me the number of commits made after a specific commit, and came across rev-list, combined with the count flag.
To count the number of commits made after a specific commit in Git, you can use the following command:
git rev-list <specific_commit>..HEAD --count
Here’s a breakdown of the command:
git rev-list: Lists commit objects in reverse chronological order.<specific_commit>: Replace this with the hash of the commit you are interested in...HEAD: This specifies the range from the specific commit to the latest commit (HEAD).--count: Outputs the number of commits instead of the commit hashes.
For example, if your specific commit hash is abc123, the command would be:
git rev-list abc123..HEAD --count
This will give you the number of commits made after the specified commit up to the latest commit. Now you can plug in this number in the git reset --soft HEAD~n to squash them together (or write a shell script that does this in a single command).
If you're using VS Code with the GitLens extension, you can easily copy the commit SHA, as shown below:
Subscribe to get future posts via email (or grab the RSS feed)
Comments (5)
> I often like to squash multiple commits together into a single commit. For this, I tend to use the git reset --soft HEAD~n command frequently, where n is the number of commits I'd like to cherrypick. If you know which commit you want to reset to, why not do it this way: > git reset --soft <commit-id> i.e. no counting backwards is necessary, and seems needlessly complicated. surely i am missing something?
Wow, you're absolutely correct. Don't know why I never thought to try this. I've updated the post to mention it. Thanks for pointing it out, Ben.
In my experience, Gitup (https://github.com/git-up/GitUp/) if a great tool for reordering/merging/squashing/renaming commits. I use it daily in combination with Fork (https://git-fork.com/) which allows reviewing/selecting specific chunks and files through a clear UI. I use both to review, rewrite and reorder commits before pushing branches, to make sure my git history is readable and useful.
Thanks for sharing, will check it out!
I use git rebase using the interactive mode. you locate the first commit using git log then run: git rebase -i <commit-sha> then mark each commit you want to squash. Note: you should know what you are doing, use this command with care...