2. Git 시작하기

정현우·2021년 9월 2일
2

Git Basic to Advanced

목록 보기
2/9

Git 시작하기

Git 파일 상태

1. git 설정된 디렉토리 파일 상태 라이프 사이클

  • (1) 장에서 git init으로 설정된 해당 디렉토리에서 새로운 파일 작업을 완료했다. 이 파일을 git이 인식하고, 저장소 (로컬과 원격)에 반영을 하려면 어떻게 해야 할까?
  • (1) 장에서 깃의 영역 3가지를 보면, working / staging / repository가 있다.
    • working => git add => staging
    • staging => git commit => repository (save)
  • 그 파일의 라이프 사이클은 아래와 같아지는 것이다.
  • git add 를 통해 아래와 같은 그림이 된다.
  • git status를 통해 해당 파일이 '어디 영역'에 있는지 확인할 수 있다.
  • 아래 사진은 untracked 상태이며, 아직 working area에 있는 것이다.
  • git add를 통해 staging area로 옮겼다.

2. git add 된 파일 commit 하기

  • 위 시나리오를 이어가자.
  • git commit을 통해 저장하고, (기억 지점만들기, 체크섬 생각) 다시 status는 어떤 파일도 modified 되어 있지 않는 것을 볼 수 있다.
  • -m 옵션을 통해 저장 내용 설명을 추가할 수 있다.
  • git commit --amend를 통해 지금 커밋한 메시지 내용을 변경할 수 있다.
  • git log를 통해 commit (기억 지점, 저장 저점) 들을 확인할 수 있다.

  • commit을 통해 'snapshot'이 만들어 진다.
  • staging 되어진 데이터들(index)을 commit으로 영구히 저장한 것을 snapshot이라고 부른다. (아래에 나올) Head역시 snapshot이며 포인터 역할을 하는 것이다.

3. git 파일 관리 상태 확인

  • commit 을 한 번 하고, 파일을 또 변경하고 또 add, commit을 하고 log를 살펴보자.
  • 이전 커밋 지점 - 방금 커밋 지점이 논리적으로 아래와 같이 이어진 것을 알 수 있다.

git log의 옵션

  • git log -p -2
    • -p (--patch): 각 commit의 수정 결과를 보여주는 diff와 같은 역할을 수행한다.
    • 즉 각 '스냅샷'이 어떤 부분이 다른지 (+), 어떤 부분이 빠졌는지 (-) 알 수 있다.
    • 해당 옵션으로 log를 수행하면 보기 모드로 스페이스바 등과 같이 화면을 넘어갈 수 있다.
    • 뒤에 숫자는 현재로 부터 상위 n 개의 커밋의 diff를 보여주는 것이다.
  • git log --stat
    • 어떤 파일이 commit 에서 수정되고 변경되었는지, 파일 내 라인이 추가되거나 삭제되었는지 확인 해준다.
  • git log --pretty=oneline
    • 각 commit 내용 (메시지)를 한 줄로 이쁘게 출력해준다.
  • git log --graph
    • commit간 연결된 관계를 '아스키 그래프' 로 출력한다. 나중에 알게될 git 분산 버전 관리의 정점인 'branch'를 알게된다면 더욱 와닿고, 예시는 아래와 같다.
  • git log -S function_name
    • -S: 코드에서 추가되거나 제거된 내용 중 다음 써주는 "특정 텍스트"가 포함되어 있는지 검사

Git 파일 상태 돌리기

1. git add 취소하기

  • git add를 하면? staging 영역으로 간다고 했다. 그럼 add를 취소하고 싶으면, staging영역에 있는 변경 내역을 working 으로 옮겨주면 된다.
  • git reset 을 이용하면 된다.
    • 해당 명령어를 사용하면 add 하여 staging 영역에 있는 모든 파일을 add 취소를 하고, untrack (or modified) 상태로 되돌린다.
    • 특정 파일만 add를 취소하고 싶다면 git reset HEAD 특정파일을 이용한다.
  • 여기서 HEAD란?
    • branch 개념이 없으면 모를 수 있으니, 알고 다시 보면 선녀가 된다.
    • git init을 하면 해당 디렉토리는 local에서 'master' 브랜치가 만들어지고, 해당 브랜치에서 add commit 등의 버전 관리, 저장 등이 이뤄지는 것이다. 여기서 master는 브랜치의 '이름'(라벨) 이다.
    • HEAD는 현재 체크아웃된 커밋, 최후 저장된 상태인 커밋을 "가르키는 포인터다"

2. git commit 취소하기

--mixed option (default)

  • git commit을 하면 repo 영역으로, 그리고 파일은 unmodified 로 간다고 했다.
  • 위에서 HEAD와 체크아웃에 대해 말했다. 우린 그 HEAD, checkout pointer를 뒤로 옮겨주면 된다!
  • git reset HEAD^ or git reset HEAD^^ 와 같은 방법을 이용하자.
    • 전자는 1개 취소(삭제), 후자는 2개 취소(삭제) 다.

  • 이 과정은 mixed 옵션을 준 reset이다. 되돌려도 우리가 했던 commit은 내역에 '살아 있긴 하기 때문' -> 즉 reset 자체를 실수해도 되돌릴 수 있다는 것이다.

--hard option

  • mixed 와 동일한 작업을 하지만 결과가 다르다.
  • mixed는 commit '되돌려' 그 commit에서 새롭게 추가된 파일 또는 수정된 파일은 존재하긴 한 상태이다. 하지만 hard는 그 commit 자체를 삭제한다.
  • git reset --hard HEAD^ 와 같이 --hard 옵션만 추가하여 사용이 가능하다.
  • 더 자세한 사항은 4장 commit 정리하기 에서 다루겠다.

출처 및 참고

profile
도메인 중심의 개발, 깊이의 가치를 이해하고 “문제 해결” 에 몰두하는 개발자가 되고싶습니다. 그러기 위해 항상 새로운 것에 도전하고 노력하는 개발자가 되고 싶습니다!

0개의 댓글