Git은 어떻게 설계 되었습니까?


9

내 직장은 최근에 Git으로 전환했고 나는 그것을 좋아하고 싫어했습니다. 나는 정말로 그것을 좋아하고 매우 강력합니다. 내가 싫어하는 유일한 부분은 때로는 너무 강력하다는 것입니다.

내 질문은 ... Git어떻게 디자인 되었습니까? 짧은 시간 동안 만 사용하면 다른 버전 제어 시스템으로는 불가능했던 많은 모호한 워크 플로우를 처리 할 수 ​​있다는 느낌을받습니다. 그러나 아래도 우아하게 느껴집니다. 그리고 빨리!

이것은 리누스의 재능에 부분적으로 의심의 여지가 없습니다. 그러나 git의 전반적인 디자인이 무언가를 기반으로했는지 궁금합니다. BitKeeper에 대해 읽었지만 계정에 기술적 인 세부 정보가 표시됩니다. 압축, 그래프, 리비전 번호 제거, 분기, 스 태싱, 리모컨 강조 ... 모두 어디서 왔습니까?

Linus는 실제로 이것을 공원 밖으로 떨어 뜨 렸고 거의 첫 번째 시도에서! 학습 곡선을 지나면 사용하는 것이 좋습니다.


아마 git IRC 채널 (#git on freenode)에 대한 도움을받을 수있을 것입니다
yati sagade


2
you get the feel that it can handle many obscure workflows that other version control systems could not: 아마도 리눅스 커널, 악명 높은 해킹, 크고 복잡한 코드를 처리하도록 설계 되었기 때문일 것입니다.
yannis

1
망할 놈의 10 주년에, 여기 토발즈와의 인터뷰에서 기사는 다음과 같습니다 linux.com/news/featured-blogs/185-jennifer-cloer/...
스리 Sarnobat

답변:


17

힘내는 진화 된 만큼 설계되지 않았다 .

혼자보세요. 공식 git 저장소를 복제하고 gitk(또는 좋아하는 그래픽 git log viewer) 열어서 가장 오래된 개정판을 살펴보십시오.

원래 핵심 기능 (오브젝트 데이터베이스 및 인덱스) 만 가지고 있음을 알 수 있습니다. 다른 모든 것은 으로 이루어 졌다 . 그러나이 작은 코어는 쉘 스크립팅을 통해 쉽게 자동화되도록 설계되었습니다. git의 초기 사용자는 일반적인 작업을 자동화하기 위해 자체 쉘 스크립트를 작성했습니다. 조금씩,이 스크립트는 git 배포판에 통합되었습니다 (초기 예제 839a7a0 참조 ). 새로운 요구가있을 때마다 스크립트가이를 허용하도록 조정되었습니다. 나중에이 스크립트 중 몇 개가 C로 다시 작성되었습니다.

깨끗하고 직교하는 코어 (필요한 경우 직접 사용할 수 있음)와 유기적으로 성장한 상층의 조합은 자식에게 힘을줍니다. 물론, 그것은 많은 이상한 이름의 명령과 옵션을 제공합니다.


압축, 그래프, 리비전 번호 제거, 분기, 스 태싱, 리모컨 강조 ... 모두 어디서 왔습니까?

처음에는 그 중 많은 부분이 없었습니다.

각 객체가 개별적으로 압축되고 이름이 지정되어 중복이 방지되었지만 git에서 보았던 높은 압축을 담당하는 "pack"파일은 존재하지 않았습니다. 처음에는 "디스크 공간이 저렴합니다"라는 철학이있었습니다.

"그래프"가와 같은 그래픽 뷰어를 의미하는 경우 gitk나중에 표시됩니다 (AFAIK, 첫 번째는 gitk). AFAIK, BitKeeper에는 그래픽 기록 뷰어도있었습니다.

버전 번호를 제거하는 것은 실제로 git의 컨텐츠 주소 지정 파일 시스템을 사용하여 객체를 저장한다는 핵심 개념은 주로 monotone 에서 온 것 입니다. 그 당시 모노톤은 느렸다. 그렇지 않은 경우 Linus가 git을 만드는 대신 사용했을 가능성이 있습니다.

각 복제본이 별도의 분기로 작동하므로 분산 버전 제어 시스템에서는 분기를 강조 할 수 없습니다.

스 태싱 ( git stash)은 IIRC입니다. 사용 된 참조 로그는 처음에는 없었습니다.

처음에는 리모컨조차 없었습니다. 원래는을 사용하여 손으로 개체를 복사했습니다 rsync.

하나씩, 이러한 각 기능은 누군가가 추가했습니다. 리누스가 모두가 아니었을 수도 있습니다. 누구나 git이 충족하지 못하는 필요성을 느낄 때마다 git의 핵심 "배관"레이어에 새로운 기능을 생성하여 포함하도록 제안 할 수 있습니다. 그것이 좋으면 git의 유틸리티 (및 명령 줄 복잡성)를 더욱 향상시켜 받아 들일 것입니다.


"AFAIK, BitKeeper에는 그래픽 기록 뷰어도있었습니다." 그렇습니다. 정확히 예쁘지는 않지만 기능이 뛰어납니다. bitkeeper.com/Test.Using.Looking.html을 참조하십시오 .하지만 분기를 표시하는 방법을 잘 보여줍니다.
Bryan Oakley

1
또한 흥미로운 읽기, git의 시작 부분에서 선택된 이메일 중 일부는 초기 진화의 일부를 보여줍니다. kerneltrap.org/node/4982
CesarB

프로그래머는 cvs + rsync + httpd로 git의 일부 기능을 에뮬레이트하는 데 사용 했습니까? 어떤 수제 솔루션이 가능한지 듣고 싶습니다.
Sridhar Sarnobat

8

요점은 단순히 자식이 지구상에서 가장 유능한 사람에 의해 설계되었다는 것입니다. 저는 재능에 대해 이야기하지 않고 경험에 대해 이야기하고 있습니다. Linux 커널과 비슷한 크기와 수의 기여자를 조합하여 코드베이스를 책임지고 다른 사람들이 실제로 대부분의 통합을 다루고있는 사람이있을 것입니다. 스스로 일하십시오.

따라서 Linus는 분산 버전 제어 시스템의 요구 사항과 사용 사례를 다른 누구보다 잘 알고있었습니다. 물론 그가 다루고있는 코딩의 대부분이 C로 이루어졌으며 대부분의 성능이 중요했습니다.

기본적으로 그것은 자신의 가려움증을 긁는 궁극적 인 예입니다.


6
"가장 자격있는 싱글"? 나는 그렇게 생각하지 않습니다. 분산 소스 제어를 작성할 자격이있는 많은 똑똑한 사람들이 있습니다. BitMover (BitKeeper 뒤의 회사)의 직원 들은 실제로 자신이하는 일을 잘 알고 있습니다. 리누스도 소스 코드 제어 방법 그를 보여주는 래리 맥보이에 신용을 제공 해야 작동합니다. 래리가 없으면 자식은 없습니다.
Bryan Oakley

1
@BryanOakley, 누군가가 누군가를 좋은 것으로 보완 할 때 강타를 피할 수 있다고 생각합니다. 모든 사람들은 요구 사항이 훌륭한 개발자가된다는 것을 알고 있습니다. 따라서 내일이면 큰 문제가 발생하면 Dennis Ritchie와 마찬가지로 기억할 수 있습니다. 다른 사람보다 나은 사람은 없습니다. 전 세계적으로 인정 된 요구 사항을 모두 충족하고 솔루션을 먼저 제공 한 것입니다.
Pankaj Upadhyay

2
@ Brian : BitKeeper를 사용한 경험이 Linus에게 많은 것을 가르쳐 주었다고 확신합니다. 그리고 자신이하고있는 일을 아는 영리하고 자격있는 사람들이 많이 있습니다. 그러나 나는 커널 유지에 대한 Linus의 경험이 그를 가장 자격 있고 경험에 현명 하게 만든다고 주장합니다 . 내가 틀렸을 수도 있지만, 많은 기고자들과 함께 또 다른 프로젝트를 지적 할 수 있습니까? 그리고 모든 책임자가 실제 모든 코드를 함께 사용하는 데 여전히 깊이 관여하고 있습니까?
Michael Borgwardt

@ Pankaj Upadhyay : 나는 누군가를 강타하지 않고, 왜 내가 대답을 downvoted했는지 설명하고있었습니다. 당신은 "솔루션을 먼저 제공했다"는 말을했는데 이것은 git이 어떤면에서 "먼저"라고 생각하는 것을 의미합니다. 처음에 어떻게 생각하십니까? 확실히 첫 번째로 배포 된 scm 도구는 아니 었습니다.
Bryan Oakley

1
@DeadMG : 그 진술의 더 중요한 부분은 이후 "... 그리고 그 성능의 대부분"입니다. C가 잘 알고 있으면 오버 헤드가 낮은 고성능 코드를 구현하는 데 적합하지 않다고 주장하는 많은 사람들이있을 것입니다.
Michael Borgwardt

6

그것은 Git Parable에 설명 된대로 거의 정확하게 설계되었습니다 .

텍스트 편집기와 몇 가지 파일 시스템 명령 외에는 아무것도없는 컴퓨터가 있다고 상상해보십시오. 이제이 시스템에서 큰 소프트웨어 프로그램을 작성하기로 결정했다고 가정하십시오. 책임있는 소프트웨어 개발자이기 때문에 이전에 변경했거나 삭제 한 코드를 검색 할 수 있도록 소프트웨어 버전을 추적하기위한 일종의 방법을 개발해야합니다. 다음은 이러한 버전 제어 시스템 (VCS)을 설계하는 방법과 해당 설계 선택의 이유에 대한 이야기입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.