Git란?

파일 변경 이력을 기록하여 관리하는 분산형 버전 관리 시스템. 작업 디렉터리에서 편집한 변경을 git add로 스테이징 영역에 등록하고, git commit으로 로컬 저장소에 기록하며, git push로 GitHub 등의 원격 저장소에 보낸다. 브랜치를 만들어 병행하여 개발하고, git merge로 통합할 수 있다. 소스 코드 외에 RTL, 검증용 테스트벤치, 스크립트 등의 관리에도 쓰인다.

일본어 명칭: Git

Git은(는) Linux와 커맨드 라인 기초, 소프트웨어 개발과 프로젝트 관리 등 2개 분야의 연습 문제 5개에 나와요.

분야: Linux와 커맨드 라인 기초

세 개의 장소

Git에서는 파일을 편집하는 작업 디렉터리, 다음 커밋에 포함할 변경을 두는 스테이징 영역(인덱스), 커밋 이력을 저장하는 저장소(.git 디렉터리)를 구별합니다. git status는 이 셋의 차이를 보여 주며, git diff는 작업 디렉터리와 스테이징 영역의 차이, git diff --staged는 스테이징 영역과 최신 커밋의 차이를 표시합니다.

브랜치와 원격

브랜치는 커밋 이력의 갈래에 붙인 이름으로, 새 기능이나 수정을 주 브랜치에 영향을 주지 않고 진행할 수 있습니다. git clone으로 원격 저장소를 로컬에 복사하고, git pull로 원격의 새 커밋을 가져오며, git push로 자신의 커밋을 보냅니다. 같은 곳을 각각 바꾼 브랜치를 병합하면 충돌(conflict)이 생겨 사람이 해결해야 합니다.

관리하지 않는 것

빌드나 시뮬레이션으로 생성되는 파일, 로그, 큰 파형 데이터 등은 .gitignore에 써서 추적 대상에서 제외합니다. 한 번 커밋한 파일은 .gitignore에 써도 추적이 계속되므로 git rm --cached로 제외합니다. 비밀번호나 키를 실수로 커밋하면 이력에 계속 남으므로, 커밋하기 전에 git status나 git diff로 내용을 확인하는 습관이 중요합니다.

도전해 보기: Git 관련 문제

Git으로 관리하고 있는 파일 main.c를 편집한 후 'git commit -m "fix"'만 실행했더니, 'no changes added to commit'이라고 표시되고 커밋되지 않았다. 이유로 올바른 것은?

  1. A커밋하기 전에 git push로 변경을 공유 저장소에 보내 두어야 하기 때문에
  2. B커밋에 포함할 변경은 먼저 git add로 스테이징 영역에 등록해 두어야 하기 때문에
  3. CGit은 파일을 저장했을 때 자동으로 커밋하므로, git commit을 실행할 필요가 없기 때문에
정답과 해설 보기

정답: B. 커밋에 포함할 변경은 먼저 git add로 스테이징 영역에 등록해 두어야 하기 때문에

Git에서는 작업 디렉터리에서 편집한 변경 가운데 git add로 스테이징 영역(인덱스)에 등록한 것만이 다음 git commit으로 기록됩니다. 이 2단계 구조 덕분에 편집한 여러 변경 가운데 관계있는 것만 골라 하나의 커밋으로 만들 수 있습니다. git status를 사용하면 어떤 변경이 스테이징되어 있는지 확인할 수 있습니다. 추적하고 있는 파일의 변경을 한꺼번에 등록하여 커밋하는 git commit -a라는 방법도 있습니다.

Git에서 git commit을 실행했지만, 팀에서 공유하고 있는 GitHub 저장소에는 그 커밋이 아직 표시되지 않는다. 이유로 올바른 것은?

  1. Agit commit은 변경을 스테이징 영역에 등록할 뿐이며, 기록하려면 git add가 필요하기 때문에
  2. Bgit commit한 변경을 공유 저장소에 보내려면 git pull을 실행해야 하기 때문에
  3. Cgit commit은 로컬 저장소에 대한 기록이며, 원격에 보내려면 git push가 필요하기 때문에
정답과 해설 보기

정답: C. git commit은 로컬 저장소에 대한 기록이며, 원격에 보내려면 git push가 필요하기 때문에

Git은 분산형 버전 관리 시스템으로, 각 개발자의 로컬에 저장소 전체가 있으며, git commit은 그 로컬 저장소에 변경을 기록합니다. GitHub 등의 원격 저장소에 보내려면 git push를 실행하고, 반대로 원격의 새 커밋을 로컬로 가져오려면 git pull(또는 git fetch와 git merge)을 사용합니다. 그래서 네트워크에 연결되어 있지 않아도 커밋은 할 수 있으며, 나중에 한꺼번에 push할 수 있습니다. 다른 사람이 먼저 push한 경우에는 먼저 그 변경을 가져오도록 요구받는 경우가 있습니다.

자주 묻는 질문

Git과 GitHub는 무엇이 다른가요?

Git은 로컬 컴퓨터에서 동작하는 버전 관리 소프트웨어 그 자체입니다. GitHub는 Git 저장소를 맡아 주는 웹 서비스로, 풀 리퀘스트에 의한 리뷰나 이슈 관리 등의 기능을 더하고 있습니다. GitLab 같은 비슷한 서비스나 사내에 두는 서버도 있으며, Git 자체는 어느 서비스와도 조합하여 사용할 수 있습니다.

직전 커밋을 취소하려면 어떻게 하나요?

아직 push하지 않았다면 git commit --amend로 직전 커밋을 고치거나 git reset으로 취소할 수 있습니다. 이미 push하여 공유한 커밋은 다른 사람의 이력과 어긋나지 않도록, 취소하는 변경을 새 커밋으로 추가하는 git revert를 사용하는 것이 안전합니다.

해설 속 Git

Git이(가) 나오는 문제 (5)

  1. Git으로 관리하고 있는 파일 main.c를 편집한 후 'git commit -m "fix"'만 실행했더니, 'no changes added to commit'이라고 표시되고 커밋되지 않았다. 이유로 올바른 것은?
  2. Git에서 git commit을 실행했지만, 팀에서 공유하고 있는 GitHub 저장소에는 그 커밋이 아직 표시되지 않는다. 이유로 올바른 것은?
  3. Git으로 관리하고 있는 프로젝트의 .gitignore에 'build/'라고 썼지만, 이전에 커밋한 build/out.log의 변경이 git status에 계속 표시된다. 이유로 올바른 것은?
  4. Git에서 두 개발자가 같은 파일의 같은 행을 각각 다른 브랜치에서 고쳐 쓰고, 한쪽 브랜치를 다른 쪽에 병합했다. 이때 일어나는 일로 적절한 것은?
  5. 올바르게 동작하는 것으로 알려진 펌웨어 버전 뒤에 1,000개의 커밋이 있고, 최신 커밋에서는 결함이 일어난다. 결함은 어느 한 커밋에서 들어왔고, 그 이후의 커밋에서는 모두 일어난다고 한다. git bisect처럼 이진 탐색으로 원인 커밋을 특정할 때, 빌드하여 테스트하는 횟수의 최댓값은?

관련 용어

이진 탐색(Binary Search) 셸(Shell) 슈퍼유저(Superuser) 시그널(Unix 시그널) 심볼릭 링크(Symbolic Link) 입출력 리다이렉션(I/O Redirection) 정규 표현식(Regular Expression) 파이프(|) 파일 권한(퍼미션) 하드 링크(Hard Link)

용어집으로 돌아가기