DrawingProcess
드프 DrawingProcess
DrawingProcess
전체 방문자
오늘
어제
«   2025/06   »
일 월 화 수 목 금 토
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
  • 분류 전체보기 (967)
    • Profile & Branding (25)
      • Career (18)
    • IT Trends (254)
      • Conference, Faire (Experien.. (31)
      • News (187)
      • Youtube (19)
      • TED (8)
      • Web Page (2)
      • IT: Etc... (6)
    • Contents (97)
      • Book (66)
      • Lecture (31)
    • Project Process (94)
      • Ideation (0)
      • Study Report (34)
      • Challenge & Award (22)
      • 1Day1Process (5)
      • Making (5)
      • KRC-FTC (Team TC(5031, 5048.. (10)
      • GCP (GlobalCitizenProject) (15)
    • Study: ComputerScience(CS) (72)
      • CS: Basic (9)
      • CS: Database(SQL) (5)
      • CS: Network (14)
      • CS: OperatingSystem (3)
      • CS: Linux (39)
      • CS: Etc... (2)
    • Study: Software(SW) (95)
      • SW: Language (29)
      • SW: Algorithms (1)
      • SW: DataStructure & DesignP.. (1)
      • SW: Opensource (15)
      • SW: Error Bug Fix (43)
      • SW: Etc... (6)
    • Study: Artificial Intellige.. (149)
      • AI: Research (1)
      • AI: 2D Vision(Det, Seg, Tra.. (35)
      • AI: 3D Vision (70)
      • AI: MultiModal (3)
      • AI: SLAM (0)
      • AI: Light Weight(LW) (3)
      • AI: Data Pipeline (7)
      • AI: Machine Learning(ML) (1)
    • Study: Robotics(Robot) (33)
      • Robot: ROS(Robot Operating .. (9)
      • Robot: Positioning (8)
      • Robot: Planning & Control (7)
    • Study: DeveloperTools(DevTo.. (83)
      • DevTool: Git (12)
      • DevTool: CMake (13)
      • DevTool: NoSQL(Elastic, Mon.. (25)
      • DevTool: Container (17)
      • DevTool: IDE (11)
      • DevTool: CloudComputing (4)
    • 인생을 살면서 (64)
      • 나의 취미들 (7)
      • 나의 생각들 (42)
      • 여행을 떠나자~ (10)
      • 분기별 회고 (5)

개발자 명언

“ 매주 목요일마다 당신이 항상 하던대로 신발끈을 묶으면 신발이 폭발한다고 생각해보라.
컴퓨터를 사용할 때는 이런 일이 항상 일어나는데도 아무도 불평할 생각을 안 한다. ”

- Jef Raskin

맥의 아버지 - 애플컴퓨터의 매킨토시 프로젝트를 주도

인기 글

최근 글

최근 댓글

티스토리

hELLO · Designed By 정상우.
DrawingProcess

드프 DrawingProcess

[Git] reset과 revert 알고 사용하기
Study: DeveloperTools(DevTool)/DevTool: Git

[Git] reset과 revert 알고 사용하기

2022. 7. 20. 05:44
반응형

Git reset vs revert 차이점


  • 공통점: '과거로 되돌린다.' 는 것.
  • 차이점: '과거로 되돌리겠다는 내용도 기록되는가?(= commit 이력에 남는가?)' 이다.
  • reset : 시간을 아예 과거의 특정 사건(commit)으로 되돌립니다(= commit 이력이 남는가? X).
    • 아예 현재가 없었던 것 처럼 원하는 과거로 돌아갈 수 있습니다.
    • 정말 말 그대로 '리셋'이며, reset은 이력을 남기지 않습니다.
    • 따라서 현재까지의 commit 이력을 남기지 않고 원하는 시점으로 완전히 되돌아가고 싶을 때 사용할 수 있습니다.
  • revert : 현재에 있으면서 과거의 특정 사건(commit)들만 없던 일로 만듭니다(= commit 이력이 남는가? O).
    • 과거로 돌아가겠다는 이력을 남겨두고 원하는 시점으로 돌아갑니다.
    • 즉, 이전의 commit 내역을 남겨두고 새로운 commit을 생성하면서 과거로 돌아가게 됩니다.

 

Git reset vs revert 사용


git log: 되돌리고 싶은 시점 확인

$ git log --oneline
12741e5 (HEAD -> main) Add ThisIsaFile
d678197 Add .gitignore
97f1e31 Readme.md
  • 97f1e31 -> d678197 -> 12741e5 순으로 커밋한 것을 확인할 수 있습니다.
  • 이때, commit id: 97f1e31로 되돌리고 싶다면?

 

git reset: 커밋 취소하기

// git reset [option] <commit id>
$ git reset --hard 97f1e31
$  git log --oneline
d678197 (HEAD -> main) Add .gitignore
97f1e31 Readme.md
  • commit id
    • 기본적으로 git log에 나온 commit id를 적어서 사용합니다.
    • HEAD^: 가장 최근의 커밋이 취소됩니다.
    • HEAD~n: 현재로부터 n개의 커밋을 취소합니다.
  • option
    • --soft
      • commit된 파일들을 staging area로 돌려놓습니다. (commit 하기 전 상태로)
        • HEAD가 특정 커밋(과거 또는 미래)을 새롭게 가리키게 됩니다.
        • 대신 현재 작업 중인 working directory와 staging area는 아무런 영향을 받지 않습니다.
    • --mixed (default)
      • commit된 파일들을 working directory로 돌려놓습니다. (add 하기 전 상태로)
        • HEAD가 특정 커밋(과거 또는 미래)을 새롭게 가리키게 됩니다.
        • 그리고 staging area도 해당 커밋의 모습과 동일하게 변합니다.
        • 하지만 현재 작업 중인 working directory는 아무런 영향을 받지 않습니다.
    • --hard
      • commit된 파일들 중 tracked 파일들을 working directory에서 삭제합니다. (Untracked 파일은 여전히 Untracked로 남는다.)
        • HEAD가 특정 커밋(과거 또는 미래)을 새롭게 가리키게 됩니다.
        • 그리고 staging area와 현재 작업 중인 working directory도 해당 커밋의 모습과 동일하게 변합니다.
          • 추가로, 
      • 주의!!: 만약 현재 working directory에서 어떤 작업을 하다가 커밋을 하지 않고 --hard 옵션으로 git reset을 해버리면 이때까지 작업했던 게 다 날아가버리기에 주의할 필요가 있습니다.

+ git reset --hard: Untracked 파일 삭제하기

# 삭제 대상(Untracked files) 목록 확인
$ git clean -n

# Untracked files 파일 삭제
$ git clean -f
  • git reset --hard 옵션을 적용하면, commit된 파일들 중 tracked 파일들을 working directory에서 삭제합니다. 
    • 이때 Untracked 파일은 여전히 Untracked로 남게되는데, 이를 삭제하는 방법은 위와 같이 확인 후 삭제할 수 있습니다.

 

git revert: 커밋 내용 되돌리기

git revert 사용

$ git log --oneline
12741e5 (HEAD -> main) Add ThisIsaFile
d678197 Add .gitignore
97f1e31 Readme.md
$ git revert <commitId>

  • vscode 상에서 git revert를 사용하면, 다음과 같이 이전 커밋과 현재 커밋의 충돌점을 찾아주어 수정하도록 도와줍니다(merge conflict 해결시와 유사).
    • Accept Current Change: 초록부분에 해당하는 현재 코드를 그대로 사용합니다.
    • Accept Incomming Change: 파란부분에 해당하는 git revert하며 들어오는 코드로 변환합니다.
    • Accept Both Change: 두 commit: 일단 두 부분을 모두 남겨둡니다(이후 수정은 본인의 자유).

특정 커밋까지 git revert 사용

// 97f1e31까지 되돌리기 위한 현재부터 순차적으로 revert
$ git revert --no-edit 12741e5
$ git revert --no-edit d678197
$ git revert --no-edit 97f1e31

// 여러 커밋을 한꺼번에 되돌리는 방법
$ git revert --no-edit 12741e5 d678197 97f1e31
  • revert를 이용해서 특정 커밋으로 전으로 되돌리기 위해서는 순차적으로 revert해주어야 합니다.
    • 물론 특정 커밋만 되돌리기 위해서는 특정 커밋만 revert 해주면 됩니다.

+ git reset: 머지 커밋(Merge Commit)을 되돌리는 방법

$ git show 1123a41
commit 1123a419d52f8eea2273411b4afdfa1914e4195c (HEAD -> master)
Merge: 94668df 1bf9843
git revert -m 1 1123a41
git revert -m 2 1123a41
  • 1123a41 커밋은 94668df 커밋과 1bf9843 커밋을 머지한 커밋입니다.
  • 이를 되돌리기 위해서는 각각의 커밋으로 되돌려줘야 하며,
    • 94668df커밋으로 되돌리려면 -m 1, 1bf9843 커밋으로 되돌리려면 -m 2를 지정해주면 됩니다.
    • git show에서 보여지는 Merge: 94668df 1bf9843 값들에 차례대로 번호가 부여됩니다.

+ git format-patch & apply: 수동으로 revert하는 방법 (패치파일 생성 및 적용)

// 패치파일 생성: 커밋의 변경사항을 파일로 저장
$ git format-patch -1 12741e5
0001-Add-ThisIsaFile.patch

// 패치파일 확인
$ cat 0001-Add-d.patch

// 패치파일 적용
$ git apply -R 0001-Add-d.patch

++ 추가: git commit –amend: 커밋 덮어쓰기

$ git commit --amend
  • 보통 다음과 같은 상황에서 사용합니다.
    • 스테이징에 반영된 수정사항을 이전 커밋에 추가하고 싶거나,
    • 직전에 작성한 커밋 메시지를 수정하고 싶은 경우에 사용합니다.
    • 물론 위 두가지 모두에 해당되는 경우에도 사용할 수 있습니다.

 

결론


  • revert를 사용하면,
    • 중간에 무슨 문제가 있었는지, 왜 돌아갔는지 등의 기록이 가능하다는 장점이 있습니다.
    • 또한 다른 사람과 같은 브랜치에서 함께 작업할 때 코드 충돌을 최소화할 수 있습니다.
  • reset 을 사용하면,
    • 커밋 히스토리를 깔끔하게 유지할 수 있고, 혼자 작업할 때 편하게 되돌아갈 수 있다는 장점이 있습니다.
    • 그러나 타인과 같은 브랜치에서 함께 작업할 때 커밋이 뒤섞여버릴 수 있다는 위험한 단점이 있습니다.
  • 근데... 하나의 브렌치에서 여러 사람이 협업을 하는 경우가 있다면?(그럴리는 거의 없겠지만)
    • revert와 reset은 사용하지 않아야 합니다!

 

참고

  • [코드잇] git reset의 3가지 옵션 제대로 이해하기: https://blog.naver.com/PostView.naver?blogId=codeitofficial&logNo=221950118036&redirect=Dlog&widgetTypeCall=true&directAccess=false
  • reset과 revert 알고 사용하기: https://velog.io/@njs04210/Git-reset%EA%B3%BC-revert-%EC%95%8C%EA%B3%A0-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0
  • git revert 사용법: 이미 커밋한 내용을 되돌리는 방법: https://www.lainyzine.com/ko/article/git-revert-reverting-commit-in-git-repository/ 
반응형
저작자표시 비영리 변경금지 (새창열림)

'Study: DeveloperTools(DevTool) > DevTool: Git' 카테고리의 다른 글

[Git] Git branch 전략 (Git flow보다 중요한 것은.. Code Review)  (0) 2022.09.16
[Git] Github 쓰다가 생기는 골치 아픈 문제들... 해결책 포함.  (0) 2022.08.25
[Git] git tag & 버전 넘버링 규칙: git은 버전관리도구이다!!  (0) 2022.07.06
[Git] Commit 메시지 가이드라인  (0) 2022.07.04
[Git] ssh 공개키 GitHub에 등록하기 (feat. github, bitbucket)  (0) 2022.06.21
    'Study: DeveloperTools(DevTool)/DevTool: Git' 카테고리의 다른 글
    • [Git] Git branch 전략 (Git flow보다 중요한 것은.. Code Review)
    • [Git] Github 쓰다가 생기는 골치 아픈 문제들... 해결책 포함.
    • [Git] git tag & 버전 넘버링 규칙: git은 버전관리도구이다!!
    • [Git] Commit 메시지 가이드라인
    DrawingProcess
    DrawingProcess
    과정을 그리자!

    티스토리툴바