답변:
이 기사가 도움이 될 수 있습니다.
편집 : 유명 인사와 Git 및 Mercurial을 비교하는 것이 추세 인 것 같습니다. 여기 하나 더 있습니다 :
나는 Mercurial에서 일하지만 기본적으로 두 시스템이 동일하다고 생각합니다. 둘 다 동일한 추상화로 작업합니다. 히스토리를 구성하는 일련의 스냅 샷 (변경 세트). 각 변경 세트는 그것이 어디에서 왔는지 (부모 변경 세트) 알고 있으며 많은 자식 변경 세트를 가질 수 있습니다. 최근의 hg-git 확장은 Mercurial과 Git 간의 양방향 브리지를 제공하며 이러한 점을 보여줍니다.
Git은 이력 그래프를 변경하는 데 중점을두고 있지만 Mercurial은 기록 재 작성을 권장하지 않지만 어쨌든 쉽게 할 수 있으며 그렇게 할 때의 결과는 정확하게 예상됩니다 (즉 , 이미 보유한 변경 세트를 수정하면 고객이 변경 세트를 새 것으로 간주합니다. 따라서 Mercurial은 비파괴 명령에 대한 편견 이 있습니다.
경량 지점의 경우 Mercurial은 여러 지점이있는 리포지토리를 지원 했기 때문에 ... 항상 생각합니다. 여러 개의 브랜치가있는 Git 리포지토리는 정확히 다음과 같습니다. 단일 리포지토리에 여러 분기 된 개발 가닥이 있습니다. 그런 다음 Git은이 스트랜드에 이름을 추가하고이 이름을 원격으로 쿼리 할 수 있습니다. Mercurial 의 책갈피 확장 기능은 로컬 이름을 추가하며 Mercurial 1.6을 사용하면 밀거나 당길 때 이러한 책갈피를 이동할 수 있습니다.
나는 Linux를 사용하지만 TortoiseHg는 Windows의 Git에 비해 더 빠르며 낫다 (빈약 한 Windows 파일 시스템의 더 나은 사용으로 인해). 두 http://github.com 및 http://bitbucket.org은 (내가 github에 시도하지 않은)의 Bitbucket의 서비스는 위대하고 반응한다 온라인 호스팅 제공합니다.
나는 깨끗하고 우아하다고 느끼기 때문에 Mercurial을 선택했다. 나는 Git과 함께 얻은 쉘 / Perl / Ruby 스크립트에 의해 연기되었다. 무슨 뜻인지 알고 싶다면 git-instaweb.sh
파일을 들여다보십시오 . 루비 스크립트 를 생성하는 쉘 스크립트입니다 . 웹 스크립트를 실행한다고 생각합니다. 쉘 스크립트는 다른 쉘 스크립트를 생성하여 첫 번째 Ruby 스크립트를 시작합니다. 좋은 측정을 위해 약간의 Perl 도 있습니다 .
Mercurial과 Git을 James Bond 및 MacGyver와 비교 하는 블로그 게시물 이 마음에 듭니다. Mercurial은 Git보다 다소 중요하지 않습니다. Mercurial을 사용하는 사람들은 그리 쉽게 감동받지 않는 것 같습니다. 이것은 Linus가 "가장 멋진 병합"이라고 설명한 방식으로 각 시스템이 수행하는 방식에 반영됩니다 . . Git에서는 다음을 수행하여 관련되지 않은 리포지토리와 병합 할 수 있습니다.
git fetch <project-to-union-merge>
GIT_INDEX_FILE=.git/tmp-index git-read-tree FETCH_HEAD
GIT_INDEX_FILE=.git/tmp-index git-checkout-cache -a -u
git-update-cache --add -- (GIT_INDEX_FILE=.git/tmp-index git-ls-files)
cp .git/FETCH_HEAD .git/MERGE_HEAD
git commit
그 명령은 내 눈에 꽤 비 유적으로 보인다. Mercurial에서는 다음을 수행합니다.
hg pull --force <project-to-union-merge>
hg merge
hg commit
Mercurial 명령이 평범하고 전혀 특별하지 않은 방법에 주목하십시오. 유일하게 특이한 것은에 대한 --force
플래그입니다. hg pull
Mercurial은 관련없는 저장소에서 가져올 때 다른 방법으로 중단되기 때문에 필요합니다. Mercurial을 좀 더 우아하게 만드는 것은 이와 같은 차이점입니다.
git pull <url-of-project>
. 인용 한 메일은 git (2005)
Git은 플랫폼이고 Mercurial은 "단지"응용 프로그램입니다. Git은 DVCS 응용 프로그램과 함께 제공되는 버전이 지정된 파일 시스템 플랫폼이지만 플랫폼 응용 프로그램의 경우와 마찬가지로 집중적 인 응용 프로그램보다 더 복잡하고 가장자리가 복잡합니다. 그러나 이것은 또한 git의 VCS가 상당히 유연하다는 것을 의미하며 git으로 할 수있는 비 소스 제어 작업의 깊이가 엄청납니다.
그것이 차이점의 본질입니다.
Git은 저장소 형식부터 기초부터 이해하는 것이 가장 좋습니다. Scott Chacon의 Git Talk 는이를위한 훌륭한 입문서입니다. 후드에서 무슨 일이 일어나고 있는지 모르고 git을 사용하려고하면 (기본 기능 만 고수하지 않는 한) 어느 시점에서 혼란스러워집니다. git의 천재는 리포지토리 형식이 실제로 매우 간단하고 git의 전체 작업을 매우 쉽게 이해할 수 있다는 것입니다.
기술 중심의 비교를 위해 개인적으로 본 최고의 기사는 Dustin Sallings입니다.
그는 실제로 두 DVCS를 광범위하게 사용했으며 둘 다 잘 이해했으며 결국 자식을 선호했습니다.
큰 차이점은 Windows에 있습니다. Mercurial은 기본적으로 지원되지만 Git은 지원되지 않습니다. bitbucket.org 를 사용하여 github.com 과 매우 유사한 호스팅을 얻을 수 있습니다 (실제로는 무료 개인 저장소를 얻을 때 더 좋습니다). 나는 msysGit을 잠시 동안 사용하고 있었지만 Mercurial로 옮겨서 매우 기뻤습니다.
기본 연결이 끊긴 개정 제어를 찾고있는 Windows 개발자 인 경우 Hg로 이동하십시오. Hg가 단순하고 Windows 셸과 잘 통합되어 있지만 Git을 이해할 수 없다는 것을 알았습니다. Hg를 다운로드 하고이 자습서 (hginit.com)를 따랐습니다. 10 분 후에 로컬 리포지토리 를 사용하여 프로젝트 작업을 다시 시작했습니다.
"Mercurial vs. Git"에 대한 가장 좋은 설명은 다음과 같습니다.
그들은 거의 동일합니다. 내 관점에서 가장 중요한 차이점은 (하나는 다른 하나의 DVCS를 선택하게 된 이유는) 두 프로그램이 지점을 관리하는 방법입니다.
Mercurial을 사용하여 새 브랜치를 시작하려면 리포지토리 를 다른 디렉토리에 복제하고 개발을 시작하면됩니다. 그런 다음 끌어서 병합합니다. git을 사용하면 사용하려는 새 토픽 브랜치에 이름을 명시 적으로 지정해야 하며 동일한 디렉토리를 사용하여 코딩을 시작 합니다.
간단히 말해서 Mercurial의 각 지점에는 자체 디렉토리가 필요합니다. git에서는 일반적으로 단일 디렉토리에서 작업합니다. Mercurial에서 브랜치 전환은 디렉토리 변경을 의미합니다. git에서 git checkout으로 디렉토리의 내용을 변경하도록 git에게 요청하는 것을 의미합니다.
나는 정직합니다 : Mercurial과 동일한 작업을 수행 할 수 있는지 모르겠지만 일반적으로 웹 프로젝트에서 작업하기 때문에 항상 git과 동일한 디렉토리를 사용하면 나에게 매우 불편한 것처럼 보입니다. -Apache를 구성하고 다시 시작하면 분기마다 파일 시스템이 엉망이되지 않습니다.
편집 : Deestan이 지적했듯이 Hg는 이름이 branches 이며 단일 저장소에 저장할 수 있으며 개발자는 동일한 작업 사본 내에서 분기를 전환 할 수 있습니다. 자식 분기는 Mercurial 명명 된 분기와 정확히 동일하지 않습니다. 어쨌든 git와 같이 영구적이며 분기를 버리지 않습니다. 즉, 병합하지 않더라도 실험 작업에 명명 된 분기를 사용하면 리포지토리에 저장됩니다. 이것이 Hg가 릴리스 브랜치와 같이 실험적인 단기 실행 작업을 위해 클론을 사용하고 장기 실행 작업을 위해 명명 된 브랜치를 사용하도록 권장하는 이유입니다.
많은 Hg 사용자가 지명 된 브랜치보다 클론을 선호하는 이유는 기술적 인 것보다 훨씬 사회적이거나 문화적입니다. 예를 들어, Hg의 마지막 버전에서는 명명 된 분기를 닫고 변경 세트에서 메타 데이터를 재귀 적으로 제거 할 수도 있습니다.
다른 한편으로, git은 영구하지 않고 각 변경 세트에 메타 데이터로 저장되지 않은 "명명 된 브랜치"를 사용하도록 초대합니다.
개인적 관점에서 git의 모델은 지명 된 브랜치의 개념과 깊이 연결되어 있고 같은 디렉토리를 사용하여 브랜치와 다른 브랜치 사이를 전환합니다. hg는 명명 된 분기와 동일한 작업을 수행 할 수는 있지만 개인적으로 너무 좋아하지 않는 복제본을 사용하도록 권장합니다.
자식 과 수은 사이 에는 큰 차이 가 있습니다 . 각 커밋을 나타내는 방식 git 은 커밋을 스냅 샷으로 나타내고, 수은 은 diff로 나타냅니다.
이것이 실제로 무엇을 의미합니까? 글쎄, 다른 커밋으로 전환, 커밋 비교 등과 같이 많은 작업이 git에서 더 빠릅니다. 특히 이러한 커밋이 멀리 떨어져있는 경우.
AFAIK는 수은 접근 방식의 이점이 없습니다.
아무것도. 그들은 모두 똑같이하고, 거의 똑같이 수행합니다. 이미 하나를 사용하는 프로젝트를 도와야한다면 다른 하나를 선택해야합니다 ..
하나를 선택하는 다른 가능한 이유는 시스템 중 하나만 지원하는 응용 프로그램이나 서비스입니다. 예를 들어, github 때문에 git을 배우기로 결정했습니다 .
또한 Google의 비교 (2008 년에는 약간 낡았지만)
내가 그들을 정확하게 이해하고 (그리고 나는 각각의 전문가와 거리가 멀다면) 그들은 근본적으로 각자 다른 철학을 가지고 있습니다. 먼저 9 개월 동안 수은을 사용했습니다. 이제 git을 6으로 사용했습니다.
hg는 버전 관리 소프트웨어입니다. 주요 목표는 소프트웨어 버전을 추적하는 것입니다.
git은 시간 기반 파일 시스템입니다. 파일 시스템에 다른 차원을 추가하는 것이 목표입니다. 대부분은 파일과 폴더를 가지고 있으며 git은 시간을 추가합니다. VCS가 디자인의 부산물이기 때문에 훌륭하게 작동합니다.
hg에는 항상 유지하려고하는 전체 프로젝트의 역사가 있습니다. 기본적으로 hg는 밀고 당길 때 모든 사용자가 모든 객체에 대한 모든 변경 사항을 원한다고 생각합니다.
git에는 특정 상태의 파일 트리를 나타내는 객체 세트를 결정하는 객체 풀과 추적 파일 (분기 / 헤드) 만 있습니다. git을 밀거나 당기면 밀거나 당기는 특정 가지에 필요한 객체 만 보내며 이는 모든 객체의 작은 하위 집합입니다.
자식에 관한 한 "1 프로젝트"는 없습니다. 같은 저장소에 50 개의 프로젝트를 모두 가질 수 있으며 자식은 신경 쓰지 않습니다. 각각은 동일한 리포지토리에서 개별적으로 관리하고 잘 살 수 있습니다.
Hg의 브랜치 개념은 메인 프로젝트의 브랜치 또는 브랜치의 브랜치 등입니다. Git에는 그러한 개념이 없습니다. git의 브랜치는 트리의 상태 일 뿐이며 모든 것은 git의 브랜치입니다. 공식, 현재 또는 최신 지점은 git에서 의미가 없습니다.
그게 말이되는지 모르겠습니다. 그림을 그릴 수 있다면 각 커밋이 다음과 같이 보일 것입니다.o
o---o---o
/
o---o---o---o---o---o---o---o
\ /
o---o---o
하나의 뿌리와 가지가있는 나무. 자식은 그렇게 할 수 있고 사람들은 종종 강제하지 않는 방식으로 사용합니다. 그런 그림이 있다면 자식 그림은 쉽게 다음과 같이 보일 수 있습니다.
o---o---o---o---o
o---o---o---o
\
o---o
o---o---o---o
실제로 어떤면에서는 git에 분기를 표시하는 것은 의미가 없습니다.
git과 mercurial은 토론에 매우 혼란스러운 점은 "브랜치 (branch)"라는 것을 가지고 있지만 원격으로 같은 것은 아닙니다. 수은의 지점은 다른 repos 사이에 충돌이있을 때 발생합니다. git의 브랜치는 hg의 클론과 분명히 유사합니다. 그러나 클론은 유사한 동작을 제공하지만 가장 확실하게 동일하지는 않습니다. 다소 큰 크롬 레포를 사용하여 git vs hg에서 이것을 시도해보십시오.
$ time git checkout -b some-new-branch
Switched to new branch 'some-new-branch'
real 0m1.759s
user 0m1.596s
sys 0m0.144s
그리고 지금 클론을 사용하는 hg에서
$ time hg clone project/ some-clone/
updating to branch default
29387 files updated, 0 files merged, 0 files removed, 0 files unresolved.
real 0m58.196s
user 0m19.901s
sys 0m8.957
둘 다 핫런입니다. 즉, 나는 그들을 두 번 실행했고 이것은 두 번째 실행입니다. hg clone은 실제로 git-new-workdir과 동일합니다. 둘 다 마치 입력 한 것처럼 완전히 새로운 작업을 수행 cp -r project project-clone
합니다. git에서 새로운 브랜치를 만드는 것과는 다릅니다. 훨씬 더 무겁습니다. hg에 git의 분기와 동등한 것이 있다면 그것이 무엇인지 모르겠습니다.
나는 어떤 수준에서 hg와 git 이 비슷한 일을 할 수 있다는 것을 이해 합니다. 그렇다면 여전히 워크 플로에 큰 차이가 있습니다. git에서 일반적인 워크 플로는 모든 기능에 대한 분기를 만드는 것입니다.
git checkout master
git checkout -b add-2nd-joypad-support
git checkout master
git checkout -b fix-game-save-bug
git checkout master
git checkout -b add-a-star-support
방금 master라고하는 브랜치를 기반으로 3 개의 브랜치를 만들었습니다. (git에서 2 줄 대신 1 줄을 만드는 방법이 있다고 확신합니다)
이제 내가하는 일을하기 위해
git checkout fix-game-save-bug
작업을 시작하십시오. 커밋 사물 등. 크롬만큼 큰 프로젝트에서도 브랜치 간 전환이 거의 즉각적입니다. 실제로 hg에서 어떻게 해야하는지 모르겠습니다. 내가 읽은 자습서의 일부가 아닙니다.
또 다른 큰 차이점. 힘내의 무대.
힘내는이 단계에 대한 아이디어를 가지고 있습니다. 숨겨진 폴더로 생각할 수 있습니다. 커밋하면 작업 트리의 변경 사항이 아닌 스테이지의 내용 만 커밋합니다. 이상하게 들릴 수도 있습니다. 작업 트리에서 모든 변경 사항을 커밋 git commit -a
하려면 수정 된 모든 파일을 스테이지에 추가 한 다음 커밋합니다.
무대의 요점은 무엇입니까? 커밋을 쉽게 분리 할 수 있습니다. joypad.cpp 및 gamesave.cpp를 편집하고 별도로 커밋하려고한다고 상상해보십시오
git add joypad.cpp // copies to stage
git commit -m "added 2nd joypad support"
git add gamesave.cpp // copies to stage
git commit -m "fixed game save bug"
Git에는 동일한 파일에서 스테이지에 복사하려는 특정 라인을 결정하는 명령도 있으므로 커밋을 개별적으로 분할 할 수 있습니다. 왜 그렇게 하시겠습니까? 별도의 커밋으로 다른 사람은 원하는 것을 커밋 할 수 있거나 문제가있는 경우 문제가있는 커밋 만 되돌릴 수 있습니다.
git add --patch
, stackoverflow.com/questions/2372583/… 에서와 같이 linux.die.net/man/1/git-add 또는 use를 참조하십시오 .git add -i
checkout -b <name>
사용할 git branch <name>
수 있습니다.
versioncontrolblog에는 여러 가지 버전 제어 시스템을 비교할 수있는 동적 비교 차트가 있습니다.
dir-a/foo.c
에 dir-b/foo.c
와 작업 계속 dir-b/foo.c
, 다음에 작업이 dir-a/foo.c
될 것입니다 올바르게 풀 후 내 작품과 합병.
브랜치 (특히 단기 브랜치)로 작업 할 때 상당히 큰 차이가 있습니다.
Mercurial과 Git을 비교하는 이 기사 (BranchingExplained)에 설명되어 있습니다.
프로젝트에 Windows 기반 공동 작업자가 있습니까?
Windows 용 Git GUI가 있으면 어색하고 어려우며 비우호적 인 것처럼 보이기 때문입니다.
대조적으로, Mercurial-on-Windows는 쉬운 일이 아닙니다.
작년에 나는 내 자신의 용도로 git과 hg를 모두 평가하고 hg와 함께 가기로 결정했다. 더 깨끗한 솔루션처럼 보였고 당시 더 많은 플랫폼에서 더 잘 작동했습니다. 그러나 대부분은 던졌습니다.
더 최근에는 git-svn 및 Subversion 클라이언트 역할을 할 수 있기 때문에 git을 사용하기 시작했습니다. 이것은 나를 끝내고 이제는 git으로 완전히 전환했습니다. 나는 약간 더 높은 학습 곡선을 가지고 있다고 생각합니다 (특히 내부를 찔러야하는 경우). 그러나 그것은 훌륭한 시스템입니다. John이 지금 게시 한 두 개의 비교 기사를 읽겠습니다.
현재 SVN에서 DVCS로 마이그레이션하는 중입니다 (내 발견에 대한 블로깅, 첫 번째 실제 블로그 노력 ...), 약간의 연구 (= 인터넷 검색)를 수행했습니다. 내가 알 수있는 한 두 패키지로 대부분의 작업을 수행 할 수 있습니다. git에 몇 가지 이상의 고급 기능이 구현되어있는 것처럼 보입니다 .TortoiseHg를 사용하면 창과의 통합이 수은에 약간 더 좋습니다. Git Cheetah도 있다는 것을 알고 있지만 (두 가지 모두 시도했습니다) 수은 솔루션은 더 강력합니다.
그들이 어떻게 오픈 소스인지 알 수 있습니다 (맞습니까?) 중요한 기능이 부족하다고 생각하지 않습니다. 무언가가 중요하다면 사람들은 그것을 요구할 것이고 사람들은 그것을 코딩 할 것입니다.
나는 일반적인 관행을 위해 Git과 Mercurial이 충분하다고 생각합니다. 둘 다 그것들을 사용하는 큰 프로젝트 (Git-> linux kernel, Mercurial-> Mozilla 기초 프로젝트)를 가지고 있기 때문에 실제로 무언가가 부족하다고 생각하지 않습니다.
즉, 다른 사람들이 이것에 대해 말한 것에 관심이 있습니다. 블로그 활동에 큰 도움이 될 것입니다. ;-)
DVCS에 대한 InfoQ의 가이드 에서 git, Mercurial 및 Bazaar에 대한 훌륭하고 철저한 비교 표와 차트가 있습니다.
나는 이것이 대답의 일부가 아니라는 것을 알고 있지만 NetBeans 및 Eclipse와 같은 플랫폼에서 안정적인 플러그인의 가용성은 도구가 작업에 더 적합하거나 어떤 도구에 더 적합한 부분을 수행한다고 생각합니다. "당신"에게 가장 적합합니다. 즉, 실제로 CLI 방식으로 수행하지 않으려는 경우.
Eclipse (및 이에 기반한 모든 것)와 NetBeans 모두 원격 파일 시스템 (SSH와 같은) 및 외부 파일 업데이트에 문제가있는 경우가 있습니다. 이것이 "완벽하게"작업하기 위해 선택한 것을 원하는 또 다른 이유입니다.
나는 지금도이 질문에 스스로 대답하려고 노력하고있다. 그리고 나는 Git이나 Mercurial에 후보들을 il 다.
머큐리얼과 git의 또 다른 흥미로운 비교 : Mercurial vs Git . 주요 초점은 내부 및 분기 프로세스에 미치는 영향입니다.
머큐리얼 웹 사이트에는 두 시스템 의 유사점과 차이점에 대한 훌륭한 설명이 있으며 어휘와 기본 개념의 차이점을 설명합니다. 오랜 git 사용자로서 Mercurial 사고 방식을 이해하는 데 실제로 도움이되었습니다.
이 링크는 http://www.techtatva.com/2010/09/git-mercurial-and-bazaar-a-comparison/ 의 차이점을 이해하는 데 도움이 될 수 있습니다 .
어떤 사람들은 VCS 시스템이 복잡해야한다고 생각합니다. 그들은 현장에서 용어와 개념을 발명하도록 장려합니다. 그들은 아마도 그 주제에 관한 수많은 박사 학위가 흥미로울 것이라고 생각할 것입니다. 그중에는 아마도 Git을 디자인 한 것들이있을 것입니다.
머큐리얼은 다른 사고 방식으로 설계되었습니다. 개발자는 VCS에 신경 쓰지 말고 소프트웨어 엔지니어링이라는 주요 기능에 시간을 투자해야합니다. Mercurial을 사용하면 복구 할 수없는 실수를하지 않으면 서 시스템을 사용하고 행복하게 남용 할 수 있습니다.
모든 전문 도구에는 명확하고 직관적 인 CLI가 제공되어야합니다. Mercurial 사용자는 이상한 옵션없이 간단한 명령을 실행하여 대부분의 작업을 수행 할 수 있습니다. Git 이중 대시에서는 미친 옵션이 표준입니다. Mercurial은 CLI 담당자 인 경우 실질적인 이점이 있습니다.
예를 들어 실수로 커밋을 수행한다고 가정합니다. 일부 파일을 편집하는 것을 잊었습니다. Mercurial에서 작업을 취소하려면 다음을 입력하십시오.
$ hg rollback
그런 다음 시스템이 마지막 트랜잭션을 취소한다는 메시지가 표시됩니다.
힘내에서 다음을 입력해야합니다 :
$ git reset --soft HEAD^
따라서 재설정이 무엇인지 알 수 있다고 가정하십시오. 그러나 또한 "소프트"및 "하드"리셋이 무엇인지 알아야합니다 (직관적 인 추측은 무엇입니까?). 아 그리고 물론 '^'문자를 잊지 마세요! (지금 Ritchie의 이름은 무엇입니까 ...)
kurif3 및 meld와 같은 타사 도구와 Mercurial의 통합도 훨씬 좋습니다. 패치를 생성하면 번거 로움없이 분기를 병합 할 수 있습니다. Mercurial에는 입력하여 활성화하는 간단한 http 서버도 포함되어 있습니다.
hg serve
그리고 다른 사람들이 귀하의 저장소를 찾아 보도록하십시오.
결론적으로, Git은 Mercurial이 훨씬 더 복잡한 방식으로 훨씬 낮은 CLI로 수행합니다. 프로젝트의 VCS를 과학 연구 분야로 바꾸려면 Git을 사용하십시오. VCS 작업을 신경 쓰지 않고 완료하고 실제 작업에 집중하려면 Mercurial을 사용하십시오.