[git] 커밋 변경 이력 되돌리기 - git-revert에 대해 알아보자

2024. 10. 22. 18:23·개발/git

팀에서 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의 사전적 정의는, "돌아가는 것"이다.

네이버 영어사전에서 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 커밋과 revert로 생성된 커밋은 전혀 다른 커밋이다. 하지만 내용물이 똑같기 때문에 이해하기 편하게 빨간색으로 표현했다.

 

 


나같은 경우는 v1.0.0 사이부터 HEAD까지 머지가 몇 개 있었고 대부분의 작업이 파일 이동 및 삭제, 이름 변경이라 충돌도 많이 발생했다.
그래서 그래프가 많이 더러운데, 만약 `-n` 옵션을 넣었더라면 깨끗했을거다...

아주 더러운 그래프.. 흑흑

 

'개발 > git' 카테고리의 다른 글

[gitlab] 깃랩의 커밋들을 깃허브로 옮기자 - 미러링, gitlab 이메일로 잔디심기  (3) 2024.10.08
[git] 원격저장소 url이 바뀌었다...! - git remote set-url  (0) 2024.09.05
'개발/git' 카테고리의 다른 글
  • [gitlab] 깃랩의 커밋들을 깃허브로 옮기자 - 미러링, gitlab 이메일로 잔디심기
  • [git] 원격저장소 url이 바뀌었다...! - git remote set-url
규르릉
규르릉
프론트엔드 개발자가 되고서 느낀점은.. 공부할게 정말 많다! 그리고 정리하지 않으면 공부한 내용이 다 날아간다...
  • 규르릉
    귤로그
    규르릉
  • 전체
    오늘
    어제
    • 분류 전체보기 (16)
      • 개발 (10)
        • git (3)
        • JavaScript (2)
        • 웹개발 (1)
        • 알고리즘 (2)
        • 코드리뷰 (2)
      • CSS (1)
      • 활동 (3)
        • SSAFY (3)
      • 잡다한 것 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    url객체
    urlsearchparams객체
    깃 revert
    백준 입력받기
    백준 javascript
    SSAFY
    SSAFY 합격
    SSAFY 적성진단
    백준 자바스크립트
    SSAFY 8기
    BOJ 자바스크립트
    싸피 8기
    SSAFY 자기소개서
    readFileSync
    SSAFY CT
    set-url
    싸피 지원
    코드유연성
    dry원칙
    백준 node.js
    bare저장소
    싸피 PT
    싸피
    nativeesm
    자바스크립트
    SSAFY 에세이
    커밋 되돌리기
    javascript
    commit 되돌리기
    seletedIndex
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
규르릉
[git] 커밋 변경 이력 되돌리기 - git-revert에 대해 알아보자
상단으로

티스토리툴바