231

I did a pull request but after that I made some commits to the project locally which ended polluting my pull request, I tried to remove it but without any luck.

I found some similar questions on StackOverflow but I can't apply what's in there. It's my first pull request on GitHub so it's kinda strange to me how all of this works.

The highlighted commit is the one I need to keep and remove all the other stuff. It becomes the fourth commit in the history because I make some merge stuff.

enter image description here

my git log enter image description here

Can someone please explain what's going on and how to fix this problem?

Ferit
  • 8,692
  • 8
  • 34
  • 59
humazed
  • 74,687
  • 32
  • 99
  • 138
  • 2
    You need to [rebase](https://git-scm.com/book/en/v2/Git-Branching-Rebasing), and only "pick" the "added from github" commit (i.e. comment out the lines for every other commit) – scrowler Mar 23 '16 at 02:44
  • 1
    rebase what branch onto what branch can you please add more explanation. – humazed Mar 23 '16 at 02:50
  • `what branch` = the branch you're working on, `onto what branch` = the branch you're pull requesting into – scrowler Mar 23 '16 at 02:50
  • I explained what @Robbie Averill hinted in my answer. It's strange that nobody wrote an answer explaining this until now. – Ferit Jul 20 '18 at 15:32
  • related: https://stackoverflow.com/questions/62951901/is-it-possible-to-remove-a-modified-file-from-a-github-pull-request-via-the-gith – gman Jul 17 '20 at 12:52

7 Answers7

314

People wouldn't like to see a wrong commit and a revert commit to undo changes of the wrong commit. This pollutes commit history.

Here is a simple way for removing the wrong commit instead of undoing changes with a revert commit.

  1. git checkout my-pull-request-branch

  2. git rebase -i HEAD~n // where n is the number of last commits you want to include in interactive rebase.

  3. Replace pick with drop for commits you want to discard.
  4. Save and exit.
  5. git push --force
Ferit
  • 8,692
  • 8
  • 34
  • 59
  • 15
    this worked for me like a charm. I had bunch of commits which shouldnt have been in the PR. I just interactive rebased it, dropped those commits and pushed them back – FullStackEngineer Jul 18 '18 at 15:39
  • 1
    You should sync with remote master before starting a pr anyway, no? – Ferit Jul 20 '18 at 12:39
  • 13
    To push I had to do: `git push origin HEAD:myBranch --force`. But otherwise great and helpful. – ScottyBlades Sep 28 '18 at 19:33
  • @ScottyBlades I omitted that part intentionally as it's out of scope. If you didn't set the tracking branch you either need to set it or, like you did, push explicitly. – Ferit Sep 28 '18 at 20:10
  • 5
    This is also useful when you want to fix an open PR in GitHub, you just need to be able to do a forced push – Vladimir Hidalgo Mar 29 '19 at 02:09
  • Worked like a charm. Also it is better if you can cherry-pick the commit that you want to separate from the PR to another branch. – Shan Chathusanda Jayathilaka Jan 07 '20 at 10:02
  • 15
    What do you mean by "Replace `pick` with `drop` for commits you want to discard."? – gosuto Feb 29 '20 at 08:02
  • 6
    @jorijnsmit they mean after running `git rebase -i HEAD~`, at the top of the file there will `` lines of commits, with each line containing the text `pick `. The commits default to `pick`, so for every commit you want to drop, change the text `pick` to `drop` – Slim Sep 07 '20 at 19:49
  • Silly question - is the "~" a part of the git rebase -i HEAD~n command? – Doug Kimzey Oct 22 '20 at 14:45
  • 1
    Not at all. Yeah, it is a part of the command. @DougKimzey – Ferit Oct 24 '20 at 17:11
  • 1
    This works like a treat. I created a branch that carried over a bunch of commits from the previous branch. So straightforward, unlike alot of git stuff! – Cemal Okten Aug 18 '22 at 14:05
  • 2
    For all those who don't know how to perform 4. step - Save and exit: type :wq! and press Enter key. – Mile Mijatović Dec 26 '22 at 19:19
190

You have several techniques to do it.

This post - read the part about the revert will explain in details what we want to do and how to do it.

Here is the most simple solution to your problem:

# Checkout the desired branch
git checkout <branch>

# Undo the desired commit
git revert <commit>

# Update the remote with the undo of the code
# The force is a tricky flag since it will force the push but
# your administrator can block it, so if it's not an option you
# can delete the old branch and push it again
git push origin <branch> --force

The revert command will create a new commit with the undo of the original commit.

CodeWizard
  • 128,036
  • 21
  • 144
  • 167
  • 6
    Does it work even when we forked the project from some another person and wanna remove some comments in pull request? – Dr.jacky Sep 16 '17 at 06:39
  • to revert all commit from pull request you only need Merge pull request commit id. # Undo the desired commits from pull request `git revert -m 1` – Techie Nov 03 '21 at 07:09
  • You are right @Deeppak, just clarifying that the -m stands for the parent of the merge so you might need to use `-m n` instead of 1 – CodeWizard Nov 03 '21 at 07:32
14

If you're removing a commit and don't want to keep its changes @ferit has a good solution.

If you want to add that commit to the current branch, but doesn't make sense to be part of the current pr, you can do the following instead:

  1. use git rebase -i HEAD~n
  2. Swap the commit you want to remove to the bottom (most recent) position
  3. Save and exit
  4. use git reset HEAD^ --soft to uncommit the changes and get them back in a staged state.
  5. use git push --force to update the remote branch without your removed commit.

Now you'll have removed the commit from your remote, but will still have the changes locally.

John
  • 315
  • 4
  • 8
  • Be very careful when using `git push --force`. It will completely (and irreversibly) override everything that's on the remote with the contents of your local computer. – Velociround Nov 24 '22 at 14:22
4

This is what helped me:

  1. Create a new branch with the existing one. Let's call the existing one branch_old and new as branch_new.

  2. Reset branch_new to a stable state, when you did not have any problem commit at all. For example, to put it at your local master's level do the following:

    git reset —hard master git push —force origin

  3. cherry-pick the commits from branch_old into branch_new

  4. git push
Sampada
  • 2,931
  • 7
  • 27
  • 39
4

From your branch fire below commands

git reset --soft origin/master
git commit -m "Detail of Your last commit that you want to see"
git push -f
Rajesh N
  • 6,198
  • 2
  • 47
  • 58
1

So do the following ,

Lets say your branch name is my_branch and this has the extra commits.

  1. git checkout -b my_branch_with_extra_commits (Keeping this branch saved under a different name)
  2. gitk (Opens git console)
  3. Look for the commit you want to keep. Copy the SHA of that commit to a notepad.
  4. git checkout my_branch
  5. gitk (This will open the git console )
  6. Right click on the commit you want to revert to (State before your changes) and click on "reset branch to here"
  7. Do a git pull --rebase origin branch_name_to _merge_to
  8. git cherry-pick <SHA you copied in step 3. >

Now look at the local branch commit history and make sure everything looks good.

Baptiste Mille-Mathias
  • 2,144
  • 4
  • 31
  • 37
Som Bhattacharyya
  • 3,972
  • 35
  • 54
0

If accidentally pushed unnecessary files and wants to remove them from PR then

 1. git reset <commit ID wherever you want to jump> 
 
 2. git restore <file name you want to remove> or git add <all the file
    names you want to add to commit>

 3. git commit -m “new commit message”

 4. git push -f //necessary to push forcefully (if anything is there to pull)
AshWinee Dhakad
  • 671
  • 7
  • 11