Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to remove a commit from the middle of a branch

Tags:

git

git-commit

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?

like image 805
Russiancold Avatar asked Feb 28 '17 20:02

Russiancold


2 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 
like image 144
Sajib Khan Avatar answered Nov 15 '22 21:11

Sajib Khan


The flag --rebase-merges should be considered in answer, becasuse accepted solution will remove 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 bo 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 force only.

force vs force-with-lease

PS. It is worth paying attention which commit hashes was changed

like image 23
KJanek Avatar answered Nov 15 '22 22:11

KJanek