상황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
다음 글을 보면 이렇게 말한다
다른 누구도 기능 브랜치를 다시 건드리지 않을 것이고 마지막으로 가져온 이후 아무도 기능 브랜치를 변경하지 않을 것이라고 확신한다면 다음을 수행하면 됩니다.
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는 신중하게 하자
참고자료
https://stackoverflow.com/questions/179123/how-to-modify-existing-unpushed-commit-messages
'협업 > Git' 카테고리의 다른 글
[Git] .gitignore 적용시키기 공부 (0) | 2024.01.28 |
---|---|
[GitHub] 테코톡 보면서 깃허브 공부하기 (0) | 2023.11.01 |
Angular commit 메시지 가이드라인 정리 (0) | 2023.10.19 |
.gitignore 적용 안될 때 대처법 (0) | 2023.08.13 |