Git 깃 변경사항 취소하기

git checkout 으로 이전 커밋 확인하기

git checkout -b 커맨드로 새로운 브랜치를 만들고 이동하는데 사용했지만, 그것뿐만 아니라 특정 커밋 해시를 체크아웃하기 위해 사용가능하다.

git log로 확인해본 깃 커밋 이력인데 나는 Nishi가 마지막 캐릭터였던 때로 이동하고 싶다.

git log --oneline

git log --oneline 커맨드를 사용해서 확인해본 이력이다. 제일 앞에 해쉬값이 축약되서 나온다. 

그리고 7자리의 헤드값을 복사한다.

git checkout <복사한 해쉬값>

나는 outline.txt에서 June이 제일 마지막으로 적혀져있는 Add new character June으로 갈 것이다. 그 앞의 해쉬값을 복사해서 git checkout 뒤에 붙여넣으면 된다. 

detached HEAD상태로 표시가 된다. 그리고 그 커밋의 상태로 돌아갔다. 

또한 git log로 확인한 커밋 이력에도 이 커밋을 기점으로 그 전 것들만 표시만 된다.

한번 더 git checkout b806d79 을 사용해서 Jordan이 마지막이었던 'Change to capital J' 커밋으로 가려고한다.

 

이렇게 잘 반영이 되어 있는 것을 볼 수 있다!


분리된 HEAD 재연결하기

 

지금 git log를 하면 HEAD가 'Change to capital J'에 와있는것을 알 수 있다. 

그리고 비주얼 스튜디오 기능으로 알 수 있는 지금 있는 브랜치 표시에서도 옮겨다닌 커밋 해쉬 값으로 기록되어있는걸 알 수 있다. 

git switch master

git switch master 커맨드로 master 브랜치로 돌아오면 outline.txt의 내용이 처음과 같은 상태로 돌아오는것을 알 수 있다.

git log 로 확인해봐도 master브랜치의 마지막 커밋으로 HEAD가 돌아와있다!


이전 커밋에서 새로운 브랜치 만들기

다시 git checkout b806d79 을 사용해서 Jordan이 마지막이었던 'Change to capital J' 커밋으로 왔다.

git switch -c time-travel을 사용해서, 과거의 커밋 b806d79 으로부터 time-travel 이라는 새로운 브랜치를 만들었다.

그리고 디렉토리 안에 파일을 조금 수정했다. chapter1.txt 파일은 삭제하고, songs.txt라는 파일을 만들어서 the story of us라는 문자를 넣고 저장하였다. 그리고 git status로 변화를 확인했다.

그리고 추가된 파일을 스테이지에 등록하고 'add new song'이라는 메세지로 커밋했다.

그런 다음 git switch master 명령으로 master 브랜치에 오면

삭제했던 chapter1.txt가 생기고, time-travel 브랜치에서 만들었던 songs.txt 파일이 사라진걸 확인할 수 있다.

git branch로 확인해본 현재 브랜치의 상태는 이렇다.


git checkout HEAD~1

귀찮게 해쉬 커밋을 찾아보지 않고 이전 커밋을 참조하는 명령어이다.

HEAD~1은 헤드에서 한개 이전 커밋을 참조하고, HEAD~2는 2개 이전 커밋을 참조한다.

다시, git log로 확인한 커밋 이력이다.

한 커밋 전은 chapter1.txt 파일에서 bunny가 마지막이던 커밋이다. 원래대로라면 7자리의 커밋 캐쉬를 복사해서 git checkout 뒤에 붙여줘야한다.

git checkout HEAD~1

하지만 git checkout HEAD~1 명령을 사용하면, 분리된 헤드 설명이 주르륵 나오면서 간편하게 그 헤드로 갈 수 있다.

원래있던 master 브랜치로 돌아가려면, git switch master 명령을 하면 돌아갈 수 있다.


git switch - 

원래있던 브랜치로 편리하게 돌아갈 수 있는 커맨드 

git switch -

하지만 git switch - 명령으로도 원래 있던 브랜치로 돌아갈 수 있다.


git restore <파일이름>

git restore 파일 이름을 쓰면, 파일을 원래 모습으로 복원한다. 헤드에서 보여지는 모습으로



chapter1.txt 파일의 6번째줄에 임의의 문자를 넣고 복원해보려고 하는데 물론 컨트롤+z하면 되지만... 나는 git restore 써보려고한다. 스테이지에 추가하거나 커밋은 하지 않았다.

git restore chapter1.txt

git restore chapter1.txt  명령을 입력하니 그 헤드 상태로 돌아왔다.헤드는 마지막 커밋에 있다. 


git restore --source HEAD~1 <파일 이름>

이 명령어로 특정 헤드 시점에서의 특정 파일의 내용을 복원 할 수도 있다.


git store --staged <파일 이름>

원하지 않는 파일을 스테이징했을때 다시 내리는 옵션

chapter1.txt 파일에 6번째 줄에 jean 텍스트를 넣고, newfile.txt를 만들었다.

그리고 git status로 확인해보면, 위에 기술한대로 반영된것을 볼 수 있다.

이때 내가 newfile.txt를 포함하고 싶지 않았는데 실수로 스테이징 한 상황을 가정해보자.

git restore chapter1.txt

git restore --staged newfile.txt 명령어를 입력하고, git status 로 확인하면 newfile.txt가 언스테이징이 된 것을 볼 수 있다.

그대로 커밋을 하고 git status로 확인을 다시 해봐도 커밋에서는 빠지게 된 것을 볼 수 있다.


git reset <커밋 해쉬>

일반 재설정

잘못된 브랜치에서 커밋 했을 때 유용할 수 있는 명령어이다. 작업은 유지하면서 다른 브랜치로 이동시키고 싶은것. (변경사항은 그대로 남고, 커밋 기록만 사라짐)

실수로 커밋을 두번 한 상황을 가정할 것이다.

chapter1.txt 파일과, outline.txt 파일에 각 각 first mistake라는 내용을 추가한 뒤 저장하고, 스테이지에 올린다. 그리고 'first mistake commit' 메세지와 함께 커밋을 한다.

그리고 다시 chapter1.txt 파일과, outline.txt 파일에 각 각 second mistake라는 내용을 추가한 뒤 저장하고, 스테이지에 올린다. 그리고 'second mistake commit' 메세지와 함께 커밋을 한다.

git log --oneline

가고자 하는 커밋의 해쉬를 복사한다. 나는 Add new character bunny 커밋으로 가려고 한다. 

git reset ffd6304

명령을 실행하면 변경사항이 없어져야 할 것 같지만 그렇게 되지 않는다....?

git log --oneline

git log --oneline 으로 확인해보면, 커밋들만 제거된 것을 알 수 있다.


git reset --hard <커밋 해시>

커밋을 잃고, 깃은 이 커밋 해시까지의 커밋을 취소한다. 그리고 변경사항들이 워킹 디렉토리에서 제거된다.

작업을 제거하고 관련 커밋을 제거하려면 --hard 옵션을 사용하면 된다. 

다시 처음처럼 chapter1.txt 파일과 outline.txt 파일에 first mistake와 second mistake를 순서대로 넣고 각각 커밋하여 두번의 커밋 기록을 만들었다.

ffd6304 Add new character bunny 커밋으로 돌아갈거다. 그러면 위에있는 커밋들과 관련 변경사항도 사라지게 된다.

git reset --hard <커밋 해시>

git reset --hard ffd6304 를 하면 파일 내용에서 first mistake 와 second mistake가 사라진것을 볼 수 있다. 그리고 관련 커밋 기록도 사라진것을 볼 수 있다.


git revert <커밋 해시>

변경 사항을 실행 취소하는 새로운 커밋을 만드는 것이다.

chapter1.txt 파일에 mistake 입력하고, mistake commit 이라는 메세지로 커밋을 한다.

mistake commit 의 커밋 기록은 남겨두고 싶은데 변경 사항은 취소하고 싶다.

git revert <커밋 해시>

git revert <커밋 해시>로도 가능하지만, git revert HEAD~1 구문도 동일하게 작동한다. 일단은 커밋해시로 시도해본다.

git revert 143798e 커밋 해시를 입력 하면 편집기가 열린다. 병합할 때 처럼 새로운 커밋을 만들기 때문이다.  따로 수정을 하지않고 닫아서 저장을 했다.

git log --oneline

Mistake commit은 지금도 존재하고, 새로운 Revert 커밋이 마스터 브랜치의 끝에 있다. 그리고 새로운 커밋은 이전의 것을 되돌린다.

편집기에서 chapte1.txt 파일의 내용을 보면, 5번째 줄에 mistake가 있었는데 사라져있는 것을 볼 수 있다.

JUNE .

20'S LIFE IN SYDNEY and BUSAN

    이미지 맵

    DevOps Study/Git and Github 다른 글

    이전 글

    다음 글