Git remove duplicate commits

After some playing with remotes I ended up with all my commits being doubled. E.g. instead of

C3107
..
C3
C2
C1

I got

  • use git repo name as ENV variable in jenkins job
  • Is there any way to compare two files in Git without their formatting changes?
  • Git post-receive hook not working
  • How could I use git to deploy?
  • git command to show all (lightweight) tags creation dates
  • How to tell if git has ever tracked file X
  • C3107
    C3107
    ..
    C3
    C3
    C2
    C2
    C1
    C1
    

    where doubled commits has same names but different hashes. The problem is I noticed it too late and not I added a good bunch of commits on top of it.

    Is there a way to remove duplicate commits and not not loose ones I added over?

    P.S.: If it will help I have a copy of a repository before my experiments with remotes.

    Thanks a lot in advance.

    UPDATE As many of you asked here is how ended up like this: I have a repo R1 then I created another one R2. At my local copy which was up to date with R1 I changed origins to R2 and tried to push but some large files were rejected by github. So I did git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' which made git think repositories are different. Then I pushed all to R2 made some commits and decided to switch back to R1 changed origin again and pushed. Then I added some more commits to R1.

  • What are common use cases for git fetch?
  • Splitting large git repository
  • Can't install github is there an alternative?
  • Why is EC2 not pulling updates from bitbucket/github via post-receive hook?
  • how do I run cmd from the git post-commit hook
  • Push from github to heroku without downloading repo
  • 3 Solutions collect form web for “Git remove duplicate commits”

    With a bit of shell magic, grepping and a lot of confidence, then the answer is probably “yes”. But I’d be too leery of completely messing things up to squash over 3000 commits with a single command!

    However, you can do it (moderately) interactively by using interactive rebasing. It’s a bit laborious, but you have good control over what’s happening and you get good feedback from git.

    git rebase -i #commit id where you want to start squashing#

    This will bring up an interactive session. Switch everything but the first commit on the stack to
    fixup or squash.

    pick 07520cd Caught file exists issue. # this is last commit
    fixup 3b71b9f Added README.            # fixup will squash the commit
    
    # Rebase b041966..3b71b9f onto b041966
    #
    # Commands:
    #  p, pick = use commit
    #  r, reword = use commit, but edit the commit message
    #  e, edit = use commit, but stop for amending
    #  s, squash = use commit, but meld into previous commit
    #  f, fixup = like "squash", but discard this commit's log message
    #  x, exec = run command (the rest of the line) using shell
    #
    # These lines can be re-ordered; they are executed from top to bottom.
    #
    # If you remove a line here THAT COMMIT WILL BE LOST.
    #
    # However, if you remove everything, the rebase will be aborted.
    #
    # Note that empty commits are commented out
    

    I have a git koan (koan 8) that walks you through git rebase -i.

    https://github.com/jbremson/git_koans (work in progress)

    ~

    An the end I decided in favour of cherrypicking.

    Git Baby is a git and github fan, let's start git clone.