If issues are used as "work orders", a description of what needs to be done and how it should be done, then you should probably update them so the issue always reflects the final work order. Otherwise where would a developer find the final work order? Having to reconstruct it from the initial, now deprecated one and the fifty comments made below it that alter it in one way or another? In that case it is irrelevant if comments refer to old versions of the work order because a developer doesn't even have to read the old comments, only the final work order is relevant for them. Only if the developer has questions or own comments, replies to those would be relevant and should again be used to update the issue itself.
If issues are only "error reports", that mention the problem, yet provide no concrete solution, or maybe only a suggestion for one, and finding the final solution is done by discussion lead through comments, then you should never edit anything (except typos and grammar mistakes), to retain the history of how the final solution has developed. In a group chat you would also not go back up edit the content old messages based on the content of new ones, would you? Only by keeping all suggestions, objections and rejections it will be comprehensible why a particular solution was chosen in the end. Same thing applies to "feature requests", which are often very vague in the beginning.
The second approach is usually used where access is public and issues may also be created by end users, as these only report problems or send in wishes, yet they are not involved in the development itself and also cannot make decisions about the implementation or whether something is implemented at all. The first approach is rather used in closed groups, where the concrete future development and releases are planned.
We use both approaches. If someone discovers an issue or has a feature request (e.g. a developer, a tester, or a supporter on behalf of a customer), an issue is created which only explains the issue or wish. If it's pretty much clear what needs to be done to resolve the issue, it can be directly added to a planned release (milestone) and get assigned to a developer.
If not, it is used as the base for discussion to find an acceptable solution (or close it, if none can be found). In case such a solution is found, that solution is written to a new issue as a "work order", this "work order" is then added to a milestone and assigned to a developer. The two issues are bound together using the link feature (so each one references the other one on top) and when the new issues is closed, the initial is closed as well.
Depending on the type of issue, we use one or the other update strategy. As for marking the type, you can create dedicated issue types in Gitlab or just tag one of them with a special label.