You won't need to clear any existing messages (in fact you can't modify or clear the collection), nor will you lose your viewstate. What you are describing is exactly how the system works.
Each time the page is posted, the pagemessages collection is cleared and any new errors are added and displayed for the new request/response cycle.
Sample Working Controller:
public with sharing class PageController {
public string myStringValue { get; set; }
public PageController() {}
public PageReference action1() {
ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.INFO, 'Info Message'));
return null;
}
public PageReference action2() {
ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, 'Error Message'));
return null;
}
}
and the page
<apex:page controller="PageController" >
<apex:form >
<apex:pageMessages id="messages" />
<apex:inputText value="{!myStringValue}" />
<apex:commandButton action="{!action1}" value="action 1" rerender="messages" />
<apex:commandButton action="{!action2}" value="action 2" rerender="messages" />
</apex:form>
</apex:page>
If this doesn't describe your scenario or if you are seeing behavior that differs from this, can you provide more information and markup to support it?