
💡 sourceTree + Github에서 발생한 오류 공유
오늘도 여김없이 나를 깜짝 놀래키는 sourceTree이다..
진짜 부정적인 경험을 너무해서 sourceTree 사용보다는 CLI를 통한 github 업로드를 진행할거다.. .반드시... 반드시이.....

현재 진행 중인 snail 프로젝트에서 기존 진행 중인 feat/chat 브랜치를 잘 사용하고 있었다.
위의 사진을 보는 것 처럼 당장 4일 전인 2/21에 commit push를 잘 진행하여 문제없이 github repo에는 적용이 되어 있는 것을 확인할 수 있다.
하지만 오늘 다시 개발을 위해서 sourceTree로 들어갔을 때, 기존 snail 파일이 feat/chat으로 되어 있지 않고 master branch로 설정되어 있으며, 전체 파일이 전부 등록이 되어 있지 않고, commit 내역이 전부 삭제되어 있었다... (sourceTree는 너무 당황해서 캡쳐를 해두지 못하고 삭제하였다)
위에 사진을 보는 것처럼 feat/chat 브랜치의 status를 보면 전체 파일이 전부 commit되지 않은 오류가 발생하였다.

처음에는 내가 개발 중인 feat/chat 브랜치의 문제가 있는지 확인하기 위해서 현재 개발중인 github repo의 network graph로 들어가서 나의 브랜치 상태를 확인해보았다.
하지만 위 사진에서 보는 것과 같이 나의 브랜치는 내가 개발해둔 상태와 동일하게 21일까지의 활동이 잘 기록된 것을 확인할 수 있었다.
# 1. git log를 찍어보면서 문제 상태 확인하기
$ git log
$ git reflog
가장 처음으로 해당 feat/chat 브랜치에서 문제사항을 찾기 위해서 git log와 git reflog 커멘드를 통해서 실행된 로그와 커밋 해쉬를 통해서 찾아보려고 했지만, 새로 생긴 branch여서 log가 존재하지 않다고 나왔다.. What..?😂
git fsck는 git 데이터베이스 내 객체의 연결성과 유효성을 검사를 하는 메소드이고, 이 메소드를 통해서 dangling 상태의 커밋 해쉬로 부터 잃어버린 커밋을 찾으려고 하였지만, 위에서 아예 commit log 내역을 찾을 수 없기 떄문에 이 또한 의미가 없었다.
하지만 위의 사진에서 보는 것 처럼 여기서도 역시 해당 feat/chat 브랜치가 지금 막 생성된 commit을 한번도 하지 않은 브랜치라고 나타내고 있다.
드디어 오류를 해결할 수 있는 실마리가 잡혔다..
기존에 사용하고 있는 브랜치가 pull이 되지 않아서 발생하는 문제인가 싶어서 git pull origin feat/chat을 사용해서 pull을 진행하였는데 위와 같은 바로 기존 사용하던 feat/chat 브랜치를 다른 git 프로세스가 작동되고 있어, ~.lock 파일을 생성하지 못하여서 발생하는 오류였다.
+) .lock 파일은 특정 Git 프로세스가 동작중일 때 다른 Git 프로세스가 실행되는 것을 막기 위해서 자동으로 생성 되는 파일이다.
결국 이문제가 발생했던 원인은 SourceTree을 사용하여 commit - push를 진행하였는데, 비정상으로 git이 종료되어서 .lock 파일이 남아 있기 때문에 접근이 lock이 걸려서 발생하는 문제였다.
현재 snail 프로젝트에서는 kotlin을 사용하고, Ktlint를 통해서 코딩 컨벤션에 따라 이를 준수할 수 있도록 스타일을 검사한다. 이 과정에서 commit 하기 전에 코드의 스타일을 체크하고, 스타일을 적용하지 않으면 commit을 막게 된다.
하지만 SourceTree와 같은 경우는 따로 설정을 진행하지 않으면, ktlint를 무시하고 강제로 commit-push가 일어난다.
따라서 이러한 문제 때문에 git이 비정상적으로 종료되서 .lock이 삭제되지 않는 문제인가?? 하는 생각을 하였지만... 생각해보면 지금 계속 SourceTree를 사용하여 repo에 올려왔기 때문에 이는 원인은 아닌거 같다는 생각을 하였다.
+) 하지만 이번에 알게된 정보처럼 앞으로는 cli 환경에서 ktlint 검사를 진행하면서 upload를 진행해야 겠다.
정확한 이유를 확실하게 찾지는 못하였지만, 아주 높은 가능성으로 .git 내부에 있는 .lock 파일이 손상이 되었거나, 아니면 의도치 않도록 파일이 꼬여서 git이 비정상적으로 종료되었다고 생각한다.
# 1. .git 파일 내부에 있는 .lock 파일을 제대로 삭제해준다.
$ rm /Users/hyeok/desktop/snail/.git/refs/heads/feat/chat.lock
# 2. 다시 해당 브랜치로 check out 진행
$ git checkout feat/chat
기존에 git이 정상적으로 종료가 된다면, 프로세스가 git 프로세스를 전부 활용하고 .lock 파일을 삭제하여 다른 프로세스가 git 프로세스를 이용할 수 있도록 해주어야 한다.
하지만, git이 비정상적으로 종료되었고, 그로 인해 .lock 파일이 남아있어서 실제 브랜치를 인지하지 못했기 때문에 오류가 발생하였다.
따라서 .lock 파일을 삭제하고, 다시 feat/chat 브랜치로 checkout을 진행하였다.

다행히 lock 파일을 삭제시켜주고 다시 조회해본 결과 이전과 동일하게 잘 적용된 브랜치로 상태가 돌아오는 것을 확인할 수 있었다!!
sourceTree는 생각보다 오류를 자주 발생시키는 거 같다.. 앞으로는 CLI를 이용해서 github에 업로드 해야겠다는 생각이 들었다..🥲