본문 바로가기

VC & DEV TOOLS/Git

[GIT] 이전 commit으로 돌아가 수정작업을 하고 리모트 저장소에 최신 commit으로 올리기

프로젝트 작업을 git을 통해 계속해오다 어디서 뭐가 어긋났는지 되돌리기 버거운 일들이 발생했다.


이를 위해 그동안 수행한 커밋 중에서 기능들이 원활히 돌아가던 커밋을 찾아 코드를 되돌리고,


이 코드를 바탕으로 다시 개발을 진행한 뒤 이를 최근 커밋으로 리모트 저장소에 올리고자 하였다.


서치를 좀 해보니까 commit을 직접적으로 최신 commit으로 바로 올려버리는 건 쉽지 않고,


이전 커밋으로 되돌아간 뒤 이를 최신 master와 merge해 최신화하는 방법을 통해


이전 커밋을 바탕으로 한 프로젝트 코드를 최신으로 한 새 commit을 push 할 수 있었다.



1. git reset --hard 커밋코드


이 명령어를 통해 현재 수행하고 있는 프로젝트 전체를 커밋코드에 해당하는 프로젝트 내용으로 되돌린다.


안드로이드 스튜디오를 이용하면서 확인한 바로는 저장 및 불러오기 등등 번거로운 절차없이 부드럽게


프로젝트가 오픈 된 채로 유동적으로 코드들과 자료들이 바뀌어나가는 걸 볼 수 있었다. (매우 신기함)



2. 프로젝트 수정 


3. git add . 


4. git commit -m "메시지"


5. git push origin master 


이때 master 포인터가 되돌아간 커밋코드에 위치하고 있기 때문에 지금의 push는 리모트의 최신 commit에 영향을 주지 않는다.


그리고 내가 브랜치를 따로 만들어주지 않았기 때문에 소속 없는 붕 뜬 commit으로 git에서 존재하게 된다. 


(브랜치를 만들어주기 이전엔 리모트 저장소에서 확인할 수 없었음)


아래 스크린샷에서 5번 명령을 수행 후 그냥 git checkout master로 도망가봤더니


git에서 친절하게 붕 뜬 두개의 commit을 알려주고 있는 것을 볼 수 있다.


아래의 두 commit은 git reset --hard를 통해 되돌아간 프로젝트 코드 바탕하에 새로 작성하여 push한


커밋들이다.




6. git branch 만들브랜치이름 커밋코드


이 명령어를 가지고 붕 뜬 커밋중 가장 최근의 커밋코드를 집어넣으면 이 새로 뻗어나온 두 개의 커밋으로


새 브랜치를 생성할 수 있다. 


7. git merge 새로만든브랜치이름


아까 도망쳐나오면서 내 master 포인터는 현재 리모트 저장소에 최신으로 올라가있는 commit으로 옮겨져 있고,


이 상태에서 새로 생성한 브랜치를 merge 할 수 있다.


이후 git status를 해보면 modified 된 파일들 중 충돌 없는 것들은 푸른색으로 되어 merge 될 것임을 보여주고 


양측 브랜치에서 함께 modifed해 충돌이 일어난 파일을 붉은 색으로 표시해주고 있는 걸 확인할 수 있다.

 




여기서 안드로이드 스튜디오를 확인해보면 충돌이 일어난 파일을 내비게이션에서 붉은색으로 표시해주는데


들어가서 확인하고 충돌부분을 해결해 주면 된다.


8. git add .


9. git commit -m "커밋 메시지"


10. git push origin master




10번째 명령어를 마지막으로 merging이 완료된 것을 리모트 저장소에서도 직접 확인해 볼 수 있게 된다.


보면 내가 이전 commit에서 작업해 새로 push한 commit들이 뻗어나와 있고, 이를 최신 commit과 merge 한것까지


확인해 볼 수 있다.


앞으로도 종종 일어날 일들이라 생각이 되어 익숙해져야 할 git 사용법이라 생각이 든다..


그리고 익숙하던 안 익숙하던 간에 git이 정말 개발하는데는 편하고 편한 도구라는 것은 굉장히 분명하다.



참고 :


https://git-scm.com/book/ko/v2/Git-도구-고급-Merge


https://git-scm.com/book/ko/v2/Git-도구-Reset-명확히-알고-가기


http://www.devpools.kr/2017/02/05/초보용-git-되돌리기-reset-revert/