컴퓨터 공부/䷇ Git

[Github/깃허브] push한 commit message 수정

letzgorats 2024. 1. 18. 18:10

자바 스프링 공부를 하다가...커밋 컨벤션을 안지키고 커밋하고 그냥 푸시를 해버렸다.

1차 수정된 커밋

 

이렇게 [Test] 로 컨벤션을 지키면서 커밋작성을 하고 싶었는데, 그냥 "Checking beans in various types and situation' 이라고 올려버렸다.

 

아직 push 하지 않은 커밋메시지는 아래와 같이 amend 를 이용해서 가장 마지막에 commit 한 내용을 수정할 수 있다.

 

git commit --amend

 

git commit --amend 를 사용하고 커밋을 수정할 수 있는 창이 뜨면, 수정을 완료한 후 esc -> :wq(저장 + 창 닫기) 를 해주면 된다.

 


 

그럼, 이미 push한 커밋에 대해서 커밋메시지를 수정하고 싶을 때는 어떻게 해야 할까?

1. 터미널에서 rebase를 사용해서 수정 모드로 바꾼다. 

이를 위해서는 rebase 명령어를 사용해야 한다. rebase명령어는 branch의 base를 다시 설정하여 master(main)브랜치와 merge commit 생성을 방지하여 깔끔한 커밋을 남길 수 있도록 도와주는 명령어이다.

 

(rebase 명령어도 다양하게 쓰일 수 있다. 여기서는 이 정도만 알자!)

git rebase -i HEAD~3

 

rebase에서 -i 옵션을 주면 rebase 명령을 대화형으로 수행하여 더 오래된 commit 수정이나 한 번에 여러 commit 들을 수정할 수 있다. 즉, 커밋 히스토리를 변경 또는 삭제할 때 사용한다고 이해하면 된다.

 

위 커맨드는 현재 작업중인 브랜치의 가장 최근 commit 3개를 보여달라는 git 명령어이다.

(3이 들어간 자리에 체크하길 원하는 commit 의 갯수를 집어넣으시면 된다!)

 

그럼 다음과 같은 창이 뜬다.

git rebase -i HEAD~3

 

각 커밋들은 아래와 같은 형식으로 나온다.

pick | 커밋번호 | 커밋메시지 

 

 

2. 수정하고 싶은 커밋 내역을 reword 키워드로 수정한다.

이제 원하는 커밋에 가서 수정만 하면 된다.

현재 이 글을 쓰기 전에 '[Test] Checking beans in various types and situation' 라고 이미 수정을 했다. 그럼 다시 이 커밋 메시지를 '[Test]Checking beans in various types and situation' 이라고 [Test] 뒷 부분에 띄어쓰기를 한 부분을 붙여서 커밋메시지를 수정해보겠다. 

 

이 때, i를 눌러서 입력 모드로 바꾼 다음 수정하고 싶은 커밋 내역으로 간다.

그러면, 이 커밋내역의 pick 키워드를 reword 키워드로 바꾸고  esc를 누르고 :wq 를 입력해 저장한다.

reword로 바꾸고 esc 하고 :wq

 

3. 커밋 메시지를 수정한다.

커밋메시지 수정

 

위에서 :wq로 종료를 하면, 커밋 메시지에 대한 화면이 위와 같이 터미널에서 다시 호출될 것이다.

이 때, 2번에서처럼 i로 눌러서 입력모드로 전환한 다음, 변경할 커밋메시지로 메시지를 수정 한 후에, esc를 누르고 :wq를 작성해서 종료한다.

띄어쓰기 제거함

 

4. 원격 레포지토리에 push한다.

커밋이 이미 원격에 푸시가 된 상태이기 때문에, 커밋 메시지를 수정한 뒤에

 

git push --force 브랜치 이름

 

라고 작성하여, 원격을 다시 덮어쓴다.

 

(optional -> 수정이 잘 되었는지 git log 를 통해 확인한다.)

git log를 보면 바뀐 이전에 커밋하고 푸시한 커밋내역이 바뀐 커밋메시지로 들어가 있다.

 

만약 메인 브랜치의 경우라면, git push --force main 이 아니라 git push --force origin main으로 입력해야 한다.

(main 브랜치가 아니면, 그냥 브랜치이름만 적어도  된다.) 

git push --force origin main

 

 

※  이처럼, 커밋이 이미 remote 에 적용된 상황이라면, force 를 통해 수정된 커밋을 강제로 push 해주어야 한다다.

github 공식 문서에 따르면 force pushing 을 최대한 사용하지 않아야 한다고 한다. push 된 커밋의 로그를 갖고 있던 다른 팀원들이 로그를 수동으로 수정해줘야 하기 때문이라고 하는데...

로컬에서 commit 을 할 때도 중요하지만 remote 에 push 하기 전에는 정말 두 번 세 번 다시 확인해야 한다!!!

We strongly discourage force pushing, since this changes the history of your repository. If you force push, people who have already cloned your repository will have to manually fix their local history. For more information, see "Recovering from upstream rebase" in the Git manual.

 

 

그래서 만약 force로 하게 된다면 팀원과 상의 후에 할 것을 권장한다! 

(물론 개인 작업/개인 레포라면 크게 상관이 없겠지만 .. ?)

 

위의 과정을 잘 따라왔다면, 다시 깃헙으로 가보았을 때, 커밋 메시지에 띄어쓰기가 없어진 것을 볼 수 있다.

이전 커밋(왼쪽) -> 최종 수정된 커밋(오른쪽)

 

 

반응형