Git tương đương của hầu hết các lệnh Mercurial phổ biến?


89

Tôi đang sử dụng Mercurial nhưng muốn thực hiện một bản demo nhanh về Git.

Git tương đương của:

hg init . # start a project in the current directory
hg addremove # look for any added or deleted files
hg commit -m "comment" # commit any uncomitted changes
hg status # what have i changed since the last commit?

3
Tôi sẽ tò mò muốn xem một bảng hiển thị tất cả các lệnh tương đương giữa ít nhất các DVCS phổ biến, nếu bất kỳ ai tình cờ gặp một trong khi tìm ra câu trả lời ở đây. Tôi đã không tìm thấy một trong một tìm kiếm nhanh trên Google.
Mark Rushakoff 20/09/09

Câu trả lời:


104

Đá rosetta Git-HG không tệ

Có một vài vấn đề khác giữa cả hai không được đề cập ở đó. Danh sách này được trích từ bài đăng trên blog của chính tôi khi tôi đi theo hướng khác (git -> hg).

.hgignoreCú pháp: Hg , có cùng hành vi với .gitignore của git.

Git .git/config , ~/.gitconfig, sử dụng git-config để thay đổi các giá trị
Hg .hg/hgrc , ~/.hgrc, sử dụnghg help -c config

Git git commit -v<br> Hg hg diff | less; hg commit

Git gitk<br> Hg hg view, or thg from [TortoiseHg][1]

Git git gui<br> Hg Mercurial không gửi GUI để chọn các tập hợp thay đổi, chỉ có hg recordlệnh giao diện điều khiển .

Git git rebase<br> Hg hg rebase . Vì git rebase --interactivecó lịch sử hg hoặc Hàng đợi Mercurial

Git git push URL ; git remote add origin URL<br> Hg hg push URL; $EDITOR .hg/hgrc ; [paths] default = URL

Git gitk, git log origin/master..HEAD<br> Hg hg outgoing

Git git format-patch RANGE<br> Hg hg email -m filename -o

Git git add . ; Lưu ý dấu chấm
Hg hg add ; Không cần dấu chấm.

Git git checkout REVISION-KEY<br> Hg hg update CHANGESET


Chỉ để điền vào chỗ trống, một số lệnh hữu ích nhất từ ​​Mercurial:

Hg hg record
Git git add -p; git commit

Hg hg inc [URL]
Git Không có thực tương đương. Bạn chỉ có thể làm tương đương vớihg pull; hg log -r .:

Hg hg out URL
Git Vui lòng thêm nếu bạn biết cách.

Để giải quyết xung đột hợp nhất, hg resolvelệnh trong Mercurial có một số tùy chọn thay đổi hành vi:

Hg hg resolve -m FILE (đánh dấu tệp là đã được giải quyết bằng cách khắc phục sự cố xung đột theo cách thủ công)
Git git add FILE

Hg hg resolve -u FILE đánh dấu tệp là chưa được giải quyết
Git git reset HEAD FILE để xóa tệp

Hg hg resolve -l (liệt kê các tệp có xung đột đã giải quyết / chưa được giải quyết)
Git git status - các tệp đã hợp nhất sạch sẽ được tự động thêm vào chỉ mục, những tệp không có xung đột

Hg hg resolve FILE (sau khi hợp nhất, cố gắng hợp nhất lại tệp)
Git không tương đương với việc hợp nhất lại mà tôi biết.


4
Có lẽ đây nên là một wiki.
Keyo

1
Đối với gitk có một bản sao đồ họa cho Mercurial, hgview (lưu ý rằng nó là khác nhau từ "xem hg" lệnh)
tonicebrian

1
Một gợi ý nhỏ: trao đổi xung quanh văn bản Hg và Git (vì nó là Git cho người dùng Mercurial)
Chris S

1
Mặc dù hg recordkhông thân thiện với người dùng lắm, hg crecord(từ phần mở rộng crecord ) là một giao diện người dùng văn bản dựa trên lời nguyền cực kỳ dễ sử dụng.
Denilson Sá Maia

1
@ ozzy432836 Tôi đã không sử dụng Hg trong nhiều năm nay, nhưng tôi nghĩ đó là những giải pháp tương đương. FWIW hành động mặc định hg resolvelà một trong những lý do tôi thích git hơn. Theo mặc định hg resolvesẽ phá hủy hợp nhất được phân giải thủ công độc đáo của bạn nếu bạn chuyển nó không có đối số!
richq

48

Lưu ý: một trong những khác biệt lớn nhất giữa Git và Mercurial là sự hiện diện rõ ràng của chỉ mục hoặc khu vực tổ chức .

Từ Mercurial dành cho Người dùng Git :

Git là DistributedSCM duy nhất đưa ra khái niệm về chỉ mục hoặc vùng tổ chức. Những người khác có thể thực hiện và ẩn nó, nhưng không có trường hợp nào khác, người dùng không biết cũng như không phải xử lý nó.

Tương đương thô của Mercurial là DirStatekiểm soát thông tin trạng thái bản sao đang hoạt động để xác định các tệp được đưa vào cam kết tiếp theo. Nhưng trong mọi trường hợp, tệp này được xử lý tự động.
Ngoài ra, có thể lựa chọn nhiều hơn tại thời điểm cam kết bằng cách chỉ định các tệp bạn muốn cam kết trên dòng lệnh hoặc bằng cách sử dụng RecordExtension.

Nếu bạn cảm thấy không thoải mái khi xử lý chỉ mục, bạn đang chuyển đổi để tốt hơn ;-)


Bí quyết là, bạn thực sự cần hiểu chỉ mục để khai thác đầy đủ Git. Như bài báo này từ tháng 5 năm 2006 nhắc nhở chúng ta sau đó (và nó vẫn đúng đến bây giờ):

"Nếu bạn từ chối Chỉ mục, bạn thực sự phủ nhận chính git."

Bây giờ, bài viết đó chứa nhiều lệnh mà bây giờ đơn giản hơn để sử dụng (vì vậy đừng dựa vào nội dung của nó quá nhiều;)), nhưng ý tưởng chung vẫn là:

Bạn đang làm việc trên một tính năng mới và bắt đầu thực hiện các sửa đổi nhỏ trên một tệp.

# working, add a few lines
$ git add myFile
# working, another minor modification
$ git add myFile

Tại thời điểm này, cam kết tiếp theo của bạn sẽ thực hiện 2 sửa đổi nhỏ trong nhánh hiện tại

# working, making major modification for the new features
# ... damn! I cannot commit all this in the current branch: nothing would work

$ git commit

Chỉ ghi lại những thay đổi được thêm vào vùng tổ chức (chỉ mục) tại thời điểm này, chứ không phải những thay đổi lớn hiện có trong thư mục làm việc của bạn.

$ git branch newFeature_Branch
$ git add myFile

Cam kết tiếp theo sẽ ghi lại tất cả các thay đổi lớn khác trong nhánh mới 'newFntic_Branch'.

Giờ đây, thêm tương tác hoặc thậm chí tách cam kết là các tính năng có sẵn với Mercurial, thông qua hg recordlệnh '' hoặc các tiện ích mở rộng khác: bạn sẽ cần cài đặt RecordExtension, hoặc CrecordExtension.
Nhưng đây không phải là một phần của quy trình làm việc bình thường của Mercurial.

Git xem một cam kết là một loạt " thay đổi nội dung tệp " và cho phép bạn thêm những thay đổi đó cùng một lúc.
Bạn nên nghiên cứu tính năng đó và hậu quả của nó: Hầu hết sức mạnh Git (như khả năng dễ dàng hoàn nguyên một hợp nhất (hoặc chia nhỏ vấn đề, hoặc hoàn nguyên một cam kết) , trái ngược với Mercurial ) đến từ mô hình "nội dung tệp" đó.


tonfa (trong hồ sơ: "Hg dev, pythonist": figure ...) đã tham gia, trong phần nhận xét:

Về cơ bản, không có gì "git-ish" trong chỉ mục, hg có thể sử dụng một chỉ mục nếu nó được coi là có giá trị, trên thực tế mqhoặc shelveđã thực hiện một phần của việc đó.

Oh Boy. Lại đây.

Đầu tiên, tôi không ở đây để làm cho một công cụ này trông đẹp hơn một công cụ khác. Tôi thấy Hg tuyệt vời, rất trực quan, với sự hỗ trợ tốt (đặc biệt là trên Windows, nền tảng chính của tôi, mặc dù tôi cũng làm việc trên Linux và Solaris8 hoặc 10).

Chỉ mục này thực sự ở phía trước và trung tâm theo cách Linus Torvalds hoạt động với VCS :

Git đã sử dụng các bản cập nhật chỉ mục rõ ràng từ ngày 1, ngay cả trước khi nó thực hiện lần hợp nhất đầu tiên. Đó chỉ đơn giản là cách tôi luôn làm việc. Tôi có xu hướng có cây bẩn, với một số bản vá ngẫu nhiên trong cây của tôi mà tôi không muốn cam kết, vì nó chỉ là bản cập nhật Makefile cho phiên bản tiếp theo

Giờ đây, sự kết hợp của chỉ mục (không phải là khái niệm chỉ thấy trong Git) mô hình "content is king" làm cho nó trở nên khá độc đáo và "git-ish" :

git là một trình theo dõi nội dung và tên tệp không có ý nghĩa trừ khi được liên kết với nội dung của nó. Do đó, hành vi tốt nhất cho git add filename là thêm nội dung của tệp cũng như tên của nó vào chỉ mục.

Lưu ý: "nội dung", ở đây, được định nghĩa như sau :

Chỉ mục của Git về cơ bản được định nghĩa rất nhiều là

  • đủ để chứa toàn bộ " nội dung " của cây (và điều này bao gồm tất cả siêu dữ liệu: tên tệp, chế độ và nội dung tệp là tất cả các phần của "nội dung" và tất cả chúng đều vô nghĩa! )
  • thông tin "thống kê" bổ sung để cho phép tối ưu hóa so sánh hệ thống tệp rõ ràng và nhỏ (nhưng cực kỳ quan trọng!).

Vì vậy, bạn thực sự nên xem các chỉ số như nội dung .

Nội dung không phải là "tên tệp" hoặc "nội dung tệp" là các phần riêng biệt. Bạn thực sự không thể tách rời hai người .
Bản thân tên tệp không có nghĩa lý gì (chúng cũng phải có nội dung tệp) và nội dung tệp riêng của nó cũng vô nghĩa tương tự (bạn phải biết cách tiếp cận nó).

Điều tôi muốn nói là về cơ bản git không cho phép bạn xem tên tệp mà không có nội dung của nó. Toàn bộ khái niệm là điên rồ và không có giá trị. Nó không liên quan đến "thực tế".

Từ Câu hỏi thường gặp , những lợi thế chính là:

  • cam kết với độ chi tiết tốt
  • giúp bạn giữ một sửa đổi không giới hạn trong cây của mình trong một thời gian dài hợp lý
  • thực hiện một số bước nhỏ cho một cam kết, kiểm tra những gì bạn đã làm với git diffvà xác thực từng bước nhỏ với git addhoặc git add -u.
  • cho phép quản lý xuất sắc của các cuộc xung đột hợp nhất: git diff --base, git diff --ours, git diff --theirs.
  • chỉ cho phép git commit --amendsửa đổi thông báo nhật ký nếu chỉ mục chưa được sửa đổi trong thời gian chờ đợi

Cá nhân tôi nghĩ hành vi này không nên là mặc định, bạn muốn mọi người cam kết một cái gì đó đã được kiểm tra hoặc ít nhất là được biên dịch

Mặc dù bạn nói chung là đúng (về phần "đã được kiểm tra hoặc biên dịch"), cách Git cho phép bạn phân nhánh và hợp nhất (hái quả anh đào hoặc phục hồi) cho phép bạn cam kết thường xuyên như bạn muốn trong một nhánh riêng tạm thời (chỉ được đẩy vào kho lưu trữ "sao lưu" từ xa), trong khi thực hiện lại những "cam kết xấu xí" đó trên một nhánh công cộng, với tất cả các thử nghiệm phù hợp.


1
Về cơ bản, không có gì "git-ish" trong chỉ mục, hg có thể sử dụng một chỉ mục nếu nó được coi là có giá trị, trên thực tế, mq hoặc giá đỡ đã làm một phần của điều đó. Tôi nghĩ rằng hành vi này không nên là mặc định, bạn muốn mọi người cam kết một cái gì đó đã được thử nghiệm hoặc ít nhất là được biên dịch.
tonfa 20/09/09

2
Về những gì có trong chỉ mục Git, hãy xem stackoverflow.com/questions/4084921/…
VonC

Trong Mercurial lần cam kết cuối cùng của bạn (trước khi đẩy) hoạt động giống như chỉ mục của git. Bạn có thể sửa đổi nó, khôi phục nó, thay đổi thông báo cam kết hoặc hoàn thiện nó bằng cách thay đổi giai đoạn của nó thành công khai.
Ruslan Yushchenko

12

Không kiên định:

hg init . # start a project in the current directory
hg addremove # look for any added or deleted files
hg commit -m "comment" # commit any uncomitted changes
hg status # what have i changed since the last commit?

Tương đương Git:

git init
git add -A
git commit -am "comment" # -a is not necessary along with the above add -A
git status

1
Tôi (và tôi nghĩ rằng hầu hết người dùng git) sử dụng git add -unhiều hơn -A; -u sẽ thay đổi giai đoạn cho tất cả các tệp được theo dõi, bỏ qua các tệp mới chưa được theo dõi.
u0b34a0f6ae

3
nhưng addremove thêm file untracked mới :)
tonfa

3
Tôi không đồng ý với điều đó git statuslà tương đương với hg status. Tôi là người mới trong Hg và đã không quản lý để có được trạng thái của hg hoạt động tương tự như của Git.
Léo Léopold Hertz 준영

1

Nó gần giống nhau, không có addremove:

git init # Start a project in the current directory
git status # Displays both changes and added/removed files
git commit -m "comment" # commit any uncommited changes

Tuy nhiên, đây là những lệnh bạn sẽ sử dụng khi làm việc một mình. Bạn tham gia vào những thứ gọn gàng khi bạn muốn hợp nhất các thay đổi của mình với công việc của người khác bằng git pullgit pushvà các lệnh liên quan.


và trên hết, hãy sử dụng "git show" (giống như "git diff" mà tôi tin tưởng) để xem bạn đã thay đổi những gì kể từ lần cam kết cuối cùng.
PHLAK 20/09/09

2
"git show" (không có args) cho bạn thấy những thay đổi trong lần cam kết cuối cùng. "git diff" hiển thị cho bạn những thay đổi kể từ lần cam kết cuối cùng.
Dustin 20/09/09
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.