맨위로가기

깃 (소프트웨어)

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

깃(Git)은 리눅스 커널 개발을 위해 2005년 리누스 토르발스에 의해 개발된 분산 버전 관리 시스템이다. 비트키퍼의 상업적 이용 제한에 대응하여 개발이 시작되었으며, 빠른 속도, 분산 개발 지원, 데이터 무결성 보장 등을 특징으로 한다. 깃은 파일의 변경 이력을 효율적으로 관리하며, 툴킷 기반 설계와 다양한 병합 전략을 통해 유연성과 확장성을 제공한다. 깃은 1.0 버전이 2005년 12월에 릴리스된 이후 지속적으로 발전해왔으며, 현재는 GUI, 웹 인터페이스, 터미널 인터페이스 등 다양한 인터페이스를 지원한다. 깃은 오픈 소스 깃 서버, 깃 서버 서비스, 깃 확장 등 다양한 형태로 활용되며, 소프트웨어 개발 분야에서 널리 사용되고 있다.

더 읽어볼만한 페이지

  • 깃 (소프트웨어) - 깃허브
    깃허브는 Git 버전 관리 시스템을 기반으로 소프트웨어 개발 협업 기능과 부가 서비스를 제공하는 웹 기반 플랫폼이지만, 여러 논란과 비판도 존재하는 세계 최대의 소프트웨어 개발 플랫폼이다.
  • 깃 (소프트웨어) - Gitee
    Gitee는 2022년 5월 18일 모든 코드 공개 전에 수동 검토를 발표했으며, 이는 중국 검열 강화에 따른 정부 명령으로 추측되어 표현의 자유와 오픈 소스 생태계에 영향을 미칠 수 있다는 우려가 제기되었다.
  • 리누스 토르발스 - 리눅스 재단
    리눅스 재단은 리눅스 운영체제 표준화 및 오픈 소스 프로젝트 지원을 위해 설립된 비영리 단체이다.
  • 리누스 토르발스 - 리눅스 배포판
    리눅스 배포판은 리눅스 커널에 다양한 소프트웨어를 묶어 사용자가 운영 체제를 쉽게 사용할 수 있도록 구성한 것이며, 데비안, 레드햇, 슬랙웨어, SUSE, 아치 등 다양한 계열과 목적에 특화된 배포판이 존재한다.
  • 분산 버전 관리 시스템 - 비트키퍼
    비트키퍼는 래리 맥보이가 설계한 버전 관리 시스템으로, 리눅스 커널 개발 지원을 위해 거론되다 라이선스 정책 변경으로 오픈 소스 커뮤니티와 갈등을 겪었으나, 이후 아파치 라이선스 2.0으로 오픈 소스화되었다.
  • 분산 버전 관리 시스템 - Bazaar (소프트웨어)
    Bazaar는 중앙 서버 없이 로컬 저장소를 사용하는 분산 버전 관리 시스템으로, 유니코드 지원을 통해 다국어 협업을 가능하게 하고 플러그인 시스템으로 Subversion, Git 등 다른 시스템과의 연동을 지원했으나, 2010년대 이후 개발이 둔화되었다.
깃 (소프트웨어) - [IT 관련 정보]에 관한 문서
기본 정보
Git 로고
Git 로고
스크린샷Git session.svg
스크린샷 설명저장소 생성, 파일 추가, 원격 동기화를 보여주는 명령줄 세션
종류버전 관리
개발
최초 개발자리누스 토르발스
개발자주니오 하마노 및 기타
최초 릴리스2005년 4월 7일
프로그래밍 언어주로 C
GUI 및 프로그래밍 스크립트:
셸 스크립트

Tcl
파이썬
운영 체제POSIX (리눅스, macOS, 솔라리스, AIX)
윈도우
라이선스GPL-2.0-only
기타
웹사이트Git 공식 웹사이트

2. 역사

리눅스 커널 개발자들은 2002년부터 비트키퍼소스 관리 시스템으로 사용해왔다. 그러나 비트키퍼의 저작권을 가진 래리 맥보이가 앤드루 트리젤의 비트키퍼 프로토콜 리버스 엔지니어링을 문제삼아 자유 이용을 철회하면서, 2005년 4월부터 깃 개발이 시작되었다.[173] 이 사건은 머큐리얼 탄생의 계기가 되기도 했다.

리누스 토르발스는 비트키퍼와 같은 분산 버전 관리 시스템을 원했지만, 당시 자유소프트웨어 중에서는 그의 요구를 충족하는 것이 없었다. 그는 패치 적용 및 메타데이터 업데이트에 30초가 걸리는 시스템은 리눅스 커널 관리에는 부적합하다고 보았으며, 패치 작업에 3초 이상 소요되면 안 된다고 규정했다.[168] 또한, CVS를 참고하여 분산 방식의 비트키퍼같은 워크플로를 지원하고, 변질에 대비한 강력한 안전 기준을 포함해야 한다는 조건을 제시했다.[170][169]

이러한 기준을 만족하는 버전 관리 시스템이 없었기에, 토르발스는 2.6.12-rc2 리눅스 커널 개발 릴리스 직후부터 직접 개발을 시작했다.[170]

리눅스 커널 개발에서는 다수의 패치를 멘테이너들이 소스 코드에 적용하는 형식이 채택되었다. 처음에는 BitKeeper라는 버전 관리 시스템을 사용했지만, 이 소프트웨어는 상용 소프트웨어였기에 BitKeeper의 클론을 구현하면서 이 환경을 사용할 수 없게 되었고, 그 대체로 2005년에 Git가 개발되었다.[120]

GitHub를 Microsoft사가 2018년에 75억달러에 인수하면서,[14] Visual Studio Code에 Git가 기본 탑재되었다.

2. 1. 개발 배경

리눅스 커널 개발자들은 2002년부터 비트키퍼라는 소스 관리 시스템을 사용해왔다. 그러나 비트키퍼 저작권을 가진 래리 맥보이는 앤드루 트리젤이 비트키퍼 프로토콜을 리버스 엔지니어링하여 소스풀러(SourcePuller)를 만들었다고 주장하며 비트키퍼의 자유 이용을 철회했다. 이로 인해 2005년 4월부터 깃 개발이 시작되었다.[173] 이 사건은 머큐리얼이라는 다른 버전 관리 시스템이 만들어지는 계기가 되기도 했다.

리누스 토르발스는 비트키퍼와 같은 분산 버전 관리 시스템을 원했으나, 당시 사용 가능했던 자유소프트웨어 중에서는 그의 요구를 충족하는 것이 없었다. 토르발스는 패치 적용 및 메타데이터 업데이트에 30초가 걸리는 시스템은 리눅스 커널 관리에는 부적합하다고 지적하며, 패치 작업에 3초 이상 소요되면 안 된다고[168] 규정하고 다음 3가지 사항을 추가했다.

  • 무엇을 하지 "않을지"의 예로 CVS를 참고하고, 의심이 되면 반대로 결정할 것[170]
  • 분산 방식의 비트키퍼같은 워크플로를 지원할 것[170]
  • 우연이든 악의적이든 변질에 대비한 매우 강력한 안전 기준을 포함할 것[169]


당시 존재했던 버전 관리 시스템 중에서는 이러한 기준을 만족하는 것이 없었기에, 토르발스는 2.6.12-rc2 리눅스 커널 개발 릴리스 직후부터 직접 개발을 시작했다.[170]

깃 개발은 2005년 4월 3일에 시작되었다.[174] 토르발스는 4월 6일 이 프로젝트를 발표했고,[175] 4월 7일부터는 자체 호스팅이 진행되었다.[174] 여러 브랜치의 최초 병합은 4월 18일에 실시되었다.[176] 4월 29일, 초기 깃은 벤치마크 수행 시 1초에 6.7개의 패치 속도로 리눅스 커널 트리에 패치를 기록하여, 토르발스는 그의 성능 목표를 달성하였다.[177] 6월 16일 깃은 커널 2.6.12 릴리스를 관리하였다.[178]

토르발스는 2005년 7월 26일 프로젝트의 주 기여자인 주니오 하마노에게 유지보수를 인계하였다.[179] 하마노는 2005년 12월 21일 1.0 릴리스를 맡았으며, 현재까지 프로젝트의 핵심 유지보수자로 남아있다.[180]

2. 2. 개발 과정

깃 개발은 2005년 4월 3일에 시작되었다.[174] 리누스 토르발스는 4월 6일에 이 프로젝트를 발표했고,[175] 4월 7일에는 깃이 자체 호스팅이 가능해졌다.[174] 여러 브랜치의 최초 병합은 4월 18일에 실시되었다.[176]

리누스 토르발스는 깃 개발에 대한 세 가지 주요 목표를 설정했다.

  • CVS를 하지 말아야 할 것의 예로 삼고, 의심이 되면 명확히 반대의 결정을 할 것[170]
  • 분산 방식의 비트키퍼같은 워크플로를 지원할 것[170]
  • 우연이든 악의적이든 변질에 대비한 매우 강력한 안전 기준을 포함할 것[169]


당시에는 이러한 기준을 만족하는 버전 관리 시스템이 없었기 때문에, 토르발스는 직접 깃을 개발하기 시작했다.

깃은 빠른 속도를 목표로 개발되었다. 2005년 4월 29일, 초기의 깃은 벤치마크 수행 시 1초에 6.7개의 패치 속도로 리눅스 커널 트리에 패치를 기록하여, 토르발스는 그의 성능 목표를 달성하였다.[177] 2005년 6월 16일, 깃은 커널 2.6.12 릴리스를 관리하였다.[178]

2005년 7월 26일, 토르발스는 프로젝트의 주 기여자인 주니오 하마노에게 유지보수를 인계하였다.[179] 하마노는 2005년 12월 21일 1.0 릴리스를 맡았으며,[180] 현재까지 프로젝트의 핵심 유지보수자로 남아있다.

2. 3. 릴리스

깃은 2005년 12월 21일에 1.0 버전이 릴리스된 이후, 지속적으로 발전해왔다.[180][23] 깃의 주요 개발자인 주니오 하마노는 1.0 릴리스를 포함하여 프로젝트의 유지보수를 담당하고 있다.[179][180]

깃의 버전별 릴리스 정보는 다음과 같다.

버전원래 출시일최신판출시일
0.992005-07-110.99.9n2005-12-15
1.02005-12-211.0.132006-01-27
1.12006-01-081.1.62006-01-30
1.22006-02-121.2.62006-04-08
1.32006-04-181.3.32006-05-16
1.42006-06-101.4.4.52008-07-16
1.52007-02-141.5.6.62008-12-17
1.62008-08-171.6.6.32010-12-15
1.72010-02-131.7.12.42012-10-17
1.82012-10-211.8.5.62014-12-17
1.92014-02-141.9.52014-12-17
2.02014-05-282.0.52014-12-17
2.12014-08-162.1.42014-12-17
2.22014-11-262.2.32015-09-04
2.32015-02-052.3.102015-09-29
2.42015-04-302.4.122017-05-05
2.52015-07-272.5.62017-05-05
2.62015-09-282.6.72017-05-05
2.72015-10-042.7.62017-07-30
2.82016-03-282.8.62017-07-30
2.92016-06-132.9.52017-07-30
2.102016-09-022.10.52017-09-22
2.112016-11-292.11.42017-09-22
2.122017-02-242.12.52017-09-22
2.132017-05-102.13.72018-05-22
2.142017-08-042.14.62019-12-07
2.152017-10-302.15.42019-12-07
2.162018-01-172.16.62019-12-07
2.172018-04-022.17.62021-03-09
2.182018-06-212.18.52021-03-09
2.192018-09-102.19.62021-03-09
2.202018-12-092.20.52021-03-09
2.212019-02-242.21.42021-03-09
2.222019-06-072.22.52021-03-09
2.232019-08-162.23.42021-03-09
2.242019-11-042.24.42021-03-09
2.252020-01-132.25.52021-03-09
2.262020-03-222.26.32021-03-09
2.272020-06-012.27.12021-03-09
2.282020-07-272.28.12021-03-09
2.292020-10-192.29.32021-03-09
2.302020-12-272.30.22021-03-09
2.312021-03-152.31.12021-04-02
2.322021-06-062.32.52023-01-17
2.332021-08-162.33.12021-10-12
2.342021-11-152.34.62023-01-17
2.352022-01-252.35.62023-01-17
2.362022-04-182.36.42023-01-17
2.372022-06-272.37.52023-01-17
2.382022-10-022.38.32023-01-17
2.392022-12-122.39.12023-01-17
2.402023-03-142.40.02023-03-14


2. 4. 명칭의 유래

Git영어이라는 이름은 리누스 토르발스가 지었다. 그는 "git"이라는 이름에 대해 "나는 자만심 강한 녀석이라 모든 프로젝트에 내 이름을 붙입니다. 처음에는 '리눅스'였고, 이제는 'git'입니다."라고 말했다.[24][25] 영국 영어 속어 "git"은 "불쾌한 사람"을 의미한다. 깃의 man 페이지는 Git을 "멍청한 콘텐츠 추적기"라고 설명한다.[26]

소스 코드의 읽기 파일에는 다음과 같은 설명이 있다.[27]

Git의 소스 코드는 이 프로그램을 "지옥에서 온 정보 관리자"라고 언급한다.

리누스 토르발스에 따르면[144],

영어 속어로, 깃(Git)에는 "바보", "멍청이"와 같은 의미가 있다. 이는 리누스가 리눅스의 이름을 정할 때 자신의 이름과 관련된 이름을 붙이도록 강요받은 데서 유래한 자학 개그를 비꼬는 것이다.(리눅스 이름의 유래 참조)

깃(Git)의 공식 사이트의 위키에서는 "깃(Git)"이라는 이름에 대해 ''Global Information Tracker'' 등과 같은 다른 몇 가지 해석도 제시하고 있다.[145]

3. 특징

깃은 분산 버전 관리 시스템으로서 다음과 같은 특징을 갖는다.


  • 비선형 개발 지원: 깃은 빠른 분기(브랜치) 및 병합을 지원하며, 비선형 개발 이력을 시각화하고 탐색하기 위한 도구를 포함한다. 깃의 핵심 가정은 변경 사항이 작성되는 것보다 더 자주 병합된다는 것이다. 깃에서 브랜치는 매우 가볍다. 브랜치는 단 하나의 커밋에 대한 참조일 뿐이다.
  • 분산 개발: Darcs, BitKeeper, Mercurial, Bazaar, Monotone과 마찬가지로 깃은 각 개발자에게 전체 개발 이력의 로컬 사본을 제공하며, 변경 사항은 이러한 각 저장소 간에 복사된다. 이러한 변경 사항은 추가된 개발 브랜치로 가져오며 로컬에서 개발된 브랜치와 동일한 방식으로 병합할 수 있다.
  • 기존 시스템 및 프로토콜과의 호환성: 저장소는 보안 하이퍼텍스트 전송 프로토콜(HTTPS), Hypertext Transfer Protocol (HTTP), File Transfer Protocol (FTP) 또는 일반 소켓 또는 Secure Shell (ssh)을 통한 깃 프로토콜을 통해 게시할 수 있다. 깃은 또한 CVS 서버 에뮬레이션을 가지고 있어 기존 CVS 클라이언트 및 IDE 플러그인을 사용하여 깃 저장소에 액세스할 수 있다. Subversion 저장소는 git-svn과 함께 직접 사용할 수 있다.
  • 대규모 프로젝트의 효율적인 처리: 토르발스는 깃이 매우 빠르고 확장성이 뛰어나다고 설명했으며, Mozilla가 수행한 성능 테스트 결과 깃이 Mercurial 및 GNU Bazaar보다 대규모 저장소의 차이점을 계산하는 속도가 수십 배 더 빠르다는 것을 보여주었다. 로컬에 저장된 저장소에서 버전 이력을 가져오는 것은 원격 서버에서 가져오는 것보다 100배 더 빠를 수 있다.
  • 이력의 암호화 인증: 깃 이력은 특정 버전(커밋)의 ID가 해당 커밋에 이르는 전체 개발 이력에 따라 달라지는 방식으로 저장된다. 게시된 후에는 이전 버전을 알아채지 못하게 변경하는 것이 불가능하다. 구조는 Merkle tree와 유사하다.
  • 파일 이름 변경의 암묵적 처리: 깃은 파일 이름 변경을 명시적으로 기록하지 않고, 변경 이력 조회 시점에 추론한다. 이는 파일 이름 변경 외에도 분할, 병합 등 다양한 변경이 발생할 수 있다는 점을 고려한 설계이다.
  • 툴킷 기반 설계: 깃은 C로 작성된 일련의 프로그램과 해당 프로그램에 대한 래퍼를 제공하는 여러 셸 스크립트로 설계되었다. 이러한 스크립트의 대부분은 속도와 이식성을 위해 C로 다시 작성되었지만, 설계는 유지되며 구성 요소를 함께 연결하기가 쉽다.
  • 플러그 가능한 병합 전략: 툴킷 설계의 일부로 깃은 불완전한 병합에 대한 잘 정의된 모델을 가지고 있으며, 이를 완료하기 위한 여러 알고리즘이 있으며, 최종적으로 사용자에게 병합을 자동으로 완료할 수 없으며 수동 편집이 필요하다고 알린다.
  • 가비지 컬렉션: 작업 중단 또는 변경 사항을 되돌리면 데이터베이스에 쓸모없는 객체가 남게 된다. 깃은 저장소에 충분한 느슨한 객체가 생성되면 자동으로 가비지 수집을 수행한다. 가비지 수집은 `git gc`를 사용하여 명시적으로 호출할 수 있다.
  • 정기적인 명시적 객체 패킹: 깃은 새로 생성된 각 객체를 별도의 파일로 저장한다. 개별적으로 압축되지만, 이는 많은 공간을 차지하고 비효율적이다. 이는 한 파일(또는 네트워크 바이트 스트림)에 서로 델타 압축된 많은 수의 객체를 저장하는 "팩"을 사용하여 해결된다.

3. 1. 설계

깃의 설계는 리누스 토르발스가 리눅스 커널 개발 경험과 파일 시스템에 대한 지식을 바탕으로 한다. 주요 특징은 다음과 같다.

  • 비선형 개발 지원: 깃은 빠른 분기(브랜치) 및 병합을 지원하며, 비선형 개발 이력을 시각화하고 탐색하기 위한 도구를 포함한다. 변경 사항은 작성되는 것보다 자주 병합된다는 가정하에 설계되었다. 깃에서 브랜치는 매우 가볍고, 단 하나의 커밋에 대한 참조일 뿐이다.[40]
  • 분산 개발: Darcs, BitKeeper, Mercurial, Bazaar, Monotone과 마찬가지로 각 개발자는 전체 개발 이력의 로컬 사본을 가지며, 변경 사항은 저장소 간에 복사된다. 이러한 변경 사항은 추가된 개발 브랜치로 가져와 로컬 브랜치와 동일한 방식으로 병합할 수 있다.[41]
  • 기존 시스템 및 프로토콜과의 호환성: 저장소는 보안 하이퍼텍스트 전송 프로토콜(HTTPS), Hypertext Transfer Protocol (HTTP), File Transfer Protocol (FTP) 또는 Secure Shell (ssh)을 통해 게시할 수 있다. 깃은 CVS 서버 에뮬레이션 기능도 제공하여 기존 CVS 클라이언트 및 IDE 플러그인을 사용하여 깃 저장소에 접근할 수 있다. Subversion 저장소는 git-svn을 통해 직접 사용할 수 있다.[42]
  • 대규모 프로젝트 처리 효율성: 토르발스는 깃이 매우 빠르고 확장성이 뛰어나다고 설명했다. Mozilla의 성능 테스트 결과, 깃은 Mercurial 및 GNU Bazaar보다 대규모 저장소의 차이점을 계산하는 속도가 훨씬 빨랐다. 로컬 저장소에서 버전 이력을 가져오는 것은 원격 서버에서 가져오는 것보다 100배 더 빠를 수 있다.[43]
  • 이력의 암호화 인증: 깃 이력은 특정 버전(커밋)의 ID가 해당 커밋에 이르는 전체 개발 이력에 따라 달라지는 방식으로 저장된다. 게시된 후에는 이전 버전을 알아채지 못하게 변경하는 것이 불가능하다. 구조는 Merkle tree와 유사하다.[44]
  • 툴킷 기반 설계: 깃은 C로 작성된 일련의 프로그램과 셸 스크립트로 설계되었다. 구성 요소를 쉽게 연결할 수 있다.[45]
  • 플러그 가능한 병합 전략: 깃은 불완전한 병합에 대한 잘 정의된 모델을 가지고 있으며, 여러 알고리즘을 제공한다. 자동 병합이 불가능한 경우 사용자에게 수동 편집이 필요하다고 알린다.[46]
  • 가비지 컬렉션: 작업 중단 또는 변경 사항을 되돌리면 데이터베이스에 쓸모없는 객체가 남게 된다. 깃은 저장소에 충분한 느슨한 객체가 생성되면 자동으로 가비지 수집을 수행한다. 가비지 수집은 `git gc`를 사용하여 명시적으로 호출할 수 있다.
  • 정기적인 명시적 객체 패킹: 깃은 새로 생성된 각 객체를 별도의 파일로 저장한다. 개별적으로 압축되지만, 이는 많은 공간을 차지하고 비효율적이다. 이는 한 파일(또는 네트워크 바이트 스트림)에 서로 델타 압축된 많은 수의 객체를 저장하는 "팩"을 사용하여 해결된다. 이를 "packfile"이라고 한다. 팩은 올바름에 의존하지 않고 이름이 같은 파일이 유사할 것이라는 휴리스틱을 사용하여 압축된다. 각 packfile에 대해 packfile의 각 객체의 오프셋을 기록하는 해당 색인 파일이 생성된다. 새로 생성된 객체(새로 추가된 이력이 있는 객체)는 여전히 단일 객체로 저장되며, 공간 효율성을 유지하기 위해 정기적인 리패킹이 필요하다. 저장소를 패킹하는 프로세스는 계산 비용이 매우 많이 들 수 있다. 객체가 느슨하지만 빠르게 생성된 형식으로 저장소에 존재하도록 허용함으로써 깃은 비용이 많이 드는 팩 작업을 시간이 덜 중요한 시점, 예를 들어 퇴근 시간에 연기할 수 있다. 깃은 정기적인 리패킹을 자동으로 수행하지만, `git gc` 명령으로 수동 리패킹도 가능하다. 데이터 무결성을 위해 packfile과 해당 인덱스 모두 내부에 SHA-1 체크섬이 있으며, packfile의 파일 이름에도 SHA-1 체크섬이 포함되어 있다. 저장소의 무결성을 확인하려면 `git fsck` 명령을 실행한다.


깃의 또 다른 특징은 파일의 디렉토리 트리를 스냅샷한다는 것이다. 소스 코드의 버전을 추적하는 초기 시스템인 Source Code Control System (SCCS) 및 Revision Control System (RCS)는 개별 파일에서 작동했으며, (대부분 유사한) 버전의 interleaved deltas (SCCS) 또는 delta encoding (RCS)에서 얻을 수 있는 공간 절약을 강조했다. 이후의 버전 관리 시스템은 프로젝트의 여러 개정판에서 파일의 ID라는 개념을 유지했다. 그러나 토르발스는 이 개념을 거부했다. 결과적으로 깃은 소스 코드 트리 아래의 모든 수준에서 파일 개정 관계를 명시적으로 기록하지 않는다. 이러한 암묵적인 개정 관계는 몇 가지 중요한 결과를 가져온다.

  • 파일 하나의 변경 이력을 검사하는 것은 전체 프로젝트보다 약간 더 비용이 많이 든다.
  • 이름 변경은 명시적으로 처리되지 않고 암묵적으로 처리된다.


깃의 기본 요소는 본질적으로 버전 관리 시스템이 아니다. 토르발스는 다음과 같이 설명한다.[47]

이러한 초기 설계 접근 방식에서 깃은 전통적인 SCM에서 기대되는 모든 기능을 갖추게 되었으며,[48] 대부분의 기능은 필요에 따라 생성된 다음 시간이 지남에 따라 개선되고 확장되었다.

깃 버전 관리 시스템의 일부 데이터 흐름 및 저장 수준


깃은 두 개의 자료 구조를 가지고 있다. 작업 디렉터리 및 다음에 커밋할 개정에 대한 정보를 캐시하는 변경 가능한 ''인덱스''(또는 ''스테이지'' 또는 ''캐시'')와 변경 불가능한 객체를 저장하는 ''객체 데이터베이스''가 있다.

인덱스는 객체 데이터베이스와 작업 트리를 연결하는 지점 역할을 한다.

객체 저장소에는 다섯 가지 유형의 객체가 포함되어 있다.[49][38]

  • '''blob'''은 파일의 내용이다.
  • '''tree''' 객체는 디렉터리에 해당한다.
  • '''commit''' 객체는 트리 객체를 기록으로 연결한다.
  • '''tag''' 객체는 다른 객체에 대한 참조를 포함하고 다른 객체와 관련된 추가 메타데이터를 저장할 수 있는 컨테이너이다.
  • '''packfile''' 객체는 콤팩트함과 네트워크 프로토콜을 통한 전송 편의성을 위해 다른 다양한 객체를 zlib 압축 번들로 수집한다.


각 객체는 내용의 SHA-1 해시로 식별된다.

깃은 파일의 각 버전을 고유한 블롭으로 저장한다. 새로 추가된 객체는 zlib 압축을 사용하여 전체적으로 저장된다. 이는 많은 양의 디스크 공간을 빠르게 소비할 수 있으므로, 객체는 델타 압축을 사용하여 공간을 절약하고 다른 블롭에 상대적인 변경 사항으로 블롭을 저장하는 ''팩''으로 결합될 수 있다.

또한 깃은 refs(references의 약자)라는 레이블을 저장하여 다양한 커밋의 위치를 나타낸다. 이들은 참조 데이터베이스에 저장되며 다음과 같다.[50]

  • '''Heads (브랜치)''': 커밋이 생성될 때 자동으로 새로운 커밋으로 진행되는 명명된 참조.
  • '''HEAD''': 커밋을 생성하기 위해 작업 트리에 대해 비교될 예약된 헤드.
  • '''Tags''': 브랜치 참조와 유사하지만 특정 커밋으로 고정된다.

3. 2. 데이터 구조

깃은 두 개의 자료 구조를 가지고 있다. 작업 디렉터리 및 다음에 커밋할 개정에 대한 정보를 캐시하는 변경 가능한 ''인덱스''(또는 ''스테이지'' 또는 ''캐시'')와 변경 불가능한 객체를 저장하는 ''객체 데이터베이스''가 있다.

인덱스는 객체 데이터베이스와 작업 트리를 연결하는 지점 역할을 한다.

객체 저장소에는 다섯 가지 유형의 객체가 포함되어 있다.[49][38]

  • '''blob'''은 파일의 내용이다. 블롭에는 고유한 파일 이름, 타임 스탬프 또는 기타 메타데이터가 없다(블롭의 이름은 내부적으로 내용의 해시값이다). 깃에서 각 블롭은 파일의 데이터가 포함된 파일의 버전이다.
  • '''tree''' 객체는 디렉터리에 해당한다. 파일 이름 목록을 포함하며, 각 파일 이름에는 일부 유형 비트와 해당 파일, 심볼릭 링크 또는 디렉터리의 내용인 블롭 또는 트리 객체에 대한 참조가 있다. 이러한 객체는 소스 트리의 스냅샷이다. (전체적으로 이는 머클 트리를 구성하며, 이는 루트 트리에 대한 단일 해시만으로도 충분하며 실제로 커밋에 사용되어 모든 수의 하위 디렉터리 및 파일의 전체 트리 구조의 정확한 상태를 정확하게 지적할 수 있음을 의미한다.)
  • '''commit''' 객체는 트리 객체를 기록으로 연결한다. 여기에는 최상위 소스 디렉터리의 트리 객체 이름, 타임스탬프, 로그 메시지 및 0개 이상의 상위 커밋 객체 이름이 포함되어 있다.
  • '''tag''' 객체는 다른 객체에 대한 참조를 포함하고 다른 객체와 관련된 추가 메타데이터를 저장할 수 있는 컨테이너이다. 가장 일반적으로 깃이 추적하는 데이터의 특정 릴리스에 해당하는 커밋 객체의 디지털 서명을 저장하는 데 사용된다.
  • '''packfile''' 객체는 콤팩트함과 네트워크 프로토콜을 통한 전송 편의성을 위해 다른 다양한 객체를 zlib 압축 번들로 수집한다.


각 객체는 내용의 SHA-1 해시로 식별된다. 깃은 해시를 계산하고 이 값을 객체 이름으로 사용한다. 객체는 해시의 처음 두 글자와 일치하는 디렉터리에 넣어진다. 해시의 나머지는 해당 객체의 파일 이름으로 사용된다.

깃은 파일의 각 버전을 고유한 블롭으로 저장한다. 블롭 간의 관계는 트리 및 커밋 객체를 검사하여 찾을 수 있다. 새로 추가된 객체는 zlib 압축을 사용하여 전체적으로 저장된다. 이는 많은 양의 디스크 공간을 빠르게 소비할 수 있으므로, 객체는 델타 압축을 사용하여 공간을 절약하고 다른 블롭에 상대적인 변경 사항으로 블롭을 저장하는 ''팩''으로 결합될 수 있다.

또한 깃은 refs(references의 약자)라는 레이블을 저장하여 다양한 커밋의 위치를 나타낸다. 이들은 참조 데이터베이스에 저장되며 다음과 같다.[50]

  • '''Heads (브랜치)''': 커밋이 생성될 때 자동으로 새로운 커밋으로 진행되는 명명된 참조.
  • '''HEAD''': 커밋을 생성하기 위해 작업 트리에 대해 비교될 예약된 헤드.
  • '''Tags''': 브랜치 참조와 유사하지만 특정 커밋으로 고정된다. 기록에서 중요한 지점에 레이블을 지정하는 데 사용된다.


Git 데이터베이스 내에서 참조되지 않은 모든 객체는 가비지 수집 명령을 사용하거나 자동으로 정리될 수 있다. 객체는 다른 객체 또는 명시적 참조에 의해 참조될 수 있다. Git은 다양한 유형의 참조를 가지고 있다. 참조를 생성, 이동 및 삭제하는 명령은 서로 다릅니다. `git show-ref`는 모든 참조를 나열한다. 몇 가지 유형은 다음과 같다.

  • ''heads'': 로컬 객체를 참조한다.
  • ''remotes'': 원격 저장소에 존재하는 객체를 참조한다.
  • ''stash'': 아직 커밋되지 않은 객체를 참조한다.
  • ''meta'': 예를 들어, 베어 저장소의 구성, 사용자 권한; refs/meta/config 네임스페이스는 소급적으로 도입되었으며, Gerrit에서 사용된다.[55]
  • ''tags'': 위 참조.

4. 사용법

깃은 분산형 소스 코드 관리 시스템이므로, 원격 서버 등에 있는 중심 저장소의 완전한 복사본을 로컬 환경에 생성하여 해당 로컬 저장소를 사용해 작업을 수행한다.

저장소 간의 통신(clone, pull, push)에는 다음과 같은 프로토콜을 사용할 수 있다.[51][52]


  • 로컬 파일 시스템
  • SSH
  • git (인증 기능 없음)
  • HTTP/HTTPS
  • push를 하기 위해서는 서버 측에 git-http-backend 프로그램 또는 WebDAV가 필요하다.
  • FTP/FTPS: 하지만, 더 이상 사용해서는 안 된다고 여겨지고 있다.
  • [https://docs.github.com/ja/github-cli/github-cli/about-github-cli GitHub CLI]: GitHub와의 통신을 위해 만들어진 전용 명령줄 도구.


이전에는 rsync도 사용할 수 있었지만, 2.8.0에서 폐지되었다.[51][52]

` .gitignore` 파일을 이용하면 특정 파일이나 폴더를 깃의 추적 대상에서 제외할 수 있다. 이 기능은 비밀번호와 같은 민감한 정보나, 불필요한 파일, 또는 용량이 큰 파일을 관리할 때 유용하게 사용된다.[53][54]

4. 1. 기본 명령어

Git의 명령 줄 인터페이스에서 자주 사용되는 명령어는 다음과 같다.[51][52]

  • `git init`은 git 저장소를 만드는 데 사용된다.
  • `git clone [URL]`은 외부 URL에서 git 저장소를 ''복제'' 또는 복사한다.
  • `git add [file]`은 파일을 git의 ''작업 디렉토리''(커밋할 파일)에 추가한다.
  • `git commit -m [commit message]`는 현재 작업 디렉토리의 파일을 ''커밋''한다(따라서 이제 저장소 기록의 일부가 된다).
  • `git push`는 로컬 저장소의 변경 내용을 원격 저장소에 반영한다.
  • `git pull`은 원격 저장소의 변경 내용을 로컬 저장소에 가져와 병합한다.
  • `git branch`는 브랜치를 관리한다.
  • `git merge`는 브랜치를 병합한다.
  • `git log`는 커밋 기록을 확인한다.


명령어실행비고
git branch현재 브랜치 이름
git pullgit fetch + git mergegit diff 생략
git logcommit list (history)종료(나가기) q
git show최근 커밋 정보git show [로그 일련번호]



일반적인 개발 스타일에서는 대략적으로 다음과 같은 단계를 반복하여 작업이 진행된다.

1. 원격 서버 등에 있는 중심 저장소를 로컬에 복제한다 (git clone).

2. 로컬에서 콘텐츠를 수정, 추가, 삭제하고 로컬 저장소에 변경 이력을 기록한다 (git commit). 필요에 따라 과거 상태를 열람하거나 복원하는 등의 작업을 수행한다. 경우에 따라 이 단계를 여러 번 반복한다.

3. 로컬의 변경 내용을 중심 저장소에 반영한다 (git push). 작업자 간의 변경 내용이 충돌하는 경우도 있다. Git이 자동으로 해결할 수 있는 경우도 있고, 수동으로 해결(git merge)해야 하는 경우도 있다.

4. 업데이트된 중심 저장소(다른 사용자의 작업 내용도 통합됨)를 로컬 복제본에도 반영한다 (git pull). 이를 통해 로컬 환경의 코드도 최신 내용이 되므로, 다시 단계 2의 작업을 수행한다.

4. 2. 브랜치 모델

Git은 다양한 브랜치 모델을 지원한다. 그 중 대표적인 모델은 GitHub flow이다.

GitHub flow는 "master 브랜치는 항상 배포 가능"이라는 원칙을 기반으로 하는 간단한 브랜치 모델이다.[160] 코드 변경 시에는 `master`에서 토픽 브랜치를 생성하고, 풀 리퀘스트(pull request)를 통해 변경 사항을 검토하고 병합한다. 자동화 테스트(지속적 통합)를 통해 `master` 브랜치의 안정성을 유지한다. GitHub flow는 지속적 전달 및 지속적 배포가 적용되는 웹 서비스 개발에 적합하다.

GitHub flow는 처음 제안되었을 때와 비교하여 일부 변경되었다. 원래는 `master`로 병합된 후 배포되었지만, 현재는 리뷰 및 CI 후의 토픽 브랜치를 프로덕션 환경에 배포하여 테스트를 진행하고, 문제가 없을 경우 `master`로 병합한다.[161] 이러한 변경으로 CI에서 발견되지 않은 버그가 발생했을 때 `master`를 롤백하는 대신 재배포하여 대응할 수 있다.

4. 3. 병합 전략

Git은 여러 병합 전략을 구현하며, 병합 시 기본이 아닌 전략을 선택할 수 있다.[45]

  • '''resolve''': 전통적인 3방향 병합 알고리즘이다.
  • '''recursive''': 3-way 병합 알고리즘의 변형이며, 하나의 브랜치를 풀(pull)하거나 병합할 때 기본값이다. 리누스 토르발스영어[46]는 3-way 병합에 사용할 수 있는 공통 조상이 둘 이상일 경우, 공통 조상의 병합된 트리를 생성하고 이를 3-way 병합의 참조 트리로 사용한다고 하였다. 이는 Linux 커널 2.6 개발 기록에서 가져온 이전 병합 커밋에 대한 테스트를 통해 잘못된 병합을 일으키지 않으면서 병합 충돌을 줄이는 것으로 보고되었다. 또한, 이름 변경이 포함된 병합을 감지하고 처리할 수 있다.
  • '''octopus''': 둘 이상의 헤드를 병합할 때 기본값이다.

5. 인터페이스

깃은 명령 프롬프트를 갖는 터미널 인터페이스 또는 콘솔 인터페이스를 통해 사용할 수 있으며, 이는 GUI 버전이나 웹 인터페이스와 함께 깃 서버에 접속하는 깃 클라이언트이다. GNU nano나 Vim 같은 편집기를 포함한다. 콘솔은 윈도우 터미널이나 형태의 Bash를 사용한다.

보안을 위해 OpenSSL이나 윈도우즈 보안 채널 라이브러리를 사용한다. Git Bash의 경우 MinTTY를 기본 터미널 에뮬레이터로 사용한다.[181][182][183]

깃은 다양한 웹 인터페이스를 제공한다. 다음은 깃을 위한 웹 인터페이스의 예시이다.

이름설명
https://git.zx2c4.com/cgit CgitC로 작성된 깃 저장소용 웹 프론트엔드이다.
https://web.archive.org/web/20170812111934/https://git.wiki.kernel.org/index.php/Gitweb Gitweb로 작성된 깃 프론트엔드이다.
https://gogs.io/ Gogs인증, 이슈 핸들링, 포크 등의 수많은 기능이 포함된 깃 프론트엔드이다. Go로 작성되었다.
https://gitea.io GiteaGogs의 포크이다.
https://web.archive.org/web/20180611002904/https://github.com/klaussilveira/gitlist GitlistPhp로 작성되었으며 부트스트랩 프레임워크를 사용하는 깃 저장소 뷰어이다.



commit diff를 보여주는 깃웹 인터페이스의 스크린샷.

5. 1. GUI

깃은 여러 GUI를 지원하는 것이 특징이다. 현재 소스트리, GitHub Desktop 등의 여러 GUI를 사용할 수 있다.[1]

Git GUI 클라이언트는 Git 저장소와의 상호 작용을 단순화하기 위해 그래픽 사용자 인터페이스(GUI)를 제공한다.[1] 이러한 GUI는 분기, 커밋, 파일 변경을 포함한 프로젝트 기록을 시각적으로 보여준다.[1] 또한 변경 사항 스테이징, 커밋 생성, 분기 관리와 같은 작업을 간소화하며, 시각적 차이 도구는 동시 개발로 인해 발생하는 병합 충돌을 해결하는 데 도움을 준다.[1]

Git에는 Tcl/Tk GUI가 함께 제공되어 사용자가 커밋 생성 및 수정, 분기 생성 및 병합, 원격 저장소와의 상호 작용과 같은 작업을 수행할 수 있다.[1] 공식 GUI 외에도 Git과 함께 배포되는 공식 GUI와 유사한 기능을 제공하는 많은 타사 인터페이스가 존재한다.[1]

GUI 클라이언트는 Git을 배우고 사용하기 쉽게 만들어 워크플로우 효율성을 개선하고 오류를 줄인다.[1]

5. 2. 웹 인터페이스

깃은 다양한 웹 인터페이스를 제공한다. 다음은 깃을 위한 웹 인터페이스의 예시이다.

5. 3. 터미널 인터페이스

깃은 명령 프롬프트를 갖는 터미널 인터페이스 또는 콘솔 인터페이스를 통해 사용할 수 있으며, 이는 GUI 버전이나 웹 인터페이스와 함께 깃 서버에 접속하는 깃 클라이언트이다. GNU nano나 Vim 같은 편집기를 포함한다. 콘솔은 윈도우 터미널이나 형태의 Bash를 사용한다.

보안을 위해 OpenSSL이나 윈도우즈 보안 채널 라이브러리를 사용한다.

Git Bash의 경우 MinTTY를 기본 터미널 에뮬레이터로 사용한다.[181][182][183]

6. 구현체

깃은 다양한 프로그래밍 언어로 구현되었다. 주요 구현체는 C로 작성되었으며, 리눅스뿐만 아니라 BSD (DragonFly BSD, FreeBSD, NetBSD, OpenBSD), 솔라리스, macOS, Windows 등 대부분의 주요 운영 체제를 지원한다.[56][57]

다른 구현체는 다음과 같다.

구현체설명
JGit모든 Java 애플리케이션에 포함되도록 설계된 순수 자바 소프트웨어 라이브러리이다. Gerrit 코드 검토 도구와 Eclipse IDE용 Git 클라이언트인 EGit에서 사용된다.[60]
Go-git순수 Go로 작성된 오픈 소스 구현이다.[61]
DulwichCPython 3.6 이상 및 Pypy를 지원하는 순수 Python으로 작성된 Git 구현이다.[64]
libgit2Windows, Linux, macOS 및 BSD를 포함한 여러 플랫폼에서 빌드할 수 있는 ANSI C 소프트웨어 라이브러리이다. 루비, Python, Haskell을 포함한 많은 프로그래밍 언어에 대한 바인딩이 있다.[65][66][67][68]
JS-GitGit의 하위 집합을 구현한 JavaScript이다.[69]
GameOfTreesOpenBSD 프로젝트를 위한 Git의 오픈 소스 구현이다.[70]


7. 깃 서버



Git은 분산 버전 관리 시스템이므로 서버 없이도 사용할 수 있지만, 협업을 위해서는 깃 서버가 필요하다. Git은 Git 프로토콜을 통해 실행되는 간단한 TCP 서버를 시작하는 내장 명령어 `git daemon`을 제공한다.[71] 전용 Git HTTP 서버는 접근 제어를 추가하고, 웹 인터페이스를 통해 Git 저장소의 내용을 보여주며, 여러 저장소를 관리하는 기능을 제공한다. 기존 Git 저장소는 복제 및 공유되어 다른 사용자들이 중앙 집중식 저장소로 사용할 수 있다. 또한 Git 소프트웨어가 설치되어 있고 사용자가 로그인할 수 있으면 원격 셸을 통해서도 접근할 수 있다.[72] Git 서버는 일반적으로 TCP 포트 9418을 사용한다.[73]

7. 1. 오픈 소스 깃 서버

Git은 분산 버전 관리 시스템이므로 자체를 서버로 사용할 수 있다. Git은 Git 프로토콜에서 실행되는 간단한 TCP 서버를 시작하는 내장 명령어 `git daemon`을 함께 제공한다.[71] 전용 Git HTTP 서버는 접근 제어를 추가하고, 웹 인터페이스를 통해 Git 저장소의 내용을 표시하고, 여러 저장소를 관리하는 기능을 제공한다. 기존의 Git 저장소는 복제 및 공유되어 다른 사용자가 중앙 집중식 저장소로 사용할 수 있다. 또한 Git 소프트웨어가 설치되어 있고 사용자가 로그인할 수 있도록 허용하면 원격 셸을 통해 액세스할 수도 있다.[72] Git 서버는 일반적으로 TCP 포트 9418을 사용한다.[73]

  • Git 바이너리를 사용하여 Git 서버를 호스팅할 수 있다.[74]
  • 게릿은 코드 검토를 지원하고 SSH, 통합 아파치 미나 또는 OpenSSH, 통합 제티 웹 서버를 통해 접근을 제공하도록 구성할 수 있는 Git 서버이다. 게릿은 LDAP, Active Directory, OpenID, OAuth, Kerberos/GSSAPI, X509 https 클라이언트 인증서에 대한 통합을 제공한다. 게릿 3.0부터 모든 구성은 Git 저장소로 저장되며 실행하는 데 데이터베이스가 필요하지 않다. 게릿은 핵심 기능으로 풀 리퀘스트 기능을 구현했지만 이에 대한 GUI는 없다.
  • 페브리케이터는 페이스북에서 파생된 소프트웨어이다. 페이스북은 주로 머큐리얼을 사용하므로 Git 지원이 두드러지지 않는다.[75]
  • 로데코드 커뮤니티 에디션(CE)은 AGPLv3 라이선스로 Git, 머큐리얼서브버전을 지원한다.
  • 칼리테아는 GPL 라이선스로 파이썬으로 개발되었으며 Git과 머큐리얼을 모두 지원한다.
  • gitolite와 같은 외부 프로젝트는 Git 소프트웨어 위에 스크립트를 제공하여 세분화된 접근 제어를 제공한다.[76]
  • 자체 호스팅을 위한 다른 여러 FLOSS 솔루션이 있으며, 여기에는 Gogs,[77] Gogs의 포크인 Gitea 및 Gitea의 포크인 Forgejo가 포함된다. Gogs와 위에 언급된 두 파생 제품은 Go 언어를 사용하여 개발되었다. 세 솔루션 모두 MIT 라이선스로 제공된다.

7. 2. 깃 서버 서비스

Git은 분산 버전 관리 시스템이므로 자체로 서버로 사용할 수 있다.

Git 서버는 일반적으로 TCP 포트 9418을 사용한다.[73]

  • Git 바이너리를 사용하여 Git 서버를 호스팅할 수 있다.[74]
  • 게릿은 코드 검토를 지원하고 SSH, 통합 아파치 미나 또는 OpenSSH, 통합 제티 웹 서버를 통해 접근을 제공하도록 구성할 수 있는 Git 서버이다.
  • 페브리케이터는 페이스북에서 파생된 소프트웨어이다.
  • 로데코드 커뮤니티 에디션(CE)은 AGPLv3 라이선스로 Git, 머큐리얼서브버전을 지원한다.
  • 칼리테아는 GPL 라이선스로 파이썬으로 개발되었으며 Git과 머큐리얼을 모두 지원한다.
  • gitolite와 같은 외부 프로젝트는 Git 소프트웨어 위에 스크립트를 제공하여 세분화된 접근 제어를 제공한다.[76]
  • 자체 호스팅을 위한 다른 여러 FLOSS 솔루션에는 Gogs,[77] Gogs의 포크인 Gitea, Gitea의 포크인 Forgejo가 포함된다.


깃허브, 소스포지, 비트버킷, 깃랩과 같이 Git 저장소를 서비스로 제공하는 곳이 많다.[78][79][80][81][82]

8. 확장

깃에는 여러 가지 ''깃 확장''이 있으며, 그중 하나인 깃 LFS는 깃허브 커뮤니티에서 깃의 확장으로 시작하여 현재 다른 저장소에서도 널리 사용되고 있다. 확장 기능은 일반적으로 다양한 사람들이 독립적으로 개발하고 유지 관리하지만, 미래에는 널리 사용되는 확장이 깃에 병합될 수 있다.

다른 오픈 소스 깃 확장으로는 다음이 있다.


  • git-annex: 깃을 기반으로 하는 분산 파일 동기화 시스템
  • git-flow: Vincent Driessen의 브랜칭 모델을 위한 상위 수준의 저장소 작업을 제공하는 깃 확장 집합
  • git-machete: 리베이스/병합/풀/푸시 작업을 자동화하기 위한 저장소 정리 및 도구


마이크로소프트는 2017년 Perforce에서 마이그레이션의 일환으로 Windows 소스 코드 트리의 크기를 처리하기 위해 Virtual File System for Git(VFS for Git, 이전 Git Virtual File System 또는 GVFS) 확장을 개발했다. VFS for Git을 사용하면 클론된 저장소가 파일에 액세스할 때만 내용이 다운로드되는 자리 표시자를 사용할 수 있다.

9. 보안

깃은 자체적인 접근 제어 메커니즘을 제공하지 않지만, 접근 제어를 전문으로 하는 다른 도구와 함께 작동하도록 설계되었다.[106]

2014년 12월 17일, 깃 클라이언트의 윈도우 및 macOS 버전에 영향을 미치는 익스플로잇이 발견되었다. 공격자는 악성 깃 트리(디렉토리)를 생성하여 깃이 설치된 대상 컴퓨터에서 임의 코드 실행을 수행할 수 있었다. 이 트리는 깃 저장소의 모든 데이터를 저장하는 깃 저장소의 디렉토리인 ''.git''(소문자 ''.git'' 버전은 수동으로 생성할 수 없도록 깃에서 허용하지 않기 때문에 .GIT 또는 .Git과 같이 대소문자를 다르게 사용해야 함)로 이름이 지정되었으며, 공격자가 만든 저장소 또는 공격자가 수정할 수 있는 저장소의 ''.git/hooks'' 하위 디렉토리(깃이 실행하는 실행 파일 폴더)에 악성 파일이 포함되어 있었다. 윈도우 또는 Mac 사용자가 악성 디렉토리가 있는 저장소의 버전을 ''풀''(다운로드)한 다음 해당 디렉토리로 전환하면 .git 디렉토리가 덮어쓰여지고 (윈도우 및 Mac 파일 시스템의 대소문자를 구분하지 않는 특성으로 인해) ''.git/hooks''의 악성 실행 파일이 실행되어 공격자의 명령이 실행될 수 있었다. 또한 공격자는 ''.git/config'' 구성 파일을 수정하여 악성 깃 별칭(깃 명령 또는 외부 명령에 대한 별칭)을 생성하거나 기존 별칭을 수정하여 실행 시 악성 명령을 실행할 수 있었다. 이 취약점은 2014년 12월 17일에 출시된 깃 버전 2.2.1에서 패치되었으며, 다음 날 발표되었다.[107][108]

2015년 9월 29일에 출시된 깃 버전 2.6.1에는 임의 코드 실행을 허용하는 보안 취약점(CVE-2015-7545)에 대한 패치가 포함되었다.[109][110] 이 취약점은 공격자가 피해자를 설득하여 특정 URL을 복제하도록 할 수 있는 경우 악용될 수 있었는데, 임의의 명령이 URL 자체에 내장되었기 때문이다.[111] 공격자는 연결이 암호화되지 않은 경우 중간자 공격을 통해 익스플로잇을 사용할 수 있었으며,[111] 사용자를 원하는 URL로 리디렉션할 수 있었다. 재귀적 복제도 취약했는데, gitmodules 파일을 통해 저장소 제어자가 임의의 URL을 지정할 수 있었기 때문이다.[111]

깃은 내부적으로 SHA-1 해시를 사용한다. 리누스 토르발스는 이 해시가 주로 우발적인 손상을 방지하기 위한 것이며, 암호학적으로 안전한 해시가 제공하는 보안은 우발적인 부작용일 뿐이며, 주요 보안은 다른 곳에서의 디지털 서명이라고 응답했다.[112][113] 2017년 깃에 대한 SHAttered 공격 시연 이후, 깃은 이 공격에 대한 저항력이 있는 SHA-1 변형을 사용하도록 수정되었다. 2020년 2월부터 해시 함수 전환 계획이 작성되고 있다.[114]

10. 채택 현황

이클립스 재단의 연례 커뮤니티 설문조사에 따르면, 깃은 가장 널리 사용되는 소스 코드 관리 도구이며, 전문 소프트웨어 개발자의 42.9%가 깃을 주요 소스 제어 시스템으로 사용한다고 보고되었다.[85] 이는 2013년 36.3%, 2012년 32%에 비해 증가한 수치이다. 깃 사용에 깃허브를 제외한 응답은 2014년 33.3%, 2013년 30.3%, 2012년 27.6%, 2011년 12.8%로 나타났다.[86] 오픈 허브도 오픈 소스 프로젝트에서 비슷한 채택률을 보고하고 있다.[87]

Stack Overflow는 2015년, 2017년, 2018년 및 2022년에 연례 개발자 설문조사에 버전 관리를 포함시켰다.[88] 깃은 이러한 설문조사에서 압도적인 선호도를 보였으며, 2022년에는 93.9%에 달하는 응답률을 기록했다.

응답한 개발자가 사용한 버전 관리 시스템은 다음과 같다.

이름2015201720182022
69.3%69.2%87.2%93.9%
서브버전36.9%9.1%16.1%5.2%
TFVC12.2%7.3%10.9%
머큐리얼7.9%1.9%3.6%1.1%
CVS4.2%
퍼포스3.3%
VSS0.6%
IBM 데브옵스 코드 클리어케이스0.4%
Zip 파일 백업2.0%7.9%
원시 네트워크 공유1.7%7.9%
기타5.8%3.0%
없음9.3%4.8%4.8%4.3%



영국 IT 채용 정보 웹사이트 itjobswatch.co.uk는 2016년 9월 말 현재 영국 영구 소프트웨어 개발 직업 공고의 29.27%가 깃을 언급했으며,[93] 이는 팀 파운데이션 서버의 12.17%,[94] 서브버전의 10.60%,[95] 머큐리얼의 1.30%,[96] 비주얼 소스세이프의 0.48%보다 높은 수치이다.[97]

11. 컨벤션


  • `git init` 명령어는 "master"라는 이름의 브랜치를 생성한다.[99] 이 브랜치는 변경 사항을 병합하는 통합 브랜치로 사용되는 경우가 많다.[100] 기본 업스트림 리모트가 "origin"으로 지정되어 있으므로, 기본 리모트 브랜치는 "origin/master"이다. GitHub 및 GitLab과 같은 일부 도구는 대신 "main"이라는 이름의 기본 브랜치를 생성한다.[101][102]
  • 일반적으로 푸시된 커밋은 덮어쓰지 않고, 이전 커밋을 되돌리는 다른 변경 사항을 커밋하여 "되돌려진다".[103]
  • "git-flow"[104] 워크플로우 및 명명 규칙은 기능별 불안정 이력(feature/*), 불안정 공유 이력(develop), 프로덕션 준비 이력(main) 및 릴리스된 제품에 대한 긴급 패치(hotfix)를 구분하기 위해 자주 채택된다.
  • "풀 리퀘스트"(pull request), 일명 "병합 요청"(merge request)은 사용자가 브랜치를 다른 브랜치로 병합하도록 요청하는 것이다.[105] Git 자체는 풀 리퀘스트를 제공하지 않지만, Git 클라우드 서비스의 일반적인 기능이다.

참조

[1] 웹사이트 Initial revision of "git", the information manager from hell https://github.com/g[...] GitHub 2015-12-20
[2] 웹사이트 Commit Graph https://github.com/g[...] GitHub 2015-12-19
[3] 웹사이트 Git website https://git-scm.com/[...] 2022-06-09
[4] 웹사이트 Git Source Code Mirror https://github.com/g[...] 2022-06-09
[5] 웹사이트 Git's LGPL license at github.com https://github.com/g[...] 2014-10-12
[6] 웹사이트 Git's GPL license at github.com https://github.com/g[...] 2014-10-12
[7] 웹사이트 Tech Talk: Linus Torvalds on git (at 00:01:30) https://www.youtube.[...] 2014-07-20
[8] 간행물 Re: Kernel SCM saga... https://marc.info/?l[...] 2017-02-03
[9] 간행물 Re: fatal: serious inflate inconsistency https://marc.info/?l[...] 2007-06-10
[10] AV media Google tech talk: Linus Torvalds on git https://www.youtube.[...] 2007-05-16
[11] 서적 Pro Git https://git-scm.com/[...] Apress 2014-12-24
[12] 서적 Pro Git https://git-scm.com/[...] Apress 2015-12-26
[13] 웹사이트 Enterprise repo wars: GitHub vs. GitLab vs. Bitbucket https://www.infoworl[...] 2020-02-02
[14] 뉴스 A Git Origin Story https://www.linuxjou[...] Linux Journal 2020-05-28
[15] 웹사이트 BitKeeper and Linux: The end of the road? https://www.linux.co[...] 2023-05-18
[16] 뉴스 Linus Torvalds' BitKeeper blunder http://www.infoworld[...] 2015-09-08
[17] 간행물 Re: Trivia: When did git self-host? https://marc.info/?l[...] 2007-02-27
[18] 간행물 Kernel SCM saga.. https://marc.info/?l[...] 2005-04-06
[19] 간행물 First ever real kernel git merge! https://marc.info/?l[...] 2005-04-17
[20] 간행물 Mercurial 0.4b vs git patchbomb benchmark https://marc.info/?l[...] 2005-04-29
[21] 간행물 Linux 2.6.12 https://marc.info/?l[...] 2005-06-17
[22] 간행물 Meet the new maintainer.. https://marc.info/?l[...] 2005-07-27
[23] 간행물 Announce: Git 1.0.0 https://marc.info/?l[...] 2005-12-21
[24] 웹사이트 GitFaq: Why the 'Git' name? https://git.wiki.ker[...] Git.or.cz 2012-07-14
[25] 웹사이트 After controversy, Torvalds begins work on 'git' http://www.pcworld.i[...] 2012-07-14
[26] 웹사이트 git(1) Manual Page https://git-scm.com/[...] 2012-07-21
[27] 웹사이트 Initial revision of 'git', the information manager from hell · git/git@e83c516 https://github.com/g[...] 2016-01-21
[28] 웹사이트 Git – Distributed Workflows https://git-scm.com/[...] 2020-06-15
[29] 웹사이트 What is Version Control Tool? Explore Git and GitHub https://medium.com/a[...] 2020-10-25
[30] 간행물 Re: VCS comparison table https://marc.info/?l[...] 2006-10-19
[31] 웹사이트 bzr/hg/git performance http://weblogs.mozil[...] 2015-02-12
[32] 웹사이트 Oh what a relief it is http://digitalvampir[...] 2006-11-13
[33] 웹사이트 Trust https://www.kernel.o[...] Git User's Manual 2006-10-18
[34] 간행물 Re: VCS comparison table https://marc.info/?l[...] 2009-04-10
[35] 웹사이트 Git rocks! https://lwn.net/Arti[...] 2005-12-22
[36] 웹사이트 Git – Git SCM Wiki https://git.wiki.ker[...] 2020-10-25
[37] 웹사이트 Git User's Manual https://mirrors.edge[...] 2020-03-10
[38] 웹사이트 Git – Packfiles https://git-scm.com/[...]
[39] 간행물 Re: more git updates.. https://marc.info/?l[...] 2005-04-10
[40] 간행물 how to speed up 'git log'? https://marc.info/?l[...] 2007-02-11
[41] 간행물 Re: impure renames / history tracking https://marc.info/?l[...] 2006-03-01
[42] 간행물 Re: Errors GITtifying GCC and Binutils https://marc.info/?l[...] 2006-03-24
[43] 간행물 Re: Errors GITtifying GCC and Binutils https://marc.info/?l[...] 2006-03-23
[44] 간행물 Re: git and bzr https://marc.info/?l[...] 2006-11-28
[45] 웹사이트 git-merge(1) https://www.kernel.o[...] 2007-07-18
[46] 웹사이트 CrissCrossMerge http://revctrl.org/C[...] 2007-07-18
[47] 간행물 Re: more git updates... https://marc.info/?l[...] 2005-04-10
[48] 간행물 Re: Errors GITtifying GCC and Binutils https://marc.info/?l[...] 2006-03-23
[49] 웹사이트 Git – Git Objects https://git-scm.com/[...]
[50] 웹사이트 Git – Git References https://git-scm.com/[...]
[51] 웹사이트 Git Cheat Sheet https://education.gi[...] 2024-06-10
[52] 웹사이트 Git Tutorial https://web.stanford[...] 2024-06-10
[53] 웹사이트 Git Quick Intro https://data-skills.[...] 2024-06-10
[54] 웹사이트 Best practices for uploading to GitHub https://journalismco[...] 2024-06-10
[55] 웹사이트 Project Configuration File Format https://gerrit-revie[...] 2020-02-02
[56] 웹사이트 downloads https://git-scm.com/[...] 2012-05-14
[57] 웹사이트 git package versions – Repology https://repology.org[...] 2021-11-30
[58] 웹사이트 msysGit https://github.com/m[...] 2016-09-20
[59] 웹사이트 Git – Downloading Package https://git-scm.com/[...]
[60] 웹사이트 JGit https://www.eclipse.[...] 2012-08-24
[61] 웹사이트 Git – go-git https://git-scm.com/[...] 2019-04-19
[62] citation SQL interface to Git repositories, written in Go. https://github.com/s[...] 2019-04-19
[63] 웹사이트 Keybase launches encrypted git https://keybase.io/b[...] 2019-04-19
[64] 웹사이트 Dulwich GitHub Repository README.md https://github.com/j[...] 2024-04-29
[65] 웹사이트 libgit2 https://github.com/l[...] 2012-08-24
[66] 웹사이트 rugged https://github.com/l[...] 2012-08-24
[67] 웹사이트 pygit2 https://github.com/l[...] 2012-08-24
[68] 웹사이트 hlibgit2 https://hackage.hask[...] 2013-04-30
[69] 웹사이트 js-git: a JavaScript implementation of Git https://github.com/c[...] 2013-08-13
[70] 웹사이트 Game of Trees https://gameoftrees.[...] 2024-03-10
[71] 웹사이트 Git – Git Daemon https://git-scm.com/[...] 2019-07-10
[72] 웹사이트 4.4 Git on the Server – Setting Up the Server https://git-scm.com/[...] 2014-10-22
[73] 웹사이트 1.4 Getting Started – Installing Git https://git-scm.com/[...] Git 2013-11-01
[74] 서적 Pro Git Apress
[75] 웹사이트 Diffusion User Guide: Repository Hosting https://secure.phabr[...] 2020-09-20
[76] 웹사이트 Gitolite: Hosting Git Repositories https://gitolite.com[...]
[77] 웹사이트 Gogs: A painless self-hosted Git service https://gogs.io/
[78] 웹사이트 Highlights from Git 2.26 https://github.blog/[...] 2020-11-25
[79] 웹사이트 github.com Competitive Analysis, Marketing Mix and Traffic https://www.alexa.co[...] 2020-02-02
[80] 웹사이트 sourceforge.net Competitive Analysis, Marketing Mix and Traffic https://www.alexa.co[...] 2020-02-02
[81] 웹사이트 bitbucket.org Competitive Analysis, Marketing Mix and Traffic https://www.alexa.co[...] 2020-02-02
[82] 웹사이트 gitlab.com Competitive Analysis, Marketing Mix and Traffic https://www.alexa.co[...] 2020-02-02
[83] 웹사이트 Git - git-gui Documentation https://git-scm.com/[...] 2024-07-01
[84] 웹사이트 Git - GUI Clients https://git-scm.com/[...] 2024-07-01
[85] 웹사이트 Eclipse Community Survey 2014 results | Ian Skerrett https://ianskerrett.[...] Ianskerrett.wordpress.com 2014-06-23
[86] 웹사이트 Results of Eclipse Community Survey 2012 https://eclipse.org/[...] eclipse.org
[87] 웹사이트 Compare Repositories – Open Hub https://www.openhub.[...]
[88] 웹사이트 Stack Overflow Annual Developer Survey https://insights.sta[...] Stack Exchange, Inc. 2020-01-09
[89] 웹사이트 Stack Overflow Developer Survey 2015 https://insights.sta[...] Stack Overflow 2019-05-29
[90] 웹사이트 Stack Overflow Developer Survey 2017 https://insights.sta[...] Stack Overflow 2019-05-29
[91] 웹사이트 Stack Overflow Developer Survey 2018 https://insights.sta[...] Stack Overflow 2019-05-29
[92] 웹사이트 Stack Overflow Developer Survey 2022 https://survey.stack[...] 2022-08-04
[93] 웹사이트 Git (software) Jobs, Average Salary for Git Distributed Version Control System Skills https://www.itjobswa[...] Itjobswatch.co.uk 2016-09-30
[94] 웹사이트 Team Foundation Server Jobs, Average Salary for Microsoft Team Foundation Server (TFS) Skills https://www.itjobswa[...] Itjobswatch.co.uk 2016-09-30
[95] 웹사이트 Subversion Jobs, Average Salary for Apache Subversion (SVN) Skills https://www.itjobswa[...] Itjobswatch.co.uk 2016-09-30
[96] 웹사이트 Mercurial Jobs, Average Salary for Mercurial Skills https://www.itjobswa[...] Itjobswatch.co.uk 2016-09-30
[97] 웹사이트 VSS/SourceSafe Jobs, Average Salary for Microsoft Visual SourceSafe (VSS) Skills https://www.itjobswa[...] Itjobswatch.co.uk 2016-09-30
[98] 웹사이트 Windows switch to Git almost complete: 8,500 commits and 1,760 builds each day https://arstechnica.[...] 2017-05-24
[99] 웹사이트 git-init https://git-scm.com/[...]
[100] 웹사이트 Git – Branches in a Nutshell https://git-scm.com/[...] 2020-06-15
[101] Citation github/renaming https://github.com/g[...] GitHub 2020-12-04
[102] Citation Default branch name for new repositories now main https://about.gitlab[...] GitLab 2021-06-22
[103] 웹사이트 Git Revert {{!}} Atlassian Git Tutorial https://www.atlassia[...]
[104] 웹사이트 Gitflow Workflow {{!}} Atlassian Git Tutorial https://www.atlassia[...] 2020-06-15
[105] 웹사이트 Forking Workflow {{!}} Atlassian Git Tutorial https://www.atlassia[...] 2020-06-15
[106] 웹사이트 Git repository access control https://wincent.com/[...] 2016-09-06
[107] 웹사이트 Securing your Git server against CVE-2014-9390 https://developer.at[...] 2014-12-20
[108] 뉴스 '[Announce] Git v2.2.1 (and updates to older maintenance tracks)' https://article.gman[...] 2014-12-18
[109] 웹사이트 CVE-2015-7545 https://people.canon[...] 2015-12-15
[110] 웹사이트 Git 2.6.1 https://github.com/g[...] 2015-09-29
[111] 웹사이트 Re: CVE Request: git http://seclists.org/[...] 2015-10-05
[112] 웹사이트 'hash – How safe are signed git tags? Only as safe as SHA-1 or somehow safer?' https://security.sta[...] Information Security Stack Exchange 2014-09-22
[113] 웹사이트 Why does Git use a cryptographic hash function? https://stackoverflo[...] Stack Overflow 2015-03-01
[114] 웹사이트 Git – hash-function-transition Documentation https://git-scm.com/[...]
[115] video Tech Talk: Linus Torvalds on git https://www.youtube.[...] 2007-05-15
[116] 웹사이트 Git - IT用語辞典e-words http://e-words.jp/w/[...] 2014-07-29
[117] 웹사이트 Gitとは https://www.idcf.jp/[...] クラウド・データセンター用語集/IDCフロンティア 2024-08-04
[118] 웹사이트 入門Git (ギット) https://books.google[...] Google Books 2024-08-04
[119] 문서 LKML.ORG - the Linux Kernel Mailing List Archive https://lkml.org
[120] 서적 Pro Git https://git-scm.com/[...] 2021-03-07
[121] 웹사이트 4.1 Git サーバー - プロトコル https://git-scm.com/[...] 2013-01-19
[122] 웹사이트 Pro Git 2nd Edition 4.6 Gitサーバー - Smart HTTP https://git-scm.com/[...] 2021-08-26
[123] 웹사이트 Git - user-manual Documentation https://git-scm.com/[...] 2021-08-26
[124] 웹사이트 git-clone(1) Manual Page https://git-scm.com/[...] 2017-06-14
[125] 웹사이트 Documentation/RelNotes/2.8.0.txt https://github.com/g[...] 2017-06-14
[126] 간행물 Re: [ANNOUNCE] Git wiki http://marc.info/?l=[...] 2006-05-05
[127] 간행물 Re: Kernel SCM saga http://lkml.org/lkml[...] 2005-04-07
[128] 간행물 Re: Kernel SCM saga http://marc.info/?l=[...] 2005-04-08
[129] 간행물 Re: Errors GITtifying GCC and Binutils http://marc.info/?l=[...] 2006-03-23
[130] 간행물 Re: VCS comparison table http://marc.info/?l=[...] 2006-10-19
[131] 간행물 bzr/hg/git performance http://weblogs.mozil[...] 2006-11-30
[132] 웹사이트 Oh what a relief it is http://digitalvampir[...] 2006-11-13
[133] 간행물 Re: VCS comparison table http://marc.info/?l=[...] 2006-10-18
[134] 웹사이트 Git rocks! http://lwn.net/Artic[...] 2005-12-22
[135] 웹사이트 Git User's Manual http://www.kernel.or[...] 2007-08-05
[136] 간행물 Re: more git updates.. http://marc.info/?l=[...] 2005-04-10
[137] 간행물 how to speed up "git log"? http://marc.info/?l=[...] 2007-02-11
[138] 간행물 Re: impure renames / history tracking http://marc.info/?l=[...] 2006-03-01
[139] 간행물 Re: Errors GITtifying GCC and Binutils http://marc.info/?l=[...] 2006-03-24
[140] 간행물 Re: Errors GITtifying GCC and Binutils http://marc.info/?l=[...] 2006-03-23
[141] Mailing list Re: git and bzr http://marc.info/?l=[...] 2009-03-03
[142] 웹사이트 git-merge(1) http://www.kernel.or[...] 2009-03-04
[143] 웹사이트 CrissCrossMerge http://revctrl.org/C[...] 2009-03-04
[144] 간행물 After controversy, Torvalds begins work on git http://www.infoworld[...] 2008-02-20
[145] 웹사이트 GitFaq: Why the 'git' name? http://git.or.cz/git[...] 2007-03-21
[146] 간행물 How Tridge reverse engineered BitKeeper http://lwn.net/Artic[...] 2009-03-26
[147] Mailing list Re: Kernel SCM saga.. http://marc.info/?l=[...] 2009-03-26
[148] 문서 ここでは [[mmツリー|-mm ツリー]]メンテナの[[アンドリュー・モートン]]を指す。
[149] Mailing list Re: git versus CVS (versus bk) http://marc.info/?l=[...] 2009-03-26
[150] 영상 Google tech talk: Linus Torvalds on git https://www.youtube.[...] 2007-05-16
[151] Mailing list Re: fatal: serious inflate inconsistency http://marc.info/?l=[...] 2009-03-26
[152] Mailing list Re: Trivia: When did git self-host? http://marc.info/?l=[...] 2009-03-26
[153] Mailing list Kernel SCM saga.. http://marc.info/?l=[...] 2009-03-26
[154] Mailing list First ever real kernel git merge! http://marc.info/?l=[...] 2009-03-26
[155] Mailing list Mercurial 0.4b vs git patchbomb benchmark http://marc.info/?l=[...] 2009-03-26
[156] Mailing list Linux 2.6.12 http://marc.info/?l=[...] 2009-03-26
[157] Mailing list Re: VCS comparison table http://marc.info/?l=[...] 2009-03-26
[158] Mailing list Meet the new maintainer... http://marc.info/?l=[...] 2009-03-26
[159] Mailing list ANNOUNCE: GIT 1.0.0 http://marc.info/?l=[...] 2009-03-26
[160] 웹사이트 GitHub Flow https://scottchacon.[...] 2020-05-31
[161] 웹사이트 GitHub Guides https://guides.githu[...] 2020-05-31
[162] 문서 git-merge - git https://git-scm.com/[...]
[163] 웹인용 Initial revision of "git", the information manager from hell https://github.com/g[...] Github 2015-12-20
[164] 웹인용 Commit Graph https://github.com/g[...] Github 2015-12-19
[165] 웹인용 Git Source Code Mirror https://github.com/g[...] 2017-01-01
[166] 문서 https://github.com/
[167] 서적 Effective Computation in Physics https://books.google[...] O'Reilly Media, Inc. 2016-04-20
[168] Mailing list Re: Kernel SCM saga.. https://marc.info/?l[...] 2005-04-07
[169] Mailing list Re: fatal: serious inflate inconsistency https://marc.info/?l[...] 2007-06-10
[170] 영상 Google tech talk: Linus Torvalds on git https://www.youtube.[...] 2007-05-16
[171] 서적 Pro Git https://git-scm.com/[...] Apress 2014
[172] 서적 Pro Git https://git-scm.com/[...] Apress 2014-12-24
[173] 웹인용 BitKeeper and Linux: The end of the road? https://www.linux.co[...] 2017-05-19
[174] Mailing list Re: Trivia: When did git self-host? https://marc.info/?l[...] 2007-02-27
[175] Mailing list Kernel SCM saga.. https://marc.info/?l[...] 2005-04-06
[176] 메일링 First ever real kernel git merge! https://marc.info/?l[...] 2005-04-17
[177] 메일링 Mercurial 0.4b vs git patchbomb benchmark https://marc.info/?l[...] 2005-04-29
[178] 메일링 Linux 2.6.12 https://marc.info/?l[...] 2005-06-17
[179] 메일링 Meet the new maintainer... https://marc.info/?l[...] 2005-07-27
[180] 메일링 Announce: Git 1.0.0 https://marc.info/?l[...] 2005-12-21
[181] 문서 git-The simple guide http://rogerdudler.g[...]
[182] 웹사이트 https://git-scm.com/
[183] 웹사이트 완전초보를위한깃허브 https://nolboo.kim/b[...]
[184] 서적 Reference Manual -Git ,Pro Git book -written by Scott Chacon and Ben Straub and published by Apress, Creative Commons Attribution Non Commercial Share Alike 3.0 license. Free Online and Print versions-Amazon.com https://git-scm.com/[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com