상황1: 이전 커밋 메시지를 바꾸는 법: amend

이렇게 오타를 내서 feat라고 적어야하는데 fat으로 적어버렸다!!
이 상황에서는 amend를 사용하면 된다
git commit --amend

i를 눌러 오타낸 커밋 이름을 바꿔주고 esc
:wq를 해주면 된다

잘 수행된 걸 볼 수 있다

잘못된 커밋메시지를 덮어썼다!
상황2: 이전이전의 커밋메시지를 바꾸는 법: rebase

로그를 보다 이상한 커밋을 발견했다! (fat??)
이전 커밋이 아니라서 --amend를 사용할 수 없는데, 어떻게 해야하지?
이 상황에서는 rebase를 사용하면 된다
git log

일단 수정해야할 커밋의 위치를 확인한다
최근에서 2번째 커밋이므로, 다음을 입력한다.
git rebase -i HEAD~2
(2번째 이전이라면 해당 숫자를 입력하면 된다)

변경하길 원하는 커밋으로 가서 앞에 pick을 reword 또는 r로 바꿔준다
그리고 esc를 누른 후 :wq 앤터를 누른다


이제 커밋메시지를 수정하는 화면이 뜬다
i를 눌러 원하는 메시지로 수정하고 다시 esc :wq 앤터를 누른다

이런 메시지가 뜨면 성공한거다! 깃 로그를 보면 다음과 같이 변경되어있다

무사히 변경완료!
상황3: 수정해야할 커밋을 push해버린 상황이라면?

이상한 커밋을 만들고 푸쉬를 해버렸다! 큰일이 났다
일단 급한대로 amend를 수행해준다

하지만 푸쉬를 했다면 아직 변경이 안된거다
그래프를 보면 다음과 같이 만들어졌다

분기점이 생겨버렸다!
여기서 할 수 있는 방법은 2가지이다
(1) force push 로 내 로컬 커밋을 origin main에 덮어쓰기
git push --force origin main

일단 성공적으로 force push를 완료했다

깃 그래프는 아무일도 없었다는 듯이 평화롭다
하지만 force push는 정말정말 지양해야한다..
나 혼자 개인프로젝트를 하고있다면 상관없을지 몰라도 팀원들과 같이 프로젝트를 하고있다면 더욱 지양해야한다.
(2) 새로운 브랜치를 만들어 cherry pick하기
https://stackoverflow.com/questions/17906704/failed-to-push-some-refs-when-pushing-feature-branch
Failed to push some refs when pushing feature branch
What can I do to avoid getting the following message when I push a feature branch a second time: To https://github.com/xxx/git_test.git ! [rejected] feature_branch -> feature_branch (non...
stackoverflow.com
다음 글을 보면 이렇게 말한다
다른 누구도 기능 브랜치를 다시 건드리지 않을 것이고 마지막으로 가져온 이후 아무도 기능 브랜치를 변경하지 않을 것이라고 확신한다면 다음을 수행하면 됩니다.
git push -f
그러면 서버의 HEAD를 HEAD로 덮어쓰게 됩니다. 마지막 풀 이후 변경 사항이 없다고 확신하지만 다른 사람이 귀하의 브랜치를 사용하는 경우 위의 작업을 수행하고 브랜치 사본을 가진 모든 사람에게 실행해야 한다고 알릴 수 있습니다.
git fetch origin
git checkout feature_branch
git reset --hard origin/feature_branch
그러면 마지막 푸시 이후의 모든 로컬 변경 사항이 지워집니다.
가장 안전한 방법은 로컬 feature_branch의 이름을 다른 이름으로 바꾸고, 추가한 커밋, 현재 Origin/feature_branch의 분기를 찾아 모든 변경 사항을 cherry pick 하는 것입니다.
무슨 일이 일어나고 있는지 이해하려면 gitk feature_branch Origin/feature_branch를 실행하세요.
여기서 말하는 가장 안전한 방법을 사용해보자!
*참고로 이 방법은 다음과 같은 상황에만 사용가능하다 (아니라면 force push 밖에 답이 없음)
- 기능구현을 위한 브랜치를 만들어 거기다가 push한 상황
- 잘못된 커밋메시지는 main에 들어가지 않았다
///이 방법을 요약하면 잘못 push한 브랜치는 버리고, 새로 브랜치를 만들어 제대로된 커밋을 넣어 푸쉬한 후 main에 merge한다

다시 비슷한 상황으로 돌아왔다
git checkout -b cherryBranch

일단 main브랜치에서 새로운 브랜치를 만든다
(잘못된 커밋메시지가 포함되지 않은 브랜치)

feature1에서 가져올 커밋의 아이디를 확인한다
git cherry-pick 커밋아이디

이름을 고친 커밋 이름으로 cherry-pick을 한다

cherryBranch에는 굉장히 깔끔한 커밋만 남게되었다!
이제 잘못한 feature1 브랜치는 날리고 이 브랜치를 main에 푸쉬한다
요약하면: 커밋을 추가하지 않은 main브랜치에서 다른 브랜치를 만들고, 올바른 커밋을 cherrypick 해온다. 그리고 이 브랜치의 내용을 main에 merge한다
만약 잘못된 커밋을 main에 merge한 상태라면 답은 force push 뿐이다

교훈
push는 신중하게 하자
참고자료
[git] 커밋 메세지 수정하기 (changing commit message)
로컬에 있는, 혹은 리모트에 이미 올라간 commit message 를 수정하는 방법을 알아봅니다. 가장 최신의 commit 을 수정하는 방법과, 더 오래된 commit 을 수정하는 방법을 알아봅니다.
velog.io
https://stackoverflow.com/questions/179123/how-to-modify-existing-unpushed-commit-messages
How to modify existing, unpushed commit messages?
I wrote the wrong thing in a commit message. How can I change the message? The commit has not been pushed yet.
stackoverflow.com
'협업 > Git' 카테고리의 다른 글
| [Git] .gitignore 적용시키기 공부 (0) | 2024.01.28 |
|---|---|
| [GitHub] 테코톡 보면서 깃허브 공부하기 (0) | 2023.11.01 |
| Angular commit 메시지 가이드라인 정리 (0) | 2023.10.19 |
| .gitignore 적용 안될 때 대처법 (0) | 2023.08.13 |