I am trying squash many commits into a single one, the problem is that I need do that by author (name or email).
The case:
Lets say I have a branch called feature-a, in this branch I have many commits for many authors. How can I squash all commits by author (email for example) into a single commit. I want do that to be able to merge all author commits into master.
Any help here?
Thanks in advance
Be careful rewriting history
The end result you want might be possible if you create branches for each author, cherry-pick the commits from each author into the right branch, then squash those changes. However, I don't think that will work if these commits meaningfully depend on each other.
If you have a series of commits:
Author1 Author2 Author1
version1 ---commit---> version2 ---commit---> version3 ---commit--->...
If you were to try to extract the changes from Author2, and apply them to version1, there's a good chance it won't make sense (For example, if Author2 modifies code that Author1 created).
With Kenkron's caveats in mind, you could do a:
SORTED_GIT_LOGS=$(git log --pretty="format:%an %H" master..feature_a | sort -g | cut -d' ' -f2); \
IFS=$(echo -en "\n\b"); for LOG in $SORTED_GIT_LOGS; do \
git cherry-pick $LOG; \
done | less
The git log --pretty="format:%an %H" master..feature_a | sort -g
would sort the logs of the feature_a
commits (not the ones from master
because of the master..feature_a
syntax)
You would still need to do an interactive rebase to squash the (now ordered by author) commits on master
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With