I was 20 commits into a hackoberfest PR when I suddenly realized they they all had my work email on them instead of my personal email 😱. This is the story of how I corrected my email address on 19 individual commits after already submitting for a PR.

  1. Change the email for this repo
  2. Prepare for rebasing
  3. start the rebase
  4. πŸ›  Fix First wrong Commit
  5. Fix all commits
  6. Done
  7. ReCap

Change the email for this repo

stop the bleeding

Before anything else set the email correctly!


cd kedro
git config user.name "Waylon Walker"
git config user.email [email protected]

Prepare for rebasing

First thing is to find how many commits back this mistake goes. I opened up the git log, and saw mine went back 19 commits. I rolled back 20 just to be sure.


$ git log
...
commit a355926b9d7ec4c05659adaa254beefbdb036332
Author: WaylonWalker <[email protected]>
Date:   Sat Oct 17 10:28:59 2020 -0500

    give name of function inside incorrect parameters error

commit 1756f5d121bd06c459560b2e982e0d7b6879e9ca
Author: Kiyohito Kunii (Kiyo) <8097799[email protected]>
Date:   Fri Oct 2 15:33:09 2020 +0100

    Fix docs reference for registering `pipelines`

start the rebase

Now I start the rebase 20 commits back from HEAD. THis will pop you into a text file with a list of commits, for this change simply replace all pick with edit.


git rebase -i HEAD~20

Note for the first commit

If you want to rebase back to the start of the repo use the --root flag.


git rebase -i --root

Run git log to see where we ended up.


$ git log
commit 1756f5d121bd06c459560b2e982e0d7b6879e9ca
Author: Kiyohito Kunii (Kiyo) <8097799[email protected]>
Date:   Fri Oct 2 15:33:09 2020 +0100

    Fix docs reference for registering `pipelines`

As expected we ended up on Kiyo's commit. So we can simply move forward without any edits.


$ git rebase --continue
Stopped at e162ca7...  correct function name in tests
You can amend the commit now, with

  git commit --amend

Once you are satisfied with your changes, run

  git rebase --continue

πŸ›  Fix First wrong Commit

Checking the log again I an now on my first commit with a mistake.


$ git log
commit 95c209a740d6d0340e19a8fc36298cbf874f8bf7 (HEAD)
Author: WaylonWalker <[email protected]>
Date:   Sat Oct 3 11:59:44 2020 -0500

    correct function name in tests

commit cde2e8baa3c1c4a9f1da4135258381466b1da40a
Author: Waylon Walker <[email protected]>
Date:   Sat Oct 17 10:30:07 2020 -0500

    update tests

commit a355926b9d7ec4c05659adaa254beefbdb036332
Author: Waylon Walker <[email protected]>
Date:   Sat Oct 17 10:28:59 2020 -0500

    give name of function inside incorrect parameters error

commit 1756f5d121bd06c459560b2e982e0d7b6879e9ca
Author: Kiyohito Kunii (Kiyo) <8097799[email protected]>
Date:   Fri Oct 2 15:33:09 2020 +0100

    Fix docs reference for registering `pipelines`

Running the following command will reset the author on the current commit.


git commit --amend --reset-author

Double check with a quick git log that the author was fixed.


commit ccaaa56059ee4554731fa83297ca9e8e387a7592 (HEAD)
Author: Waylon Walker <[email protected]>
Date:   Sat Oct 17 10:35:40 2020 -0500

    correct function name in tests

commit cde2e8baa3c1c4a9f1da4135258381466b1da40a
Author: Waylon Walker <[email protected]>
Date:   Sat Oct 17 10:30:07 2020 -0500

    update tests

commit a355926b9d7ec4c05659adaa254beefbdb036332
Author: Waylon Walker <[email protected]>
Date:   Sat Oct 17 10:28:59 2020 -0500

    give name of function inside incorrect parameters error

commit 1756f5d121bd06c459560b2e982e0d7b6879e9ca
Author: Kiyohito Kunii (Kiyo) <8097799[email protected]>
Date:   Fri Oct 2 15:33:09 2020 +0100

    Fix docs reference for registering `pipelines`

Fix all commits

Now to do this for 18 other commits. I found that chaining the three commands into a bash one-liner was quite helpful. I turned off pre-commit hooks with --no-verify. I also turned off the log pager by adding --no-pager.


git rebase --continue && \
git commit --amend --reset-author --no-edit --no-verify && \
git --no-pager log -n 3

Done

This was quick and easy for 19 commits. I have tried to loop through changes like this in the past, and it does get a bit hairy. I find its easier to just setup a one-liner and crank through them one by one.

A note on changing history...

Since this was done in a rebase it has changed the history of the repo. This is ok to do only when you are the only person or are in close communication with everyone using the repo. One thing I have ran into is that if you do this after you submit a PR, but before its completed it duplicates your commits in a merge. For this particular change I simply closed the first PR and opened a second. If someone has a better suggestion, I would be glad to know a better way.

ReCap


cd kedro
git config user.name "Waylon Walker"
git config user.email [email protected]
git log
git rebase -i HEAD~20
git log
git rebase --continue
git log
git rebase --continue && git commit --amend --reset-author --no-edit --no-verify && git --no-pager log -n 3