If you imagine a VCS where merges didn't exist, then what would you do when the code is updated after you started on a change you were making? You probably would get a copy of the most up to date version of the code and try to apply your changes to it and make sure it still works.
That's essentially what rebasing does.
What merges do is basically try to have the VCS apply the code changes you made based off an older version of the code and apply it to the newer version of the code. Conflicts are changes you made to your code or the base code in order to get your code to work.
So, it really comes down to the following:
1. Would a reviewer want to view the changes based on the most up to date version of the code as a set of one or more changes?
or
2. Do they want what's in item 1 and then one or more commits that are autogenerated with a mix of automatically applied changes as determined by the VCS and manual changes that are a mix of changes to the base code and code that's part of the new feature?
I assert that it's easier to deal with option 1 because we can clearly see, in a set of organized commits, what changes were made based on the latest version of the code. With option 2, you mix what's in option 1 with automatically generated commits mixed in with changes that update lines of code that may have been made by multiple commits previously applied to the branch.
> a junior developer attempted a rebase or amended a commit in a branch they shouldn't have.
Developers, in general, should look at the commits in their branch by running:
git log -p origin/master..
and read through the commit messages and diffs and see if things make sense. They can also test each change by running:
git rebase --exec "test_command" origin/master..
in order to verify that the changes introduced by each commit didn't break any of the tests.