[Git - ③] git commit
[Git - ②] Git 설정 + 프로젝트 시작 + .gitignore [Git - ②] Git 설정 + 프로젝트 시작 + .gitignore [Git - ①] Git? + Window 세팅 (Git Bash, Source Tree) + CLI, GUI ? [Git - ①] Git? + Window 세팅 (Git Bash, Source Tree) + CLI, GUI ?
soohykeee.tistory.com
Git - reset, revert
앞서 git commit을 배워봤다. 이번에는 reset과 revert에 관해 배울것이다.
우선 두 방식 모두 이전 버전으로 돌아가는 방식이다. 하지만 두 방식의 약간의 차이점은 존재한다.
- reset : 원하는 시점으로 돌아간 뒤 이후 내역들을 지운다.
- revert : 되돌리기 원하는 시점의 커밋을 거꾸로 실행한다.
이렇게 2가지를 나눈 이유는 무엇일까? 예를 한번 살펴보자.
1. test 1 register commit
2. test 2 register commit
3. test 1 modified commit
4. test 2 modified commit
5. test 3 register commit
위와 같은 순서로 commit을 진행했다고 가정해봤을 때, 만약 3번에 해당하는 test 1 modified commit을 없애는 방법은 위에서 본것처럼 reset과 revert가 존재한다.
reset을 사용하게 되면 해당 3번을 기준으로 뒤에서 한 모든 내역들을 삭제하게된다. 즉, 3, 4, 5 모두 reset하는 것이다.
revert를 사용하게 되면 6. - revert test 1 modified commit 을 실행하여 이것만 지우는 것이다. 즉, 3번을 기준으로 뒤에서 한 모든 내역들이 남아있게 된다.
간단한 실습을 하며 알아보자.
reset 적용 예제
해당 예제를 적용하기 앞서, 우선 Git이 관리하는 .git 파일을 백업해두자.
Reset 을 통해 우리가 기존의 커밋했던 'Add team Cheetas' 시점으로 돌아가보자.
git log를 통해 보면 Add team Cheetas를 커밋했던 것을 확인할 수 있다. reset이나 revert를 해주기 위해서는 해당 commit의 고유 값을 알아야한다. 노란색 글씨로 된 commit e17eaa03 ~~ 을 복사해놓자.
( * 해당 commit의 값은 모두 복사해서 사용해도 되지만, 앞 6~7 글자정도만 복사해서 사용해도 구분이 가능하기에 사용가능하다.)
그렇게 commit 값을 복사한 후, git reset -- hard (돌아갈 커밋 해시) 를 작성해주면 reset이 될 것이다.
SourceTree를 통해 확인해도 reset 된 것을 확인할 수 있다.
* commit 초기 시점으로 돌아가는 예제도 해보자.
위와 같이 작성후 git log 및 SourceTree를 통해 확인해보면 FIRST COMMIT 시점으로 reset 된 것을 확인할 수 있다.
해당 예제를 진행하기 전, 백업해두었던 .git 파일을 다시 해당 디렉토리에 복사해놓으면 어떻게 될까?
SourceTree를 보게 되면 원래대로 commit 사항들이 있는것을 볼 수 있다. 하지만 git status명령어를 입력하게 되면 commit 내역들은 있지만 해당 내역들을 변화한 사항으로 인식하는 것이다.
이러한 상황을 해결해주기 위해서는 git reset --hard 를 작성해주면 된다.
revert 적용 예제
앞서 reset은 내가 되돌아가고 싶은 시점의 커밋 해시를 찾아서 작성해주었다. 하지만, revert는 되돌릴 커밋 해시를 찾아야한다.
Add George to Tigers 커밋을 되돌려보자.
앞서와 마찬가지로 git log를 통해 해당 커밋의 커밋 해시 값을 복사한후, git revert (되돌릴 커밋 해시) 를 작성해주면 된다.
그렇다면 위와 같은 화면이 나올 것이다. 여기서 :wq 를 입력하여 저장해주면 된다.
이제 해당 git을 보게되면 revert로 하나 추가된 것을 확인할 수 있다.
그럼 이번엔 또 다른 예제를 해보겠다. 이번에는 Replace Lions with Leopareds 를 revert 해보겠다. 해당 commit을 revert 하는 것은 문제가 있다. 그 이유는 왼쪽 하단을 보게되면 해당 commit에서 tigers.yaml 파일 수정, leopards.yaml 파일 생성, lions.yaml 파일 삭제를 해주었다.
해당 commit을 revert 하게 되면 원하는 기댓값으로는 다음과 같다.
tigers.yaml 수정 내역 원복, leopards.yaml 파일 삭제, lions.yaml 파일 생성이다.
하지만 위의 commit을 revert한다면 아래의 Replace Cheetas with Panthers commit에서 충돌이 발생한다. 그 이유는 위의 commit을 revert한다면 leopards.yaml 파일이 삭제가 될텐데, 그 이후 commit 에서 leopards.yaml 파일을 사용해주기 때문이다. 이럴땐 어떻게 해야하는지 실습을 통해 알아보자.
우선 git revert 0b3347d5b15a7a5a040c5c864 를 작성해준 후, 실행하면 아래와 같은 화면이 나온다.
위에서 말한 충돌이 발생했다는 것이다. hint 메시지를 확인해보면 git add/rm <pathspec>을 통해 leopards.yaml 파일을 삭제할 것인지, 내버려둘 것인지 작성해준 후, revert --continue 하라고 쓰여져있다.
우리는 충돌이 발생하는 leopards.yaml 파일을 삭제해줄 것이기에, git rm leopards.yaml 을 작성해준 후,
git revert --continue 해줄 것이다.
이러한 revert한 commit을 또 revert 할 수 있다. 하지만 그러한 기록은 보기 좋지 않고, 지저분하기에 revert한 commit 내용을 다시 지울 필요가 있을 때는 reset을 사용해주는 것이 좋은편이다.
위에서 작성해준 revert를 모두 reset을 해주자.
커밋하지 않고 revert 해주는 방법은 없을까?
git revert --no-commit (되돌릴 커밋 해시) 이와 같이 작성해주면 revert 내용이 바로 commit 되지 않는다.
SourceTree로 사용
1. commit
leopards.yaml 삭제
.gitignore에 *.config 추가
hello.txt 추가
커밋메시지 : commit with SourceTree
위의 변경사항들을 추가해준 후, SourceTree를 사용하여 commit 해줄 것이다.
위의 변경사항들을 적용해주면 SourceTree에서 아래에 변경사항들이 있는 것을 확인할 수 있다. 여기서 스테이지에 올리는 행동이 앞서 git add 해주는 행동이다.
우린 위 변경사항 모두 commit 해줄 것이기에 모두 추가해준 후, 왼쪽 상단의 커밋 버튼을 누른 후, 아래와 같은 화면에서 commit 메시지를 적어준 후, 오른쪽 하단의 커밋 버튼을 눌러 커밋해줄 것이다.
그렇게 되면 아래처럼 commit이 된것을 확인할 수 있다.
2. revert
이번엔 revert를 실습해볼 것이다. Add George to Tigers의 커밋을 revert 해볼것이다.
해당 커밋에서 오른쪽 클릭 후, 커밋 되돌리기를 선택해준다. 그 후, 예 버튼을 눌러주면 성공적으로 revert가 된다.
3. reset
reset 할 커밋에 마우스 오른쪽 클릭 후, 이 커밋까지 현재 브랜치를 초기화 버튼 클릭 후, Hard로 선택한 다음 확인 버튼을 눌러주면 reset이 된다.