The difference is that reproject changes the geometry coordinates.
Let me start with a Point layer, with one feature, wich geometry is a point located in latitude = 1°, longitude = 2°.
The geometry WKT is POINT ( 1 2 )
and the layer is defined with CRS EPSG:4326
.
And I have a custom projected CRS which map those coordinates to x = 2000m, y = 1000m.
If I reproject the layer to my custom CRS, the new geometry WKT will be POINT (2000 1000)
, and the new layer will be defined with my custom CRS (e.g, CUSTOM:100001
).
If I assign my custom CRS to the source layer without reproject it, the geometry WKT of the feature will remain POINT ( 1 2 )
, but the layer will be defined in CUSTOM:100001
CRS.
And in that CRS, x = 1m, y = 2m represent a point far away from my source point.
In QGIS 3, the project CRS is the QGIS 2 on-the-fly reprojection feature.
If the project has a CRS defined, all the layers will be reprojected on-the-fly to that CRS before show them in the map.
You can set No projection for the project CRS in its properties, and the layers will be shown in their own CRS.
In that case, both geometries POINT ( 1 2 )
will be shown aligned, altought they are located in different places of the Earth. And POINT ( 2000 1000 )
geometry will be shown far away from the source point, altought they are the same point but defined in different CRS.
Save layer as, when the target CRS is not the same as the source one, implies a Reprojection.
Assign and Define I think is the same, change the layer CRS without change the geometry coordinates.