Git 전역으로 사용자 이름과 이메일 주소를 설정
git config --global user.name "(본인 이름)"
git config --global user.email "(본인 이메일)"
확인
git config --global user.name
git config --global user.email
git config --global init.defaultBranch main
.git 은 숨김 폴더로 깃 관리내역이다.
이 폴더를 지우면 현재 프로젝트 파일들은 남아있지만 이전에 작업했던 기록들은 전부 지워지게 된다.
# 이렇게 #를 사용해서 주석
# 모든 file.c
file.c
# 최상위 폴더의 file.c
/file.c
# 모든 .c 확장자 파일
*.c
# .c 확장자지만 무시하지 않을 파일
!not_ignore_this.c
# logs란 이름의 파일 또는 폴더와 그 내용들
logs
# logs란 이름의 폴더와 그 내용들
logs/
# logs 폴더 바로 안의 debug.log와 .c 파일들
logs/debug.log
logs/*.c
# logs 폴더 바로 안, 또는 그 안의 다른 폴더(들) 안의 debug.log
logs/**/debug.log
시간을 되돌린다.
과거 내용을 새로 만든다.
기록을 지우지 않고 새로 만들기 때문에 이전 내용들을 전부 기록할 수 있다.
협업시 Reset 을 사용하면 다른 사람들이 만들었던 코드들의 내역을 지우게 되므로 충돌이 일어나게 된다. 그러므로 협업을 할때 과거로 돌아가야 한다면 Revert를 사용하는 것이 좋다.
먼저 Reset을 해볼건데 돌아갈 로그를 확인해야한다.
git log
를 입력하면 커밋 목록들이 역순으로 나온다.(최신 -> 옛날)
위 사진에서 Add team Cheetas
로 Reset
을 해보자.
먼저 빨간 색 밑줄 commit
을 복사한다. (commit 뒷 부분을 전부 복사해도 되고 일부만 복사해도 된다.)
git reset --hard (돌아갈 커밋 해시)
이렇게 일부만 복사해도 된다.
그 후에 다시 로그를 확인해보면 처음 커밋만 남은 것을 알 수 있다. 처음에 커밋한 내역 이후는 전부 삭제가 된 것이다.
여기서 이 로그는 .git
폴더 기준으로 움직이기 때문에
백업해둔 .get
폴더를 다시 붙여넣으면
다시 로그가 살아난 것을 확인할 수 있다.
그런데 여기서 git status
를 한다면
이렇게 뜬다. 이것은 무슨 뜻이냐, 현재 git은 FIRST COMMIT 즉, 제일 처음에 커밋한 상태로 파일들이 남겨진 상황이다. 그런데 백업한 .git
폴더를 가져오니 log
는 현재 추가되고, 수정된 파일들이 남겨져있는 상태라고 생각을 하기 때문에 이 log
이후에 파일을 지운 것 처럼 착각을 하는 것이다.
그럼 현재 .git
에 있는 커밋 정보로 다시 돌아가려면?
git reset --hard
뒤에 커밋 해시가 없으면 마지막 커밋을 가리킴
이렇게 된다. lions.yaml
의 경우 커밋된 파일이 아니기 때문에 건들지도 않는 것이다.
이번에는 이 Add George to Tigers
로 넘어가 보겠다.
git revert (커밋 해시 코드)
그럼 위 화면으로 나오게 되는데, 쉽게 말해서 새로 커밋하는 파일로 넘어온 것이라고 생각하면 된다.
첫 줄은 커밋 메시지다.
vim으로 작성된 파일이기 때문에 :wq
으로 나오면 저장된다.
그 후에 git log
를 해보면 새로 커밋된 메시지를 확인할 수 있다.
여기서 차이를 알 수 있는데 정확히 어떤 행동을 한 것이냐,
현재 Add George to Tigers
는 tigers.yaml
파일에서 George
를 추가하는 커밋이라는 것을 확인할 수 있다.
이를 Revert
한다면, 이 커밋의 내용만 지우게 된다. 즉, tigers.yaml
파일에서 George
를 지우고 수정한 것이다.
이처럼 Revert
를 사용하면 특정 로그의 커밋에 해당하는 내용을 지울 수 있다.
이런 특정 커밋의 내용을 지우는것은 충돌을 일으킬 수 있다.
현재 leopard.yaml
파일을 추가하고 lions.yaml
파일을 지우고 tigers.yaml
을 지우는 커밋의 내역을 지우고 싶다. 이 내역을 Revert
하게 되면,
leopard.yaml
파일을 지우고 lions.yaml
파일을 추가하고 tigers.yaml
에서 수정한 부분을 지우고 수정하게 된다.
그런데 우리는 leopard.yaml
파일을 중간에 수정을 하였다. 그러므로 이 파일을 삭제하려고 할때 내용이 맞지 않아 충돌이 나게 된다.
이렇게 된다. 이것은 무슨 뜻이냐면, 현재 Revert
를 진행중인데 내가 직접 처리를 해야하는 파일이 존재한다는 뜻이다.
그래서 tigers.yaml
파일 수정과 lions.yaml
파일 추가는 성공했으나, leopard.yaml
을 삭제하지 못하고 있는 상태이다.
그럼 leopard.yaml
을 깃에서 삭제해보자
git rm leopard.yaml
이후에
git revert --continue
를 하면
이렇게 커밋 파일이 나온 것을 확인할 수 있다.
그런데
이전 내역을 Revert를 하고 commit하기 전에 내가 좀 더 파일을 수정한 뒤에 commit을 하고 싶다면,
git revert --no-commit (커밋 해시)
그러면 위와 같이 수정이 되었지만, 그 상태로 commit은 안된 상태로 온 것을 확인할 수 있다.