Sachverhalt: A. Mit Verfügung vom 20. Dezember 2002 sprach die IV-Stelle des Kantons St. Gallen dem 1962 geborenen A._ ab 1. November 2001 eine halbe Rente der Invalidenversicherung zu. Unter Hinweis auf einen aktuellen Bericht seines Hausarztes Dr. med. M._ ersuchte A._ am 23. März 2004 um Überprüfung der Rente. Nach Abklärungen hob die IV-Stelle mit Verfügung vom 24. Januar 2006 die Rente revisionsweise auf Ende Februar 2006 auf mit der Begründung, der Gesundheitszustand des Versicherten habe sich verbessert und die Erzielung eines rentenausschliessenden Einkommens sei möglich. Die Verwaltung und das kantonale Versicherungsgericht bestätigten die Rentenaufhebung mit Einspracheentscheid vom 16. August 2006 resp. Entscheid vom 2. November 2007. Das Bundesgericht hiess mit Urteil 9C_73/2008 vom 21. Mai 2008 die Beschwerde des A._ gut, hob die genannten Entscheide auf und wies die Sache an die IV-Stelle zurück, damit sie, nach erfolgter Abklärung im Sinne der Erwägungen, über den Rentenanspruch neu verfüge. Nach weiteren Ermittlungen und Durchführung des Vorbescheidverfahrens bestätigte die IV-Stelle mit Verfügung vom 25. Oktober 2010 die Rentenaufhebung auf Ende Februar 2006. B. In Gutheissung der Beschwerde des A._ hob das Versicherungsgericht des Kantons St. Gallen mit Entscheid vom 17. Februar 2012 die Verfügung vom 25. Oktober 2010 auf und sprach ihm ab 1. Juli 2006 eine ganze und ab 1. März 2007 eine halbe Invalidenrente zu. C. Die IV-Stelle führt Beschwerde in öffentlich-rechtlichen Angelegenheiten mit dem Rechtsbegehren, der Entscheid vom 17. Februar 2012 sei aufzuheben. A._ lässt auf Abweisung der Beschwerde schliessen. Ferner lässt er um unentgeltliche Rechtspflege ersuchen. Das kantonale Gericht und das Bundesamt für Sozialversicherungen verzichten auf eine Vernehmlassung. 