혼자 적어보는 노트

[Git] commit, reset 되돌리기 - reset / revert / conflict / reflog 본문

기타

[Git] commit, reset 되돌리기 - reset / revert / conflict / reflog

jinist 2022. 2. 3. 10:50


 

커밋 되돌리기 / reset revert

 

reset

지정한 커밋 이후의 커밋 내역 삭제

* 협업 시 reset 사용을 해야 할 경우 상의 후 진행하거나 revert를 사용

 

reset에는 세 가지 옵션이 있다.

 

--soft : 단순 커밋 내역만 삭제하고 현재 나의 파일 상태, add된 상태는 그대로 하고 싶을 때

--mixed : 커밋 내역과 add상태를 제거하고 현재 나의 파일 상태는 그대로하고 싶을 때 (Default)

--hard : 커밋 내역도 삭제하고 현재 나의 파일 상태도 지정한 커밋의 상태로 전부 돌아가고 싶을 때

 

옵션을 넣지 않으면 기본으로 mixed로 실행된다.

 

reset --hard

git reset --hard 커밋이름

// 커밋 이름은 전체를 입력해도 되고 앞자리 일부만 넣어도 된다.
git reset --hard 001706ae9fddff0408b69f4964527edba55a070a
git reset --hard 001706a

001706a의 커밋 이후의 모든 변경사항들이 reset되고
001706a의 파일 상태로 돌아간다.

 

git reset --hard

커밋이름을 생략하면 현재 위치의 커밋의 코드로 되돌아간다.

 

reset --soft

git reset --soft 커밋이름

001706a의 커밋 이후의 모든 변경사항들이 reset되고 파일상태는 그대로이다.
* 커밋을 잘못 했을 때 내역만 삭제할 때 사용하는 편

 

현재 commit의 바로 직전 커밋 삭제

git reset --soft HEAD~1

HEAD~뒤의 숫자로 현재 커밋 기준으로 몇개를 삭제할 지 지정할 수 있다.

 

첫 번째 commit 취소

git update-ref -d HEAD
git rm --cached -r .

 


revert

특정 커밋에 있는 수정 내용을 제외한 새로운 커밋 생성

 

$ git log --oneline -n 3
3945512 (HEAD -> main) Add gender
922fd26 Add age
daebe19 Add name

위처럼 name, age, gender 파일을 추가하고 각각 commit을 한 상태일 때

age를 삭제하고 싶다면

git revert 커밋이름

// 예시
git revert 922fd26

위의 명령어를 입력하고 에디터 창에서 커밋 메세지를 수정하고

에디터 창을 닫으면 새로운 커밋이 하나 생성되고 age파일이 삭제된다.

 

코드의 양이 많을 경우 유용하게 사용할 수 있다.

 

commit 없이 revert 하기

git revert --no-commit 커밋이름

 revert한 상태가 현재 상태로 변경되며 추가 작업 후 따로 커밋 할 수 있다.

 

❗ 충돌 해결

$ git log --oneline -n 3
8aa98e7 (HEAD -> main) Modify age
589b9e9 Add age
daebe19 Add name

위처럼 name을 추가하고 age를 추가한 후 age파일을 변경 한 후에

age가 생성된 589b9e9에 revert를 하게되면 에러가 발생한다.

CONFLICT (modify/delete): age.txt deleted in parent of 589b9e9 (Add age) and modified in HEAD. Version HEAD of age.txt left in tree.
error: could not revert 589b9e9... Add age
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'

589b9e9에서 생성된 age가 HEAD에 남아있기 때문에

충돌을 해결하려면 충돌이 나던 age 파일을 삭제해주면 된다.

git rm 파일경로 및 파일명

위의 명령어로 HEAD(현재위치)에서 파일을 삭제해주고

git revert --continue

revert을 다시 진행해주면 age파일이 삭제된 상태로 새로운 revert 커밋이 생성된다.

 

 


 

reflog를 이용하여 reset되돌리기

 

reflog

실수로 reset을 사용하여 커밋들이 삭제되었을 때

아래의 명령어를 입력하면 git으로 실행한 log들을 전부 확인해 볼 수 있다.

git reflog

 

λ git reflog
c32a1be (HEAD -> main) HEAD@{0}: reset: moving to c32a1be
2fbf95d HEAD@{1}: rebase (continue) (finish): returning to refs/heads/main
2fbf95d HEAD@{2}: commit: 회원가입 기능 추가
6fa1e39 HEAD@{3}: commit: 로그인 에러 수정
d43df8f HEAD@{4}: reset: moving to HEAD~
edb8915 HEAD@{5}: rebase: fast-forward

reset뿐만 아니라 rebase, commit등 실행한 내역들을 볼 수 있는데

해당 로그의 맨 앞의 코드를 이용하여 reset을 진행하면 해당 시점으로 돌아갈 수 있다.

 

git reset --hard [돌아갈 시점의 해시]

//예시
git reset --hard c32a1be

 

Comments