[ProGit] 2. Git의 기초

KIM KYUBIN·2022년 9월 6일
0

ProGit

목록 보기
2/3

2.1 Git 저장소 만들기

  • 주로 다음 두 가지 중 한 가지 방법으로 Git 저장소를 쓰기 시작
    • 아직 버전관리를 하지 않는 로컬 디렉토리 하나를 선택해서 Git 저장소를 적용하는 방법
    • 다른 어딘가에서 Git 저장소Clone 하는 방법

2.1.1 기존 디렉토리를 Git 저장소로 만들기

  1. 프로젝트의 디렉토리로 이동

Windows

$ cd <디렉토리경로>
  1. .git 하위 디렉토리 생성
$ git init

2.1.2 기존 저장소를 Clone 하기

📌 다른 프로젝트에 참여하고 싶거나 Git 저장소를 복사하고 싶을 때

$ git clone <url>
  • 다른 디렉토리 이름으로 Clone 하고 싶을 경우
$ git clone <url> <새로운디렉토리이름>

2.2 수정하고 저장소에 저장하기

  • 파일의 라이프사이클
    파일의 라이프사이클

2.2.1 파일의 상태 확인하기

  • 파일의 상태 확인
$ git status
  • Untracked 파일은 아직 커밋에 넣어지지 않은 파일
  • 파일이 Tracked 상태가 되기 전까지는 Git은 절대 그 파일을 커밋하지 않는다.

2.2.2 파일을 새로 추적하기

  • 파일 새롭게 추적
$ git add <파일명>
  • "Changes to be committed"에 들어 있는 파일은 Tracked 상태이면서 Staged 상태

2.2.3 Modified 상태의 파일을 Stage 하기

📌 이미 Tracked 상태인 파일을 수정한 경우

  • "Changes not staged for commit"에 존재
    ▶️ Tracked 상태이지만 아직 Staged 상태는 아님

  • Staged 상태로 만들려면 git add 실행

  • git add를 실행한 후 파일을 수정하면 Staged 상태이면서 동시에 Unstaged 상태로 나온다.
    ▶️ git add 명령을 다시 실행해서 최신 버전을 Staged 상태로 만들어야 한다.

2.2.4 파일 상태를 짤막하게 확인하기

$ git status -s
  • 상태정보 컬럼

    • 왼쪽 : Staging Area에서의 상태
    • 오른쪽 : Working Tree에서의 상태
    • ?? : 아직 추적하지 않은 새 파일
    • A : 새로 생성한 파일
    • M : 수정한 파일

2.2.5 파일 무시하기

  • 로그 파일이나 빌드 시스템이 자동으로 생성한 파일은 Git이 관리할 필요가 없다.
    ▶️ 이런 파일을 무시하려면 .gitignore 파일을 만들어서 그 안에 무시할 파일 패턴을 적는다.

  • 자주 사용하는 예제
    https://github.com/github/gitignore

2.2.6 Staged와 Unstaged 상태의 변경 내용을 보기

📌 어떤 내용이 변경됐는지 살펴보고 싶을 경우

$ git diff
  • git diffUnstaged 상태인 것들만 보여준다.
    ▶️ 수정한 파일을 모두 Staging Area에 넣었다면 아무것도 출력하지 않는다.
$ git diff --cached
  • Staged 상태인 파일의 변경 사항 확인

2.2.7 변경사항 커밋하기

$ git commit
  • Staging Area에 속한 스냅샷을 커밋한다.
  • Git 설정에 지정된 편집기가 실행되고 커밋 메시지를 작성할 수 있다.
  • 내용을 저장하고 편집기를 종료하면 새 커밋이 완성된다.
  • 좋은 Git 커밋 메시지 작성하는 방법
    https://meetup.toast.com/posts/106

2.2.8 Staging Area 생략하기

  • Staging Area는 커밋할 파일을 정리한다는 점에서 매우 유용하지만 번거롭다.
$ git commit -a
  • -a 옵션을 추가하면 Tracked 상태의 파일을 자동으로 Staging Area에 넣은 후 커밋한다.

  • 남용할 경우 추가하지 말아야 할 변경사항도 추가될 수 있기 때문에 주의 깊게 사용해야 한다.

2.2.9 파일 삭제하기

  • 파일을 제거하려면 git rm 명령으로 Tracked 상태의 파일을 삭제한 후에 커밋해야 한다.
    ▶️ 워킹 디렉토리에 있는 파일도 삭제하기 때문에 실제 파일도 지워진다.

📌 Git 명령을 사용하지 않고 단순하게 워킹 디렉토리에서 파일을 삭제한 경우

  • Unstaged 상태로 표시
  • git rm을 실행하면 삭제한 파일은 Staged 상태가 된다.
  • 커밋하면 파일은 삭제되고 삭제된 파일을 추적하지 않는다.
$ git rm <파일이름>

📌 Staging Area에서만 제거하고 워킹 디렉토리에 있는 파일은 그대로 남겨두고 싶을 경우

  • .gitignore 파일에 추가하는 것을 빼먹었거나 대용량 로그 파일이나 컴파일된 파일인 .a 파일 같은 것을 실수로 추가했을 때 사용
$ git rm --cached <파일이름>

2.2.10 파일 이름 변경하기

$ git mv <변경전> <변경후>
  • 이름을 변경하고 나서 꼭 rm/add 명령을 실행해야 한다.

2.3 커밋 히스토리 조회하기

  • 저장소의 히스토리를 조회하는 방법
$ git log
  • -p : 각 커밋의 diff 결과를 보여준다.
$ git log -p
  • --stat : 각 커밋의 통계 정보 조회
$ git log --stat
  • --pretty : 히스토리 내용 출력 형식 지정

    • oneline : 각 커밋을 한 라인으로 출력
    $ git log --pretty=oneline
    • format : 나만의 포맷으로 출력

      • 포맷에서 사용하는 유용한 옵션
      옵션설명
      %H커밋 해시
      %h짧은 길이 커밋 해시
      %T트리 해시
      %t짧은 길이 트리 해시
      %P부모 해시
      %p짧은 길이 부모 해시
      %an저자 이름
      %ae저자 메일
      %ad저자 시각 (형식은 –-date=옵션 참고)
      %ar저자 상대적 시각
      %cn커미터 이름
      %ce커미터 메일
      %cd커미터 시각
      %cr커미터 상대적 시각
      %s요약
    $ git log --pretty=format:"<포맷>"
  • --graph : 브랜치와 머지 히스토리를 보여주는 아스키 그래프 출력

    ▶️ 자주 쓰는 명령

    $ git log --pretty=format:"%h %s" --graph

2.3.1 조회 제한조건

  • 조회 범위를 제한하는 옵션
옵션설명
--since명시한 날짜 이후의 커밋만 검색한다.
--until명시한 날짜 이전의 커밋만 조회한다.
--author입력한 저자의 커밋만 보여준다.
--committer입력한 커미터의 커밋만 보여준다.
--grep커밋 메시지 안의 텍스트를 검색한다.
-S커밋 변경(추가/삭제) 내용 안의 텍스트를 검색한다.

2.4 되돌리기

📌 완료한 커밋을 수정해야 할 때

  • 너무 일찍 커밋했거나 어떤 파일을 빼먹었을 때 그리고 커밋 메시지를 잘못 적었을 때 한다.

  • 다시 커밋하고 싶으면 파일 수정 작업을 하고 Staging Area에 추가한 다음 --amend 옵션을 사용하여 커밋을 재작성 할 수 있다.

$ git commit --amend
  • 만약 마지막으로 커밋하고 나서 수정한 것이 없다면 커밋 메시지만 수정한다.

  • 한 번 되돌리면 복구할 수 없기에 주의해야 한다.

2.4.1 파일 상태를 Unstage로 변경하기

  • 파일을 두 개 수정하고서 따로따로 커밋하려고 했지만, 실수로 git add *를 실행해 버렸다.
    둘 중 하나를 어떻게 꺼낼까?
    ▶️ git reset 명령으로 되돌릴 수 있다.
$ git reset HEAD <파일명>
  • Staged 상태의 파일을 Unstaged 상태로 변경시킨다.

2.4.2 Modified 파일 되돌리기

  • 수정한 파일을 최근 커밋된 버전으로 되돌리는 방법은 무엇일까?
$ git checkout -- <파일이름>

⚠️ 원래 파일로 덮어쓰기 때문에 수정한 내용은 전부 사라진다.
▶️ 그러므로, 수정한 내용이 정말 마음에 들지 않을 때만 사용하자!

2.5 리모트 저장소

  • 리모트 저장소 : 인터넷이나 네트워크 어딘가에 있는 저장소
  • 다른 사람들과 함께 일한다는 것은 리모트 저장소를 관리하면서 데이터를 Push하고 Pull 하는 것

2.5.1 리모트 저장소 확인하기

$ git remote -v
  • 리모트 저장소의 단축이름과 URL을 함께 출력

2.5.2 리모트 저장소 추가하기

$ git remote add <단축이름> <url>

2.5.3 리모트 저장소를 Pull 하거나 Fetch 하기

  • 리모트 저장소에서 데이터 가져오기
$ git fetch <단축이름>
  • git fetch 명령은 리모트 저장소의 데이터를 모두 로컬로 가져오지만, 자동으로 Merge 하지 않는다.
$ git pull <단축이름> <브랜치명>
  • git pull 명령은 리모트 저장소 브랜치에서 데이터를 가져올 뿐만 아니라 자동으로 로컬 브랜치와 Merge 시킬 수 있다.

2.5.4 리모트 저장소에 Push 하기

  • 현재 커밋된 데이터를 리모트 저장소로 내보내기
$ git push <단축이름> <브랜치명>

2.5.5 리모트 저장소 살펴보기

  • 리모트 저장소의 구체적 정보 확인
$ git remote show <단축이름>

2.5.6 리모트 저장소 이름을 바꾸거나 리모트 저장소를 삭제하기

  • 리모트 저장소의 이름 변경
$ git remote rename <변경전> <변경후>
  • 리모트 저장소 삭제
$ git remote remove <단축이름>

2.6 태그

  • 태그 : 커밋을 참조하기 쉽도록 알기 쉬운 이름을 붙이는 것
    ▶️ 주로 버전을 적는다.

2.6.1 태그 조회하기

  • 이미 만들어져 있는 태그 확인
$ git tag

2.6.2 태그 붙이기

Annotated 태그

  • Git 데이터베이스에 태그를 만든 사람 이름, 이메일과 만든 날짜, 태그 메시지를 저장
    GPG로 서명도 가능
    ▶️ 주로 사용하는 태그
$ git tag -a <태그이름> -m "<메시지>"
  • git show 명령으로 태그 정보와 커밋 정보를 모두 확인 가능
$ git show <태그이름>

Lightweight 태그

  • 단순히 이름만 달아준다.
    ▶️ 임시로 생성하는 태그거나 정보를 유지할 필요가 없는 경우 사용
$ git tag <태그이름>
  • git show 명령으로 태그 정보를 확인할 수 없다.

2.6.3 나중에 태그하기

  • 예전 커밋에 대해서도 태그할 수 있다.
  • 특정 커밋에 태그하기
$ git tag -a <태그이름> <커밋체크섬>

2.6.4 태그 공유하기

  • 태그를 만들었으면 서버에 별도로 push 해야 한다.
$ git push origin <태그이름>
  • 한 번에 태그를 여러 개 push하고 싶을 경우
    ▶️ --tags 옵션을 추가하여 리모트 서버에 없는 태그를 모두 전송
$ git push origin --tags
  • 이제 누군가 저장소에서 clone하거나 pull하면 모든 태그 정보도 함께 전송

2.6.5 태그를 Checkout 하기

  • 태그가 특정 버전을 가리키고 있고, 특정 버전의 파일을 체크아웃해서 확인하고 싶을때
    ⚠️ 단, 태그를 체크아웃하면 detached HEAD 상태가 되며 일부 Git 관련 작업이 브랜치에서 작업하는 것과 다르게 동작할 수 있다.
$ git checkout <태그이름>
  • detached HEAD 상태에서는 작업을 하고 커밋을 만들면, 태그는 그대로 있으나 새로운 커밋이 하나 쌓인 상태가 되고 새 커밋에 도달할 수 있는 방법이 따로 없게 된다.
    ▶️ 특정 태그의 상태에서 새로 작성한 커밋이 버그 픽스와 같이 의미있도록 하려면 반드시 브랜치를 만들어서 작업하는 것이 좋다.

2.7 Git Alias

  • Git의 명령을 전부 입력하는 것이 귀찮다면 git config를 사용하여 각 명령의 Alias를 쉽게 만들 수 있다.

  • Alias 생성

$ git config --global alias.<별명> '기존명령'
$ git config --global --get-regexp alias

참조
https://git-scm.com/

profile
상상을 현실로 만들기 위해 노력하는 개발자

0개의 댓글