Mercurial과 Git의 차이점은 무엇입니까?


727

Windows (msysGit 포함)에서 git을 얼마 동안 사용해 왔으며 분산 소스 제어라는 아이디어가 마음에 듭니다. 최근에 나는 Mercurial (hg)을보고 있었고 재미있어 보입니다. 그러나 hg와 git의 차이점을 머리로 감쌀 수는 없습니다.

git과 hg를 나란히 비교 한 사람이 있습니까? 팬보이 토론에 뛰어 들지 않고 hg와 git의 차이점을 알고 싶습니다.

답변:


345

이 기사가 도움이 될 수 있습니다.

편집 : 유명 인사와 Git 및 Mercurial을 비교하는 것이 추세 인 것 같습니다. 여기 하나 더 있습니다 :


1
"Git vs Mercurial Please Relax"는이 질문만큼 오래되었지만 오래되었습니다. 두 도구에 3 년 이상의 기능이 추가되었으므로이 질문을 삭제하고 다시 열어야합니다.
gman

238

나는 Mercurial에서 일하지만 기본적으로 두 시스템이 동일하다고 생각합니다. 둘 다 동일한 추상화로 작업합니다. 히스토리를 구성하는 일련의 스냅 샷 (변경 세트). 각 변경 세트는 그것이 어디에서 왔는지 (부모 변경 세트) 알고 있으며 많은 자식 변경 세트를 가질 수 있습니다. 최근의 hg-git 확장은 Mercurial과 Git 간의 양방향 브리지를 제공하며 이러한 점을 보여줍니다.

Git은 이력 그래프를 변경하는 데 중점을두고 있지만 Mercurial은 기록 재 작성을 권장하지 않지만 어쨌든 쉽게 할 수 있으며 그렇게 할 때의 결과는 정확하게 예상됩니다 (즉 , 이미 보유한 변경 세트를 수정하면 고객이 변경 세트를 새 것으로 간주합니다. 따라서 Mercurial은 비파괴 명령에 대한 편견 이 있습니다.

경량 지점의 경우 Mercurial은 여러 지점이있는 리포지토리를 지원 했기 때문에 ... 항상 생각합니다. 여러 개의 브랜치가있는 Git 리포지토리는 정확히 다음과 같습니다. 단일 리포지토리에 여러 분기 된 개발 가닥이 있습니다. 그런 다음 Git은이 스트랜드에 이름을 추가하고이 이름을 원격으로 쿼리 할 수 ​​있습니다. Mercurial 의 책갈피 확장 기능은 로컬 이름을 추가하며 Mercurial 1.6을 사용하면 밀거나 당길 때 이러한 책갈피를 이동할 수 있습니다.

나는 Linux를 사용하지만 TortoiseHg는 Windows의 Git에 비해 더 빠르며 낫다 (빈약 한 Windows 파일 시스템의 더 나은 사용으로 인해). 두 http://github.comhttp://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 pullMercurial은 관련없는 저장소에서 가져올 때 다른 방법으로 중단되기 때문에 필요합니다. Mercurial을 좀 더 우아하게 만드는 것은 이와 같은 차이점입니다.


21
TortoiseHg는 Linux의 Gnome 파일 관리자 인 Nautilus 와도 함께 작동합니다.
oenli

4
Ruby 스크립트는 httpd가 Ruby 웹 서버 인 Webrick 인 경우에만 생성됩니다.
대안

4
Git과 마찬가지로 Mercurial은 커밋 할 때 파일의 스냅 샷을 저장합니다. Git에서와 같이 휴리스틱으로 만 이름 변경을 추적 할 수 있다는 데 동의하지 않습니다. 모델에 스냅 샷에 정보를 추가하는 것을 금지하는 모델에는 아무것도 없습니다 (예 : 정보 이름 바꾸기). 우리는 Mercurial에서 그렇게합니다.
Martin Geisler

63
관련없는 프로젝트를 git과 병합 (풀)하려면 간단히 할 수 있습니다 : git pull <url-of-project>. 인용 한 메일은 git (2005)
초창기

5
knittl : 아, 좋아, Git이 덜 화려하다는 것을 알게되어 기쁘다. 그래도 예제는 시스템이 시원하다고 생각하는 방식이 어떻게 다르고 Git은 Mercurial과 비교할 때 저급 수준이라고 생각합니다 (그러나 더 강력하지는 않습니다).
Martin Geisler

73

Git은 플랫폼이고 Mercurial은 "단지"응용 프로그램입니다. Git은 DVCS 응용 프로그램과 함께 제공되는 버전이 지정된 파일 시스템 플랫폼이지만 플랫폼 응용 프로그램의 경우와 마찬가지로 집중적 인 응용 프로그램보다 더 복잡하고 가장자리가 복잡합니다. 그러나 이것은 또한 git의 VCS가 상당히 유연하다는 것을 의미하며 git으로 할 수있는 비 소스 제어 작업의 깊이가 엄청납니다.

그것이 차이점의 본질입니다.

Git은 저장소 형식부터 기초부터 이해하는 것이 가장 좋습니다. Scott Chacon의 Git Talk 는이를위한 훌륭한 입문서입니다. 후드에서 무슨 일이 일어나고 있는지 모르고 git을 사용하려고하면 (기본 기능 만 고수하지 않는 한) 어느 시점에서 혼란스러워집니다. git의 천재는 리포지토리 형식이 실제로 매우 간단하고 git의 전체 작업을 매우 쉽게 이해할 있다는 것입니다.

기술 중심의 비교를 위해 개인적으로 본 최고의 기사는 Dustin Sallings입니다.

그는 실제로 두 DVCS를 광범위하게 사용했으며 둘 다 잘 이해했으며 결국 자식을 선호했습니다.


78
나는 사람들이 git을 "플랫폼"이라고 언급하는 것을 자주 읽었지만 git을 실행하는 것 이외의 다른 작업을 수행하는 플랫폼으로서 주요 예제가 없기 때문에 이론이나 일반적인 신화에 가깝습니다.
Ian Kelling

@Ian-내가 실수하지 않으면 Aptana Studio 3는 그것을 내부 업데이트 시스템으로 사용합니다.
Mac

22
간단히 말해 : Mercurial은 오픈 소스 분산 개정 제어 시스템이며 git은 라이프 스타일 선택입니다.
팀 키팅

51

큰 차이점은 Windows에 있습니다. Mercurial은 기본적으로 지원되지만 Git은 지원되지 않습니다. bitbucket.org 를 사용하여 github.com 과 매우 유사한 호스팅을 얻을 수 있습니다 (실제로는 무료 개인 저장소를 얻을 때 더 좋습니다). 나는 msysGit을 잠시 동안 사용하고 있었지만 Mercurial로 옮겨서 매우 기뻤습니다.


64
따라서 "기본적으로"는 올바른 단어는 아니지만 Windows에서는 제대로 지원되지 않습니다.
Ian Kelling

14
git은 Windows에서 특정 지점까지 지원됩니다. 그러나 유니 코드 파일 이름을 크로스 플랫폼으로 사용하고 어떤 고통을 겪는 지보십시오.
Craig McQueen

@Craig : 플랫폼 단점이 더 많습니다. 유능한 플랫폼을 사용하면 적절한 로케일로 전환 할 수 있습니다. utf-8을 고수한다면 Mac OS X의 utf-8 정규화가 약간 다르다는 점을 제외하고는 대부분 괜찮을 것입니다. 그러나 윈도우에서 utf-8을 사용할 수 있는지 확실하지 않습니다 ...
Arafangion

23
Windows는 유니 코드를 지원하지만 MS는 UTF-8 대신 API에서 UTF-16을 선택했습니다. 그럼에도 불구하고 git은 유니 코드 크로스 플랫폼을 지원할 수 있습니다. SVN은 그 문제를 아주 잘 해결했습니다. 그러나 현재 msysGit 개발의 최우선 순위는 아닙니다. code.google.com/p/msysgit/issues/detail?id=80
Craig McQueen

38

기본 연결이 끊긴 개정 제어를 찾고있는 Windows 개발자 인 경우 Hg로 이동하십시오. Hg가 단순하고 Windows 셸과 잘 통합되어 있지만 Git을 이해할 수 없다는 것을 알았습니다. Hg를 다운로드 하고이 자습서 (hginit.com)를 따랐습니다. 10 분 후에 로컬 리포지토리 를 사용하여 프로젝트 작업을 다시 시작했습니다.


1
나는 같은 튜토리얼을 따랐다. 결정적입니다.
Nathan


20

그들은 거의 동일합니다. 내 관점에서 가장 중요한 차이점은 (하나는 다른 하나의 DVCS를 선택하게 된 이유는) 두 프로그램이 지점을 관리하는 방법입니다.

Mercurial을 사용하여 새 브랜치를 시작하려면 리포지토리 를 다른 디렉토리에 복제하고 개발을 시작하면됩니다. 그런 다음 끌어서 병합합니다. git을 사용하면 사용하려는 새 토픽 브랜치에 이름을 명시 적으로 지정해야 하며 동일한 디렉토리를 사용하여 코딩을 시작 합니다.

간단히 말해서 Mercurial의 각 지점에는 자체 디렉토리가 필요합니다. git에서는 일반적으로 단일 디렉토리에서 작업합니다. Mercurial에서 브랜치 전환은 디렉토리 변경을 의미합니다. git에서 git checkout으로 디렉토리의 내용을 변경하도록 git에게 요청하는 것을 의미합니다.

나는 정직합니다 : Mercurial과 동일한 작업을 수행 할 수 있는지 모르겠지만 일반적으로 웹 프로젝트에서 작업하기 때문에 항상 git과 동일한 디렉토리를 사용하면 나에게 매우 불편한 것처럼 보입니다. -Apache를 구성하고 다시 시작하면 분기마다 파일 시스템이 엉망이되지 않습니다.

편집 : Deestan이 지적했듯이 Hg는 이름이 branches 이며 단일 저장소에 저장할 수 있으며 개발자는 동일한 작업 사본 내에서 분기를 전환 할 수 있습니다. 자식 분기는 Mercurial 명명 된 분기와 정확히 동일하지 않습니다. 어쨌든 git와 같이 영구적이며 분기를 버리지 않습니다. 즉, 병합하지 않더라도 실험 작업에 명명 된 분기를 사용하면 리포지토리에 저장됩니다. 이것이 Hg가 릴리스 브랜치와 같이 실험적인 단기 실행 작업을 위해 클론을 사용하고 장기 실행 작업을 위해 명명 된 브랜치를 사용하도록 권장하는 이유입니다.

많은 Hg 사용자가 지명 된 브랜치보다 클론을 선호하는 이유는 기술적 인 것보다 훨씬 사회적이거나 문화적입니다. 예를 들어, Hg의 마지막 버전에서는 명명 된 분기를 닫고 변경 세트에서 메타 데이터를 재귀 적으로 제거 할 수도 있습니다.

다른 한편으로, git은 영구하지 않고 각 변경 세트에 메타 데이터로 저장되지 않은 "명명 된 브랜치"를 사용하도록 초대합니다.

개인적 관점에서 git의 모델은 지명 된 브랜치의 개념과 깊이 연결되어 있고 같은 디렉토리를 사용하여 브랜치와 다른 브랜치 사이를 전환합니다. hg는 명명 된 분기와 동일한 작업을 수행 할 수는 있지만 개인적으로 너무 좋아하지 않는 복제본을 사용하도록 권장합니다.


6
이것은 차이가 아닙니다. Hg도 지점을 지명했습니다. 클론 브랜치 대신 정상적인 개발 과정에서 항상 사용합니다.
Deestan

2
Hg로 명명 된 브랜치 인 AFAIK는 각 커밋에서 메타 데이터를 저장하여 획득된다. 잘못되었을 수도 있지만 지점을 만든 후에는 해당 메타 데이터가 각 변경 집합에 포함되어 기록의 일부가된다는 것을 읽었습니다. 이것은 자식과 큰 차이입니다. "클론 당신이 지점 이름을 기록하지 않으려는 빠른 실험을 위해 중대하다 및 명명 된 지점은 장기 지점에 좋다" tinyurl.com/2wz39qx 내가 내 게시물 말할려고 무슨 일이 그 자식의 표준 워크 플로우 초대 당신입니다 단일 작업 사본을 사용하는 행위 Hg 표준 워크 플로에는 클론이 포함되어있어 개인적인 요구에 맞지 않습니다.
Arialdo Martini

Git & Hg에서의 브랜치 유사성 / 차이점에 대한 자세한 설명은 mercurial.selenic.com/wiki/GitConcepts#Branch_model
sampablokuper에서 26:11의

2
hg로 명명 된 분기는 git의 분기와 다릅니다. hg에는 하나의 진정한 길이 있습니다. 모든 지점은 해당 경로에서 떨어진 지점입니다. 자식에는 진정한 경로가 없습니다. repo의 상태가 다르고 해당 상태에 대한 포인터가 있습니다. 각 분기는 다른 포인터입니다. 어떤 포인터가 주요 포인터입니까? 지점은 모두 동료입니다.
gman

17

자식수은 사이 에는 차이 가 있습니다 . 각 커밋을 나타내는 방식 git 은 커밋을 스냅 샷으로 나타내고, 수은 은 diff로 나타냅니다.

이것이 실제로 무엇을 의미합니까? 글쎄, 다른 커밋으로 전환, 커밋 비교 등과 같이 많은 작업이 git에서 더 빠릅니다. 특히 이러한 커밋이 멀리 떨어져있는 경우.

AFAIK는 수은 접근 방식의 이점이 없습니다.


29
Changesets (diffs) 장점은 적은 공간을 차지한다는 것입니다. Git은 압축을 사용하여 커밋에 사용 된 공간을 복구하지만 가끔 명시 적 재 압축 단계 ( "git pack")가 필요합니다.
quark

8
현재는 'git gc'라고 불리지 만 가비지 콜렉션의 레벨이 다르며 일부 레벨은 최신 버전의 git에서 자동으로 실행됩니다.
FelipeC

6
실제로 수은은 스냅 샷도 사용합니다
Ronny

13
'스냅 샷'과 'diffs'의 차이점을 이해하지 못합니다. hg 및 git은 모두 파일 델타 그룹으로 커밋을 저장합니다 . 이러한 델타는 해당 SCM이 선택한 이전 개정판을 기반으로합니다. 언급 한 작업에서 git이 실제로 더 빠름을 나타내는 숫자가 있습니까? 다른 커밋으로 업데이트하는 것은 어쨌든 레포를 읽지 않고 작업 디렉토리에 쓰는 데 대부분의 시간을 소비합니다.
Kevin

2
'스냅 샷'과 'diff'의 비교-전혀 관련이 없습니다. 그러나 repo는 내부에 저장되어 사용자가 보는 것과는 아무런 관련이 없습니다. 자식과 수은 모두 사용자에게 '스냅 샷'을 제공합니다. Bazaar가 생각한 것처럼 git과 동일한 방식으로 저장소 형식을 수은에 추가 할 수없는 이유는 없습니다.
Mark Booth

11

아무것도. 그들은 모두 똑같이하고, 거의 똑같이 수행합니다. 이미 하나를 사용하는 프로젝트를 도와야한다면 다른 하나를 선택해야합니다 ..

하나를 선택하는 다른 가능한 이유는 시스템 중 하나만 지원하는 응용 프로그램이나 서비스입니다. 예를 들어, github 때문에 git을 배우기로 결정했습니다 .


6
답변이 너무 실용적이었던 것 같습니다. :)
Arafangion 2016 년


11

내가 그들을 정확하게 이해하고 (그리고 나는 각각의 전문가와 거리가 멀다면) 그들은 근본적으로 각자 다른 철학을 가지고 있습니다. 먼저 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에는 동일한 파일에서 스테이지에 복사 할 특정 라인을 결정하는 명령도 있으므로 커밋을 개별적으로 분할 할 수 있습니다." 이 명령들은 무엇입니까?
James McMahon

1
@James : git add --patch, stackoverflow.com/questions/2372583/… 에서와 같이 linux.die.net/man/1/git-add 또는 use를 참조하십시오 .git add -i
tanascius

@gman : 마스터를 확인하고 분기하는 대신에 분기하지 않고 새 분기를 만드는 데 checkout -b <name>사용할 git branch <name>수 있습니다.
tanascius

8

versioncontrolblog에는 여러 가지 버전 제어 시스템을 비교할 수있는 동적 비교 차트가 있습니다.

다음은 git, hg 및 bzr의 비교표입니다.


1
Mercurial에 대한 정보는 완전히 정확하지는 않습니다. Mercurial에는 "이동 또는 이름을 바꾼 후 지능적인 병합"기능이 있습니다. 구체적으로는, 내가 이름을 바꾸면 것을이 수단 dir-a/foo.cdir-b/foo.c와 작업 계속 dir-b/foo.c, 다음에 작업이 dir-a/foo.c될 것입니다 올바르게 풀 후 내 작품과 합병.
Martin Geisler

Git 에 대한 정보 ( IIRC의 Better SCM Initiative 비교, IIRC에서 제공) 도 일부 위치에서 부정확하거나 심지어 부정확합니다.
Jakub Narębski


7

프로젝트에 Windows 기반 공동 작업자가 있습니까?

Windows 용 Git GUI가 있으면 어색하고 어려우며 비우호적 인 것처럼 보이기 때문입니다.

대조적으로, Mercurial-on-Windows는 쉬운 일이 아닙니다.


나는 자식을 좋아하지만 여기에 동의해야합니다. Git에는 스테이지가있는 더 좋은 명령 줄과 더 나은 문서가 있습니다. posix 쉘과 함께 git 명령을 행복하게 사용합니다. 창에 그러나 tortoiseHG이 큰, 심지어 몇은 diff 도구와 통합 (비교를 넘어)와 하위의 repos에 대한 완전한 지원을 가지고 있으며, 스트립 같은 많은 HG 플러그인 / MQ
Keyo

최소한 하나의 아주 좋은 Windows (및 OS X + Linux) Git GUI가 있습니다.
Mot

7

bitbucket.org의 수은과 github의 git 사이에서 주목할 점은 수은은 원하는만큼 개인 저장소를 가질 수 있지만 github은 유료 계정으로 업그레이드해야한다는 것입니다. 그래서 수은을 사용하는 비트 버킷을 선택하는 이유입니다.


5

작년에 나는 내 자신의 용도로 git과 hg를 모두 평가하고 hg와 함께 가기로 결정했다. 더 깨끗한 솔루션처럼 보였고 당시 더 많은 플랫폼에서 더 잘 작동했습니다. 그러나 대부분은 던졌습니다.

더 최근에는 git-svn 및 Subversion 클라이언트 역할을 할 수 있기 때문에 git을 사용하기 시작했습니다. 이것은 나를 끝내고 이제는 git으로 완전히 전환했습니다. 나는 약간 더 높은 학습 곡선을 가지고 있다고 생각합니다 (특히 내부를 찔러야하는 경우). 그러나 그것은 훌륭한 시스템입니다. John이 지금 게시 한 두 개의 비교 기사를 읽겠습니다.


4
hgsubversion : bitbucket.org/durin42/hgsubversion을 살펴보십시오 . 현재 Mercurial의 개발 버전이 필요하지만 7 월 1 일 예정인 Mercurial 1.3을 릴리스 할 예정입니다.
Martin Geisler

4

현재 SVN에서 DVCS로 마이그레이션하는 중입니다 (내 발견에 대한 블로깅, 첫 번째 실제 블로그 노력 ...), 약간의 연구 (= 인터넷 검색)를 수행했습니다. 내가 알 수있는 한 두 패키지로 대부분의 작업을 수행 할 수 있습니다. git에 몇 가지 이상의 고급 기능이 구현되어있는 것처럼 보입니다 .TortoiseHg를 사용하면 창과의 통합이 수은에 약간 더 좋습니다. Git Cheetah도 있다는 것을 알고 있지만 (두 가지 모두 시도했습니다) 수은 솔루션은 더 강력합니다.

그들이 어떻게 오픈 소스인지 알 수 있습니다 (맞습니까?) 중요한 기능이 부족하다고 생각하지 않습니다. 무언가가 중요하다면 사람들은 그것을 요구할 것이고 사람들은 그것을 코딩 할 것입니다.

나는 일반적인 관행을 위해 Git과 Mercurial이 충분하다고 생각합니다. 둘 다 그것들을 사용하는 큰 프로젝트 (Git-> linux kernel, Mercurial-> Mozilla 기초 프로젝트)를 가지고 있기 때문에 실제로 무언가가 부족하다고 생각하지 않습니다.

즉, 다른 사람들이 이것에 대해 말한 것에 관심이 있습니다. 블로그 활동에 큰 도움이 될 것입니다. ;-)


1
예, 둘 다 오픈 소스 프로젝트입니다.
Martin Geisler


3

나는 이것이 대답의 일부가 아니라는 것을 알고 있지만 NetBeans 및 Eclipse와 같은 플랫폼에서 안정적인 플러그인의 가용성은 도구가 작업에 더 적합하거나 어떤 도구에 더 적합한 부분을 수행한다고 생각합니다. "당신"에게 가장 적합합니다. 즉, 실제로 CLI 방식으로 수행하지 않으려는 경우.

Eclipse (및 이에 기반한 모든 것)와 NetBeans 모두 원격 파일 시스템 (SSH와 같은) 및 외부 파일 업데이트에 문제가있는 경우가 있습니다. 이것이 "완벽하게"작업하기 위해 선택한 것을 원하는 또 다른 이유입니다.

나는 지금도이 질문에 스스로 대답하려고 노력하고있다. 그리고 나는 Git이나 Mercurial에 후보들을 il 다.


2
+1, "완벽한"경험이 이런 것들을 다루지 않는 사람들보다 중요하기 때문입니다. IDE를위한 견고한 플러그인은 많은 차이를 만듭니다.
eksortso


2

Mercurial과 Git의 성능 비교에 관심이 있다면 이 기사를 살펴보십시오 . 결론은 다음과 같습니다.

Git과 Mercurial은 모두 좋은 결과를 얻었지만 속도와 저장소 크기 사이에서 흥미로운 절충안을 만듭니다. Mercurial은 추가 및 수정이 빠르며 동시에 저장소 확장을 제어합니다. Git도 빠르지 만 재 포장 할 때까지 수정 된 파일을 사용하여 저장소가 매우 빠르게 커지므로 재 포장 속도가 매우 느려질 수 있습니다. 그러나 포장 된 저장소는 Mercurial보다 훨씬 작습니다.



2

SVN에서 마이그레이션하는 경우 SVN 사용자가 구문을 이해하기 쉽도록 Mercurial을 사용하십시오. 그 외에는 어느 쪽도 잘못 갈 수 없습니다. 그러나 GIT 튜토리얼HGinit 중 하나를 선택하기 전에 확인하십시오 .



1

어떤 사람들은 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을 사용하십시오.


1
실제로 git 에서 명령의 별칭을 지정할 수 있으므로 CLI 사용이 덜 복잡합니다. 이 SuperUser (StackExchange) 질문 에는 많은 것들이 있습니다.
Spoike 2018 년

1
정말 그렇습니다. 몇 가지 일반적인 작업을 처리하기 위해 쉘 스크립트를 작성할 수도 있습니다. 결국 잘못 설계되고 직관적이지 않은 CLI를 가진 VCS를 처리하기 위해 랩퍼 CLI를 작성하고 있음을 깨닫기 시작합니다. 그리고 그 뿐만이 아닙니다. Git은 문서와 CLI 메시지에 익숙해지기 위해 사용자가 결국 배우고 이해해야한다는 의심스러운 유용성을 가진 엄청나게 많은 개념을 소개합니다.
코스타스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.