Study Programming/Git

Android Studio with Git : 커밋 되돌리기 방법 3가지

네모메모 2021. 8. 4. 15:44
반응형

 

 

 

 

 

 

 


그림을 그려서 넣고 싶은데 계속 손으로 만든 발그림이 나온다...ㅠㅠ


Android Studio가 지원하는 커밋 되돌리기 방법 3가지

1) 'Undo Commit...' 
2) 'Revert Commit'
3) 'Reset Current Branch to Here'

 

 


 

<들어가기에 앞서 봐야할 사항>

※ Undo, Rever, Reset 모두 로컬 커밋만 복원되므로 로컬 복원사항을 'Push하지 않는 이상' 원격 브랜치와 히스토리에는 변화없다.

 

이미 원격에 Push한 커밋사항은 항상 Revert로 되돌려야 한다.

( ∵ Reset 적용 상태에선 push가 안되며 강제옵션있으나 위험함!!

다른 사람 작업환경이 꼬일 수도 있다 ㄷㄷ)




[↓ 하기 ⓑ' 적용 방법 공통 부분] : 모두 스튜디오 하단 툴에서 'Git' 선택 > 'Git'툴 상단에서 'Log: all' 선택 >

 



1) 'Undo Commit...' : 로컬 현 브랜치에서의 마지막 커밋사항을 되돌림

 

 ⓐ 되돌릴 수 있는 범위 : '로컬 마지막 커밋사항(1개)'만 복원 

 ⓑ 적용 방법 : > 복원할 로컬 브랜치 마지막 커밋사항 선택 > 우측 마우스 선택 > 'Undo Commit...' 선택

 ⓒ 복구 대상 : 로컬 현 브랜치에서의 마지막 커밋사항

                    (로컬 마지막 커밋사항이 원격 커밋과 같다면 원격커밋에서도 우측 마우스 선택하여 적용가능)


 ⓓ [적용 후 변화]
   - 로컬 브랜치 : (마지막 커밋사항이 로컬 히스토리에서 제거되어) 이전 커밋사항 가리킴
   - 로컬 히스토리 : 마지막 커밋사항이 로컬 히스토리에서 제거
   - Working direcotory : 커밋수정사항은 커밋 전 'Staged 상태'로 로컬 WorkTree에 존재 ('Local Changes'에 Changelist로 생성됨)


 ⓔ 연관 Git 명령어 : 없음

 

 


 


2) 'Revert Commit'

    : 선택한 커밋사항이 적용되기 전 상태를 만들고 이 상태를 로컬에 커밋까지함으로써 복원함


ⓐ 되돌릴 수 있는 범위 :

   ㄴ> '로컬 커밋사항(1개)' 복원 가능

         +) ★ Revert는 커밋을 1개씩만 복원하지만 만약 복원해야할 커밋이 많다면,
                  HEAD를 기준으로 몇 개의 커밋을 취소할지를 지정하거나 커밋의 범위를 지정하고

                      ex) $ git revert HEAD~3, $ git revert -n master~5..master~2
                  Revert 수 만큼 커밋이 생기는 것이 싫다면 [–no-commit 옵션]을 사용한다.

 

   ㄴ> '원격 커밋사항'은 Revert실행으로 추가된 '로컬 복원 커밋사항'을 Push하는 경우 가능

         +) ★ 로컬 브랜치의 '선택 커밋사항의 복원 커밋사항'을 push하면 원격까지 반영된다.

 

 

ⓑ 적용 방법 : > 복원할 커밋사항 선택 > 우측 마우스 선택 > 'Revert Commit'
ⓒ 복구 대상 : 선택한 커밋사항

ⓓ [적용 후 변화]
   - 로컬 브랜치 : 추가된 '선택 커밋사항의 복원 커밋사항'을 가리킴
   - 로컬 히스토리 : '선택 커밋사항' 후로 '선택 커밋사항의 복원 커밋사항'이 추가됨
   - Working direcotory : 변경없음

 

ⓔ 연관 Git 명령어 : $ git revert <복원할 커밋사항 >

 




3) 'Reset Current Branch to Here'

    : '선택한 커밋사항' 적용 시점의 상태(스냅샷)로 되돌림 (=선택 커밋 후 모든 커밋사항들을 되돌림)


ⓐ 되돌릴 수 있는 범위 : '로컬 커밋사항(복수)'은 항상 가능 / '원격 커밋사항'은 -f 옵션 사용 시 가능하나 ※ 위험하니 하지말것!!
ⓑ 적용 방법 : > 복원될 상태를 가진(=복원할 커밋의 이전) 커밋사항 선택 > 우측 마우스 선택

                         > 'Reset Current Branch to Here' > 'Git Reset' 팝업▼에서 [Reset 옵션 (4가지)] 선택 후 적용


[Reset 옵션 (4가지)]

1. Soft    : 복원될 커밋들의 수정사항은 'Staged 상태'로 Working direcotory에 유지

               ('Local Changes'탭에 Changelist로 생성됨)
2. Mixed : 복원될 커밋들의 수정사항은 'UnStaged 상태'로 Working direcotory에 유지

               ('Local Changes'탭에 Changelist로 생성됨)
3. Hard   : 복원될 커밋들의 수정사항도 Working direcotory에서 제거 & Working direcotory 변경 사항 모두 제거

               (※로컬 소스코드 수정사항 손실되니 주의)
4. Keep   : 복원될 커밋들의 수정사항도 Working direcotory에서 제거 & Working direcotory 변경 사항이 있는 경우

               사용자에게 처리 여부 물어봄

 


ⓒ 복구 대상 : 선택한 커밋사항 이후의 모든 커밋사항들

 

ⓓ [적용 후 변화]
   - 로컬 브랜치 : 로컬의 현 브랜치가 '선택한 커밋사항'을 가리키도록 수정됨
   - 로컬 히스토리 : '선택한 커밋사항' 이후의 모든 커밋사항들이 제거됨
   - Working direcotory : [Reset 옵션 (4가지)]별로 모두 다름

 

ⓔ 연관 Git 명령어 : $ git reset <옵션> <복원될 상태를 가진(=복원할 커밋의 이전) 커밋사항>

 

+) Reset 취소 Git 명령어 : $ git reflog명령으로 HEAD 변경 이력 조회 후

                                    $ git reset명령어로 HEAD접근 해 reset을 취소 가능 (※ Reset hard모드했을 경우 복구 불가능)




 


END!

 

 

 

 

 


스터디 도움 참조 블로그 (References)

- What is the difference between “Revert Commit” and “Undo Commit” in IntelliJ IDEA?
https://stackoverflow.com/a/59267614

- git reset vs revert
https://www.devpools.kr/2017/02/05/%EC%B4%88%EB%B3%B4%EC%9A%A9-git-%EB%90%98%EB%8F%8C%EB%A6%AC%EA%B8%B0-reset-revert/

- git reset
https://brownbears.tistory.com/477

- git Push 되돌리기
https://jupiny.com/2019/03/19/revert-commits-in-remote-repository/

- git reset vs revert
https://donghoon-khan.github.io/devops/2020/08/18/git-rollback/
https://youngest-programming.tistory.com/220

- git reset : add 취소 / commit 취소하기
https://codevang.tistory.com/227

 

 

반응형