VC & DEV TOOLS/Git

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

언제나중수 2018. 2. 1. 11:57

프로젝트 작업을 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/