본문 바로가기

개발자 이야기/Git, GitHub

터미널에서 git 충돌 해결하기, 그리고 로그 확인하는 방법

오늘은 이번 책을 사서 공부한 뒤 맞는 아마 첫 평일인 것 같다. 오늘도 짧은 야근을 하고 지친 몸을 이끌고 들어와 어떻게든 한 자라도 보려고 책상앞에 앉았다. 그리고 공부를 하고 정리를 한다. 피곤하지만 개발자는 끊임없이 공부하는 직업이라며.. 그런데 지금까지 약 8개월 동안은 매일같이 놀기만 한 것 같다. 물론 야근도 많은 부분을 차지하지만. 10시 이전에 들어오는 날에는 한 자라도 보려고 한다. 10시가 넘으면 씻고 뭐하고 하면 11시이기 때문에.. 출퇴근 거리가 1시간 반에서 2시간 정도 걸리기 때문에(편도) 너무 늦은시간까지 공부하는 것은 오히려 다음날 업무에 지장을 줄 수 있기 때문에 자제하기로.


오늘은 github 들어가기 바로 직전에 나와있는 충돌 해결하는 방법과 로그 확인하는 방법을 공부했다. 충돌은 프로젝트를 하면 절대 피할 수 없다. SVN을 예로 들면 모두가 최신 상태로 sync를 맞춘 상태에서 작업을 하는데 나는 a.java라는 파일을 수정하고 있는데, 다른 사람도 a.java를 수정할 경우엔 나중에 commit할 때 나중에 commit하려는 사람이 충돌을 맛보게 된다. 나같은 경우는 사실 충돌나는 곳을 기억해놨다가(내가 추가한부분) 그냥 그 파일을 revert 시키고 덮어씌워버린다. 다른 더 편한 방법들이 있지만 뭔가 난 이게 익숙하다. 근데 얼마 전 차장님께서 그렇게 하지 말라고 지적하셨으니 고치려고 노력해봐야겠다. 아무튼, 이런 충돌 현상이 당연히 git에서도 일어날 수 있다. 혼자 하는 게 아니라 다른 사람이랑 할 경우에는 특히나 더 날 확률이 높다. 각각 branch를 따다가 작업하다가 master branch로 병합하는 경우 같은 파일을 작업했다면 당연히 충돌날 수 밖에 없다. 터미널을 이용해서 충돌 상황을 만들어보기로 한다.



우선 master branch에 위치한 Hello.java 파일에 저렇게 한 줄을 추가했다. Master라고 썼어야했는데 오타가 났다. 귀찮으니 그대로 진행하도록 한다. 그리고 우선 commit을 했다.




중간에 보면 실행시킨 것도 볼 수 있다. 저렇게 실행시키는 것을 확인한 뒤 git commit -a 명령어를 입력해서 java 파일과 class 파일을 한번에 commit 시켰다. 저 명령어는 정말 유용한 것 같다. 앞으로도 잘 써먹을 것이다. 이렇게 한 뒤, 이번엔 test branch로 옮겨서 다시 Hello.java 파일을 열어서 다르게 입력했다.



자, 이번에는 이렇게 다르게 입력하였다. 그리고 똑같은 과정으로 커밋했다. 그러면 방금 작업한 test branch를 master branch에 merge하기 위해서 master branch로 바꿔준다. 그리고 merge를 해보았다. 현재 두 branch 내의 Hello.java 파일의 내용이 다르다. 과연 어떻게 됐을까?




메시지를 보면 conflict가 떴다. 충돌이라는 뜻이다. Hello.java 파일을 열어서 어떻게 된 일인지 살펴보기로 했다. 




내가 입력하지 않은 문자가 입력되어 있다. 이게 무슨뜻인지 보면 우선 5번째 줄의 System.out.println("Merge"); 까지는 내용이 같은데 <<<< HEAD 에서부터 ==== 사이에 있는 저 문장은 master branch에 아까 내가 입력한 줄이 표시되어 있다. 그리고 ===== 부터 >>> test 사이에 있는 저 문장은 test branch에서 내가 입력한 내용이다. 이렇게 충돌이 났을 경우에는 어떤 지점에서 충돌이 났는지 표시해준다. 그리고 수정해서 commit하면 된다. 컴퓨터는 어떤 부분이 맞는 부분인지 모르기 때문이다.



결국은 그냥 master branch에서 추가한 내용과 test branch에서 추가한 내용을 이렇게 합쳐버렸다. 그리고 다시 commit을 해보았다. 



이렇게 잘 되었다. 물론 프로젝트를 진행하다보면 이렇게 간단한 충돌이 나는 경우는 거의 드물다. 그래도 이렇게 충돌하면 어떻게 해결해야되는지 알게되었다. 그리고 이런 충돌을 해결하고 나면 문득 이런 생각이 들 때가 있다. 대체 누가 무슨 작업을 한거지? 라는 생각. 회사에서는 SVN을 쓰니까 history 들어가서 보는데 git은 log가 있다. log는 간단하게 git log --graphgit log --stat을 이용해서 확인할 수 있다. 




요런식으로 말이다. 이렇게 해서 책의 3장까지 공부하고 정리했다. 그리고 드디어 뒤에는 gitHub 사용법이 나온다. 내가 git을 공부하려고 했던 것도 바로 gitHub에 대한 관심과 호기심에서 나왔다. 내일 야근만 안하면 gitHub를 공부할 수 있겠다!