I've made some commits and have pushed it to my remote repo. One of those I want to remove. It includes only one binary file, which was changed only in that commit in that branch. How to remove it without harm for later commits?
-
6`git rebase -i TARGET_COMMIT~1` and then don't pick `TARGET_COMMIT` I think would work. – CollinD Feb 28 '17 at 20:28
-
1In @CollinD solution, you will have to force your push to remote repository (preferred `--force-with-lease`), because your changes won't be possible to fast-forward. If you want to avoid those issues, you can `git revert` this commit. – kolejnik Feb 28 '17 at 21:12
3 Answers
You can use interactive (-i) rebase
to remove a previous commit.
$ git log # copy the target commit
$ git rebase -i <target-commit>~1 # start rebase from the previous commit of target commit
An editor will open with a list of commits, one per line. Each of these lines begins with pick
. Comment out your target commit's line (Put #
at the start of target commit line).
OR, put drop
or d
instead of commenting out the line with #
.
$ git rebase --continue # repeat the command until finish rebase
Now, you need to do force (-f) push to remote since git history has been changed!
$ git push -f origin HEAD

- 22,878
- 9
- 63
- 73
-
-
@AKSHAYSHINGOTE your remote (`origin` here) will be updated (removed the commit from git history). – Sajib Khan Mar 07 '17 at 09:38
-
2Nailed it, thanks for this. **NOTE: If you want to be more explicit, you can also use `drop` or `d` instead of commenting out the line with `#`.** – Joshua Pinter Sep 28 '19 at 17:22
-
1
-
Is there an alternative that doesn't involve force push, and records this commit "deletion"? – tejasvi88 Oct 20 '20 at 07:25
-
@tejasvi88 to delete a commit is like changing git history so, there is no alternative way except force push! (so far I know) – Sajib Khan Oct 20 '20 at 07:33
-
Why no one talk about flag --rebase-merges ? It should be considered in answer, becasuse this solution will remove merge commit between HEAD and target commit+1 – KJanek Jun 25 '21 at 11:01
The flag --rebase-merges should be considered in answer, because the accepted solution will remove the merge commit between HEAD and target commit~1
Example:
Before any rebase:
f3e07b4 (HEAD -> dev, origin/dev) headCommit dd3d182 Merged PR 425: added playoutServerUsage 7ed3eb5 added playoutServerUsage 03b52af feat: add Description Series #targetCommit 0a1217c some_older_commit
git rebase -i target-commit~1
c11fa07 (HEAD -> dev) headCommit 7ed3eb5 added playoutServerUsage 0a1217c some_older_commit
git rebase -i target-commit~1 --rebase-merge
a1943b6 (HEAD -> dev) headCommit 12411a1 Merged PR 425: added playoutServerUsage 7ed3eb5 added playoutServerUsage 0a1217c some_older_commit
Rebase with flag --rebase-merges can be harder and whole process will be longer (bigger tree), but still we have to locate target commit and change 'pick' to 'drop'
After that, I would recommend using
git push --force-with-lease origin HEAD
instead of force only.
PS. It is worth paying attention to which commits hashes was changed

- 1,006
- 1
- 15
- 41

- 147
- 1
- 11
If untracking all the files is okay with you, then you can try deleting the .git
file from the directory.
This files contains all the details regarding all the git commits.
It worked for me and may also work for you.

- 622
- 7
- 17