팀에서 v1.0.0 태그를 발행하고, 그 위로 다시 열심히 커밋들을 쌓고 있었다.
그런데 다시 예전 버전(v1.0.0)으로 돌아가자는 의견이 나왔다.
이 때, 기존의 commit log를 남겨두면서 그 위에 v1.0.0을 최신 커밋으로 쌓으려면 어떻게 해야할까?
시간이 없으신 분들은 맨 아래 결론을 봐주세요
우선 git-revert
에 대해 알아보자.
git-revert
의 정의
https://git-scm.com/docs/git-revert.html
Git - git-revert Documentation
While git creates a basic commit message automatically, it is strongly recommended to explain why the original commit is being reverted. In addition, repeatedly reverting reverts will result in increasingly unwieldy subject lines, for example Reapply "Reap
git-scm.com
revert의 사전적 정의는, "돌아가는 것"이다.
git 공식문서를 보면, git revert는 하나 이상의 기존 커밋에 대해서 변경사항을 되돌리고, 이를 기록하는 새로운 커밋을 만든다고 한다. 즉, revert는 변경사항을 취소하는 새로운 커밋을 만든다.
이렇게, commit c
의 변경 내용을 되돌리고 나서, 이를 기록하는 새로운 `commit e`가 쌓이게 된다.commit e
에는, c
의 변경 내역 없이, a, b, d
의 변경내역들만 반영돼있다.
* 참고
작업 디렉토리의 모든 uncommitted 변경사항을 버리고 싶을 때는 git-reset --hard
,
특정 커밋에서 특정 파일들만 가져오고 싶을 때 git-restore --source
를 사용하자.
git-revert
사용하기
git revert
는 다음과 같이 사용할 수 있다.
git revert [--[no-]edit] [-n] [-m <parent-number>] [-s] [-S[<keyid>]] <commit>…
필수
commit
: 되돌릴 커밋이다. 1개만 적으면 해당 커밋만 되돌리게 된다. 물론 범위를 지정할 수도 있다. (자세한 것은 git revision range을 검색하자)
선택
--edit
(-e
) /--no-edit
: revert를 커밋하기 전 커밋 메시지를 수정할 수 있다. 이 옵션은 터미널에서 명령어 실행 시 디폴트로 적용돼있다.--no-commit
(-n
) : git revert 명령어를 실행할 때마다 커밋이 생긴다. 그렇다면 revert를 여러 번 하면 커밋 로그 메시지가 여러개 남게 되고, 이는 굉장히 지저분하다. 이 때 사용하면 좋은 옵션으로, 여러 revert를 하나의 커밋으로 묶고 싶을 때 유용하다. 변경사항들을 작업 트리와 스테이징 영역에만 저장을 해두고, 한 번에 commit 할 수 있다.-m parent-number
(--mainline parent-number
) : merge는 revert할 수가 없다(당했다ㅋ). 어떤 쪽을 기준으로 mainline에 적용해야 할지 모르기 때문이다. 그래서 parent-number를 작성해줘야 하는데, 1을 쓰면 main branch를 기준으로 revert하고 2를 쓰면 feature branch를 기준으로 revert가 실행된다.--signoff
(-s
) : sign-off란 이 커밋의 작성자가 누구인지 커밋의 맨 마지막에 작성되는 문장이다.
좀 (많이) 큰 프로젝트들은, 자신의 기여를 인증하고 책임을 명확히 하기 위해 PR시 반드시 signed-off를 요구하는 경우가 종종 있다고 한다
`Signed-off-by: gyur1kim <gyur1kim@example.com>`
그래서 v1.0.0으로 다시 돌아가는 방법은?
git revert [내가 돌아갈 커밋]..HEAD
# 예시 : 나는 v1.0.0으로 돌아갈 것이다.
git revert v1.0.0..HEAD
이렇게 깃 커밋 사이에 ..
을 작성하면 된다.
이렇게 작성하면 v1.0.0 다음 커밋부터 끝까지 되돌리기 하는 것이므로, v1.0.0로 다시 돌아가게 된다.
나같은 경우는 v1.0.0 사이부터 HEAD까지 머지가 몇 개 있었고 대부분의 작업이 파일 이동 및 삭제, 이름 변경이라 충돌도 많이 발생했다.
그래서 그래프가 많이 더러운데, 만약 `-n` 옵션을 넣었더라면 깨끗했을거다...
'개발 > git' 카테고리의 다른 글
[gitlab] 깃랩의 커밋들을 깃허브로 옮기자 - 미러링, gitlab 이메일로 잔디심기 (3) | 2024.10.08 |
---|---|
[git] 원격저장소 url이 바뀌었다...! - git remote set-url (0) | 2024.09.05 |