본문 바로가기

디버깅/Git

[Git] push가 완료된 commit 여러개를 하나로 합쳐보자

반응형

Git을 손에 익히기 위해 프로젝트를 여기저기 PC에서 Clone하여 작업을 하고 있다. 지난 글에선 Pull할때 충돌 하는 것을 해결 했다면.. 

이번엔 repository를 개선하는 작업 중 하나인 Squash 를 하게 될겁니다.



우선 git bash 혹은 터미널에서

$ git log 명령어를 입력하면 그간의 git 로그들을 쭉 볼 수 있습니다. 간단한 사용법은.. 스크롤을 쭉 누르면 로그가 끝까지 계속해서 나오고 종료하려면 'q'를 누르면 됩니다.



우리가 하고자 하는 것은 두개이상의 commit을 하나로 합치려는 것입니다.  보통 git log에서 현재를 기준으로 최신의 것을 내림차순으로 정렬해줍니다.

보통 rebase 라는 걸 이용해서 하게 되는데.


간단히 말하자면 가장 최신의 것을 기준으로 하단의 commit을 묶게되는 겁니다.


가령 맨위의 commit이 e1xxxxxx 라는 일련번호를 가지고 

그다음이 e2xxxxx 이며 세번째를 e3xxxx 라고 가정해봅시다.


최상단의 e1xxx를 기준을 e3xxxx 까지 commit 3개를 묶고 싶다면


$ git rebase -i HEAD~3 

를 입력하면 됩니다.  이 계산은 git log를 통해서 가장 최신의 commit을 기준으로 합칠 commit의 갯수를 말합니다.


rebase 명령을 내리면 다음과 같은 창이 나올겁니다.



=======================================

git rebase -i HEAD~3


pick e1xxxxxx first commit!

pick e2xxxxxx second commit!

pick e3xxxxxx  third commit!

# Commands:
#  p, pick = use commit
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.


대충 이런식을 겁니다. 우리는 e1xxxxx에 e2xxxx, e3xxxx 를 합치고자 하므로 
e2xxxx와 e3xxxx 앞의 'pick'을 'squash'로 바꿔주면 됩니다.

바꾸면 다음처럼 되겠지요



git rebase -i HEAD~3


pick e1xxxxxx first commit!

squash e2xxxxxx second commit!

squash e3xxxxxx third commit!

# Commands:
#  p, pick = use commit
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.

보통 우분투라면 vi, vim 환경이나 gedit 일테고.. 윈도우의 git bash는 어떤 에디터 일지 모르겠지만.. 보통 비슷 할겁니다.

그리고 commit 메세지를 편집할수 있는데. 적당히 편집을 해주면 성공했다는 메세지가 나타나게 됩니다.


squash 하지 않고 commit 했을 경우 squash 한뒤  commit후 push하면 에러가 날수 있다. 

또한 다른 사람이 변경 전 commit들을 pull하면 꼬일수가 있는데. (?)

이를 방지하기 위해 squash후 commit을 해주는 것이 좋다. 


말로 설명하기 어려운데. 협업을 위해 강제로 push 해주는게 좋다는 뜻이다. 


$ git push origin <branch-name> --force 로 강제 push를 해주면 된다.

브런치가 하나 일 경우 git push origin --force를 하면 된다.


참고 출처

https://json.postype.com/post/209499

https://git-scm.com/book/ko/v1/Git-%EB%8F%84%EA%B5%AC-%ED%9E%88%EC%8A%A4%ED%86%A0%EB%A6%AC-%EB%8B%A8%EC%9E%A5%ED%95%98%EA%B8%B0

https://backlog.com/git-tutorial/kr/stepup/stepup7_5.html

http://ko.gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html

https://charsyam.wordpress.com/2013/01/11/%EC%9E%85-%EA%B0%9C%EB%B0%9Cgit-%EC%97%AC%EB%9F%AC-%EA%B0%9C%EC%9D%98-commit-%ED%95%98%EB%82%98%EB%A1%9C-%ED%95%A9%EC%B9%98%EA%B8%B0/



반응형