ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Git 복잡한 상황 해결
    깃 & 깃헙 2021. 8. 4. 19:12

    회사에 다니기 전 혼자 개발할 때는 깃과 깃헙을 단순하게 활용했다. 협엽을 위한 버전관리 도구보다는 그저 ssh를 이용한 클라우드 활용하기 정도였다. 생각없이 커밋, 푸시, PR한 과거를 복구하면서 정리해보자.

     

    현재 상황

    - 개발을 위한 로컬브랜치 생성

    - 열심히 개발 및 무지성 커밋(대략 5번, 커밋메세지 무지성 "tmp")

    - 마스터와 싱크를 맞추기 위해 무지성 git merge master

    - github에 push 후 master에 Pull Request

     

     

    문제점

    -  master와 싱크를 맞추는 과정

    - 무지성 커밋과 무지성 메세지

    본인만 이해할 법한 그림이지만 어쨌든 문제상황을 만들었다. test/second에서 커밋한 내용을 PR하고 main에 합쳤다. 그리고 main에서 그 내용을 가져왔기 때문에 origin & main이 동일한 레퍼런스를 가리키고 있음을 알 수 있다. 이때 test/first에서 main과 싱크를 맞추기 위해 머지를 한 그림이고 이전에 무지성 3회커밋을 확인할 수 있다.

     

    어떻게 해결할 것인가

    1) main과 merge하기 전으로 reset시킨다

    2) 여러 커밋로그를 하나로 rebase하고 의미있는 메세지를 적는다

    3) 커밋을 임시로 취소하고 stash를 통해 임시 저장한다

    4) local main에서 origin을 pull해서 main먼저 싱크를 맞춘다

    5) 문제의 브랜치를 main으로 reset해서 싱크를 맞춘다

    6) stash를 pop하여 깔끔한 상태로 만든 뒤 다시 커밋 후 푸시한다^^

     

    나중에 또 볼 것 같은 예감이 드니 아주 천천히 자세히 정리하도록 한다.

     

    1) main과 merge하기 전으로 reset시킨다

    우선 test/first브랜치에서 git log --oneline를 입력하면 아래처럼 커밋 내역을 간단하게 확인할 수 있다.

     

    git reset --hard lognumber를 통해 간단하게 머지 전으로 돌아가주자

     

    2) 여러 커밋로그를 하나로 rebase하고 의미있는 메세지를 적는다

    우선 무지성 커밋 3개를 하나로 합치자. 현재 HEAD로부터 3개를 합치고 싶기 때문에 아래와 같이 입력한다

    git rebase -i HEAD~3

    참으로 다양한 명령어가 있는데 적절히 읽어보고 사용하면 될 듯하다. 본인은 squash를 이용해 첫 커밋에 이후 두 커밋을 합치겠다. :wp를 통해 작업을 마무리하면 커밋메세지를 다시 작성할 기회를 주니 잘 생각해서 다시 작성해보자. 이후 다시 로그를 확인해보면

    원하는 대로 작업이 된 걸 확인할 수 있다!!

     

    3) 커밋을 임시로 취소하고 stash를 통해 임시 저장한다

    커밋에서 취소한 내용을 stash에 보관할 거기 때문에 staged상태로 커밋이 취소되도록 한다.

    git reset --soft HEAD^ (여기서 HEAD^는 현재 HEAD에서 한단계 이전 커밋으로 되돌아감을 말하는 상대경로 개념이다)

    의도한 대로 HEAD가 바뀌었을 뿐 아니라 이전 커밋내역이 staged상태로 변경된 걸 확인할 수 있다. 이제 stash를 통해 임시 staged 파일들을 임시 저장하도록 하자(git stash, 잘 임시저장했는지 확인은 git stash list)

     

     

    4) local main에서 origin을 pull해서 main먼저 싱크를 맞춘다

    이건 이미 진행됐으니 넘어감

     

    5) 문제의 브랜치를 main으로 reset해서 싱크를 맞춘다

    아주 깔끔하게 싱크가 맞춰진 걸 확인할 수 있다!

     

     

    6) stash를 pop하여 깔끔한 상태로 만든 뒤 다시 커밋 후 푸시한다^^

    이후 add, commit하고 push해주자. 다만, 기존 원격 브랜치와 충돌이 일어나므로 git push -f를 통해 강제 푸시해주자. 주의할 점은 이 방법은 혼자 관리하는 브랜치일 때만 유효하다는 점이다. 절대 누군가가 이 브랜치에서 pull하거나 다른 내용을 작업하고 push한 상태면 안된다. 우리 회사는 이슈 브랜치를 같이 관리하진 않는 듯하니 우선 이방법으로 진행한다.

    Before

     

    After

     

     

     

    마치며

    굉장히 깔끔해진 결과로 바뀜을 알 수 있다. 생각보다 많은 시간을 쏟았다 ㅠㅠ

    댓글

Designed by Tistory.