Git | Git 변경 취소 | git reset


git reset 명령

git revert 명령이 변경 취소 “안전한"방법이라고한다면 git reset 명령은 “위험한"방법이라고 할 수 있습니다. git reset 명령을 사용하여 취소하면 (그리고 ref 나 reflog 의한 참조가 불가능하게 된 경우), 원래 상태로 복원하는 방법은 없습니다. 이 “취소"조작을 취소 할 수없는 것입니다. 이 명령은 Git에서 작업 결과를 잃을 수있는 몇 안되는 명령의 하나이며,이 명령을 사용하는 경우는주의가 필요합니다.

git checkout 명령뿐만 아니라 git reset 도 여러 설정이있는 응용 범위가 넓은 명령입니다. 커밋 된 스냅 샷을 삭제하는 목적으로도 사용되지만, staging 영역과 작업 디렉토리의 변경을 취소하려면 더 사용됩니다. 어쨌든이 명령의 사용은 로컬 변경을 취소 경우에 한한다해야하며, 다른 개발자에 공개 된 커밋의 취소는 결코 가서는 안됩니다.

사용법

git reset <file>

작업 디렉토리에 어떤 변경도 가하지 않고 지정된 파일을 스테이징 영역에서 제거하는 명령입니다. 이 명령을 실행하면 변경 내용을 기록하지 않고 지정된 파일을 제거 스테이지합니다.

git reset

작업 디렉토리에 어떤 변경도 가하지 않고 스테이지 영역을 재설정 직전의 위탁시의 상태와 일치시키는 명령입니다. 이 명령을 실행하면 변경 내용을 기록하지 않고 모든 파일을 제거 무대 한 번 무대 된 스냅 샷을 처음부터 다시 구축 할 수 있습니다.

git reset --hard

스테이지 영역과 작업 디렉토리를 재설정 직전의 위탁시의 상태와 일치시키는 명령입니다. –hard 변경을 제거 스테이지 한 후 추가 작업 디렉토리의 모든 변경 사항을 취소 할을 Git에 지시하는 플래그입니다. 즉, 이것은 커밋 전에 모든 변경을 전혀 없었던 것으로하는 명령이며, 이것을 사용하면 로컬 머신에서 수행 된 개발 작업을 정말 삭제하고 좋은 것인지 아닌지를 확인해야 있습니다.

git reset <commit>

현재 브랜치의 끝을 <commit> 위치로 이동 한 다음 준비 영역을 그 상태와 일치하도록 되돌립니다 만, 작업 디렉토리 만은 그대로 둡니다. <commit> 를 실행 한 후 변경 사항은 작업 디렉토리에 저장되어 더 변경 규모가 작고 정리 된 스냅 샷을 생성하여 로컬 저장소에 다시 커밋을 할 수 있습니다.

git reset --hard <commit>

현재 브랜치의 끝을 <commit> 위치로 이동 한 다음 준비 영역 및 작업 디렉토리를 그 상태와 일치하도록 되돌립니다. 이 명령을 실행하면 커밋 전에 변경 이외에 <commit> 이후에 행해진 모든 커밋도 전혀 없었던 것으로됩니다.

option

  • –soft : index 보존, 작업 트리 보존. 즉 모두 보존.
  • –mixed : index 취소, 작업 트리만 보존 (기본 옵션)
  • –hard : index 취소, 작업 트리 취소. 즉 모두 취소.

보충 설명

위에서 설명한 모든 명령은 저장소에 변경 사항을 제거하는 것입니다. –hard 플래그가 없으면 git reset 변경 제거 스테이지 나 일련의 스냅 샷 커밋 취소를 수행하여 리포지토리를 정리 한 후 그 재 구축하는 수단입니다. –hard 는 개발 중에 한 실험적인 작업의 결과가 바람직하지 않고, 그것을 전혀 없었던 것으로하는 경우에 유용한 명령입니다.

“취소"가 공개 된 커밋을 안전하게 실행 취소 기능을 갖는 반면 git reset 은 로컬 변경을 실행 취소 기능을 가지고 있습니다. 이 두 명령은 목적이 다르기 때문에 그 동작도 달리 “취소"가 변경 기록을 삭제하는 반면, " 취소 “변경 기록을 유지 한 후 복원하는 새로운 커밋합니다.

Git 튜토리얼 : 취소 및 취소

게시 된 내용의 취소는 엄금

<commit>를 실행 한 후 한 번이라도 스냅 샷을 공개 저장소에 푸쉬 한 경우는 git reset <commit> 명령을 사용하여이되지 않습니다. 커밋을 공개하면 다른 개발자가 그것을 전제로 작업을하고 있다고 생각해야합니다.

다른 개발자가 개발 중에 한 커밋을 취소하면 협업에 심각한 문제가 발생할 수 있습니다. 그들이 당신의 저장소와 동기화하려고하면 프로젝트 이력이있는 범위가 누락 된 것 같습니다. 공개 된 커밋을 취소하면 어떻게 될지를 아래의 일련의 그림입니다. 여기에서 origin / master 브랜치는 로컬 master 브랜치에 대응하는 중앙 저장소의 브랜치입니다.

Git 튜토리얼 : 공개 된 커밋 취소

취소 후 신규 커밋하면 Git은 로컬 히스토리가 origin / master 에서 분기 한 것으로 취급 로컬 저장소를 동기화하기 위해 작성되는 병합 커밋이 다른 개발자에 대한 혼란과 작업 방해를 일으 킵니다.

중요한 것은 git reset <commit> 명령을 실행할 때 결과가 신통치 않았다 로컬 실험적인 개발 작업을 취소 할 목적이며, 공개 된 변경 취소를하려한다 을 인식하는 것입니다. 공개 된 커밋을 정정 할 필요가있는 경우는 그 목적의 전용 명령 git revert 가 준비되어 있습니다.

사용 예

파일 제거 단계

git reset 명령은 스테이지 된 스냅 샷을 만들 때 자주 사용됩니다. 다음 예제에서는 hello.py 과 main.py 의 2 개의 파일을 저장소에 이미 추가되어있는 것으로 가정하고 있습니다.

# Edit both hello.py and main.py

# Stage everything in the current directory
git add .

# Realize that the changes in hello.py and main.py
# should be committed in different snapshots

# Unstage main.py
git reset main.py

# Commit only hello.py
git commit -m "Make some changes to hello.py"

# Commit main.py in a separate snapshot
git add main.py
git commit -m "Edit main.py"

볼 수 있듯이, git reset 을 사용하여 다음 커밋과 관련되지 않은 변경을 제거 스테이지, 그 커밋의 목적을 명확히 할 수 있습니다.

로컬 커밋 삭제

다음의 예는 고급 유스 케이스를 보여줍니다. 여기에서는 실험적인 개발을 잠시하고 있다고 가정하고 여러 스냅 샷을 커밋 한 후 그들을 모두 삭제하려면 어떻게해야 하는가를 보여줍니다.

# Create a new file called `foo.py` and add some code to it

# Commit it to the project history
git add foo.py
git commit -m "Start developing a crazy feature"

# Edit `foo.py` again and change some other tracked files, too

# Commit another snapshot
git commit -a -m "Continue my crazy feature"

# Decide to scrap the feature and remove the associated commits
git reset --hard HEAD~2

git reset HEAD ~ 2 는 현재 브랜치를 커밋 2 회분 만 전에 취소 명령이며, 실질적으로는 최근 작성한 두 스냅 샷을 프로젝트 기록에서 삭제하는 기능을합니다. 앞서 언급 한 바와 같이 이러한 reset 명령의 사용 대상은 미공개 커밋 제한한다. 커밋을 공개 저장소에 푸시하는 경우에는 결코 위의 작업을 수행 할 수 없습니다.

다양한 사용 예

index 추가 취소

해당 파일을 index에 추가한 것을 취소한다. (unstage)
작업 트리의 변경내용은 보존된다.

git reset [파일명] 
git reset HEAD [파일명]

commit 취소

최종 커밋을 취소하고, 작업 트리는 보존된다. commit은 했으나 push하지 않은 경우 유용하다.

git reset HEAD^

마지막 2개의 커밋을 취소하고, 작업 트리는 보존된다.

git reset HEAD~2

마지막 2개의 커밋을 취소하고, index 및 작업 트리 모두 원복된다.

git reset --hard HEAD~2

머지한 것을 이미 커밋했을 때, 그 commit을 취소한다. 잘못된 merge를 이미 커밋한 경우 유용하다.

git reset --hard ORIG_HEAD

HEAD에서 변경한 내역을 취소하는 새로운 commit 발행한다. (undo commit)
commit을 이미 push 해버린 경우 유용하다.

git revert HEAD

워킹트리 전체 원복

워킹트리 전체를 마지막 커밋 상태로 되돌린다.
마지막 commit 이후의 작업 트리와 index의 수정사항 모두 사라진다.
변경을 커밋하지 않았다면 유용하다.

git reset --hard HEAD