Hi @Vivek_Rao,
It's useful to keep both the old and new versions of the contract available in your source code, so that you can test the upgrade path. For the new version, it could be a modified copy of the old version, or an extension. Each approach has its tradeoffs, and there is some discussion of those tradeoffs in this thread: To Inherit Version1 to Version2, Or to Copy Code + Inheritance Order from Version1 to Version2?.
Note that if extending, you may want to mark functions as virtual
so that they can be overridden (see thread: How to update contracts and preserve storage in inheritance)