Git 관련 내용들

slee2·2022년 2월 7일
0

Git 관련

목록 보기
1/1

Git 최초 설정

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

.git 은 숨김 폴더로 깃 관리내역이다.
이 폴더를 지우면 현재 프로젝트 파일들은 남아있지만 이전에 작업했던 기록들은 전부 지워지게 된다.

.gitignore 형식

# 이렇게 #를 사용해서 주석

# 모든 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 vs Revert

Reset

시간을 되돌린다.

Revert

과거 내용을 새로 만든다.

기록을 지우지 않고 새로 만들기 때문에 이전 내용들을 전부 기록할 수 있다.

협업시 Reset 을 사용하면 다른 사람들이 만들었던 코드들의 내역을 지우게 되므로 충돌이 일어나게 된다. 그러므로 협업을 할때 과거로 돌아가야 한다면 Revert를 사용하는 것이 좋다.

git으로 각각 해보기

Reset

먼저 Reset을 해볼건데 돌아갈 로그를 확인해야한다.
git log 를 입력하면 커밋 목록들이 역순으로 나온다.(최신 -> 옛날)
위 사진에서 Add team CheetasReset을 해보자.

먼저 빨간 색 밑줄 commit을 복사한다. (commit 뒷 부분을 전부 복사해도 되고 일부만 복사해도 된다.)

git reset --hard (돌아갈 커밋 해시)

이렇게 일부만 복사해도 된다.

그 후에 다시 로그를 확인해보면 처음 커밋만 남은 것을 알 수 있다. 처음에 커밋한 내역 이후는 전부 삭제가 된 것이다.

여기서 이 로그는 .git 폴더 기준으로 움직이기 때문에
백업해둔 .get폴더를 다시 붙여넣으면

다시 로그가 살아난 것을 확인할 수 있다.

그런데 여기서 git status를 한다면

이렇게 뜬다. 이것은 무슨 뜻이냐, 현재 git은 FIRST COMMIT 즉, 제일 처음에 커밋한 상태로 파일들이 남겨진 상황이다. 그런데 백업한 .git 폴더를 가져오니 log는 현재 추가되고, 수정된 파일들이 남겨져있는 상태라고 생각을 하기 때문에 이 log 이후에 파일을 지운 것 처럼 착각을 하는 것이다.

그럼 현재 .git에 있는 커밋 정보로 다시 돌아가려면?

git reset --hard

뒤에 커밋 해시가 없으면 마지막 커밋을 가리킴

이렇게 된다. lions.yaml의 경우 커밋된 파일이 아니기 때문에 건들지도 않는 것이다.

Revert

이번에는 이 Add George to Tigers 로 넘어가 보겠다.

git revert (커밋 해시 코드)

그럼 위 화면으로 나오게 되는데, 쉽게 말해서 새로 커밋하는 파일로 넘어온 것이라고 생각하면 된다.

첫 줄은 커밋 메시지다.

vim으로 작성된 파일이기 때문에 :wq으로 나오면 저장된다.

그 후에 git log를 해보면 새로 커밋된 메시지를 확인할 수 있다.

여기서 차이를 알 수 있는데 정확히 어떤 행동을 한 것이냐,

현재 Add George to Tigerstigers.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은 안된 상태로 온 것을 확인할 수 있다.

0개의 댓글