Git เทียบเท่ากับคำสั่ง Mercurial ทั่วไปหรือไม่?


90

ฉันใช้ Mercurial มาแล้ว แต่อยากจะสาธิต Git อย่างรวดเร็ว

Git เทียบเท่ากับอะไร:

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
ฉันอยากรู้อยากเห็นตารางที่แสดงคำสั่งที่เทียบเท่ากันทั้งหมดระหว่างอย่างน้อย DVCS ที่เป็นที่นิยมหากมีใครเกิดขึ้นในขณะที่หาคำตอบที่นี่ ฉันไม่พบในการค้นหาโดย Google อย่างรวดเร็ว
Mark Rushakoff

คำตอบ:


105

หิน Git-HG rosetta นั้นไม่เลว

มี gotcha อื่น ๆ อีกสองสามอย่างระหว่างทั้งสองที่ไม่ได้กล่าวถึงที่นั่น รายการนี้ถูกคัดลอกมาจากบล็อกโพสต์ของฉันเองเมื่อฉันไปทางอื่น (git -> hg)

Hg .hgignore , syntax: glob เป็นลักษณะการทำงานเดียวกันกับ. gitignore ของ git

Git .git/config , ~/.gitconfigใช้คอมไพล์-config การปรับเปลี่ยนค่า
ปรอท .hg/hgrc , ~/.hgrcการใช้งานhg 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 ไม่ได้จัดส่ง GUI เพื่อเลือกชุดการเปลี่ยนแปลงเฉพาะhg recordคำสั่งคอนโซล

Git git rebase<br> ปรอท ปรอท rebase เนื่องจากgit rebase --interactiveมีhg histeditหรือ Mercurial Queues

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 . ;หมายเหตุจุด
Hg hg add ;ไม่จำเป็นต้องมีจุด

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


เพียงเพื่อเติมช่องว่างคำสั่งที่มีประโยชน์ที่สุดจาก Mercurial:

Hg hg record
Git git add -p; git commit

Hg hg inc [URL]
Gitไม่เทียบเท่าจริง คุณสามารถทำได้เทียบเท่ากับhg pull; hg log -r .:

Hg hg out URL
Gitกรุณาเพิ่มถ้าคุณรู้วิธี

สำหรับการรวมการแก้ไขข้อขัดแย้งhg resolveคำสั่งใน Mercurial มีตัวเลือกสองสามตัวที่เปลี่ยนลักษณะการทำงาน:

Hg hg resolve -m FILE (ทำเครื่องหมายไฟล์ว่าได้รับการแก้ไขแล้วโดยแก้ไขปัญหาความขัดแย้งด้วยตนเอง)
Git git add FILE

Hg hg resolve -u FILEทำเครื่องหมายไฟล์ว่ายังไม่ได้รับการแก้ไข
Git git reset HEAD FILEเพื่อยกเลิกขั้นตอนของไฟล์

Hg hg resolve -l (แสดงรายการไฟล์ที่มีข้อขัดแย้งที่แก้ไขแล้ว / ไม่ได้รับการแก้ไข)
Git git status - ไฟล์ที่รวมเข้าด้วยกันจะถูกเพิ่มลงในดัชนีโดยอัตโนมัติไฟล์ที่ไม่มีความขัดแย้ง

Hg hg resolve FILE (หลังจากการผสานพยายามที่จะรวมไฟล์อีกครั้ง)
Gitไม่เทียบเท่าสำหรับการรวมซ้ำที่ฉันรู้จัก


4
บางทีนี่อาจเป็นวิกิ
Keyo

1
สำหรับ gitk มีโคลนกราฟิกสำหรับ Mercurial, hgview (โปรดทราบว่ามันแตกต่างจากคำสั่ง "hg view")
tonicebrian

1
ข้อเสนอแนะเล็กน้อย: การสลับข้อความ Hg และ Git รอบ ๆ (เนื่องจากเป็น Git สำหรับผู้ใช้ Mercurial)
Chris S

1
แม้ว่าhg recordจะไม่เป็นมิตรกับผู้ใช้มากนักhg crecord(จากส่วนขยาย crecord ) เป็น UI ข้อความตามคำสาปที่ใช้งานง่ายมาก
Denilson Sá Maia

1
@ ozzy432836 ฉันไม่ได้ใช้ Hg มาหลายปีแล้ว แต่ฉันคิดว่าสิ่งเหล่านี้เป็นค่าที่เทียบเท่า FWIW การดำเนินการเริ่มต้นhg resolveเป็นหนึ่งในเหตุผลที่ฉันชอบ git โดยค่าเริ่มต้นhg resolveจะทำลายการผสานที่แก้ไขด้วยตนเองของคุณหากคุณไม่ผ่านข้อโต้แย้ง!
richq

50

หมายเหตุ: หนึ่งในความแตกต่างที่ใหญ่ที่สุดระหว่าง Git และ Mercurial คือการแสดงตนที่ชัดเจนของดัชนีหรือการแสดงละครในพื้นที่

จากMercurial สำหรับผู้ใช้ Git :

Git เป็นDistributedSCMเดียวที่แสดงแนวคิดของดัชนีหรือพื้นที่จัดเตรียม ผู้อื่นอาจนำไปใช้และซ่อนไว้ แต่ในกรณีอื่นผู้ใช้ไม่ทราบและไม่ต้องจัดการกับมัน

การเทียบเท่าคร่าวๆของ Mercurial คือสิ่งDirStateที่ควบคุมข้อมูลสถานะการคัดลอกการทำงานเพื่อกำหนดไฟล์ที่จะรวมในคอมมิตถัดไป แต่ไม่ว่าในกรณีใดไฟล์นี้จะได้รับการจัดการโดยอัตโนมัติ
นอกจากนี้ยังมีความเป็นไปได้ที่จะเลือกได้มากขึ้นในเวลาคอมมิตโดยการระบุไฟล์ที่คุณต้องการคอมมิตในบรรทัดคำสั่งหรือโดยใช้ไฟล์RecordExtension.

หากคุณรู้สึกอึดอัดในการจัดการกับดัชนีคุณกำลังเปลี่ยนไปในทางที่ดีขึ้น ;-)


เคล็ดลับคือคุณต้องเข้าใจดัชนีเพื่อใช้ประโยชน์จาก Git อย่างเต็มที่ เนื่องจากบทความนี้ตั้งแต่เดือนพฤษภาคม 2549เตือนเราแล้ว (และตอนนี้ก็ยังเป็นจริง):

“ ถ้าคุณปฏิเสธดัชนีแสดงว่าคุณปฏิเสธคอมไพล์ตัวเองจริงๆ”

ตอนนี้บทความนั้นมีคำสั่งมากมายซึ่งตอนนี้ใช้งานง่ายกว่า (ดังนั้นอย่าพึ่งพาเนื้อหามากเกินไป;)) แต่แนวคิดทั่วไปยังคงอยู่:

คุณกำลังดำเนินการกับคุณลักษณะใหม่และเริ่มทำการแก้ไขเล็กน้อยในไฟล์

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

ณ จุดนี้การคอมมิตครั้งต่อไปของคุณจะดำเนินการแก้ไขเล็กน้อย 2 รายการในสาขาปัจจุบัน

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

$ git commit

บันทึกเฉพาะการเปลี่ยนแปลงที่เพิ่มลงในพื้นที่การจัดเตรียม (ดัชนี) ณ จุดนี้ไม่ใช่การเปลี่ยนแปลงหลักที่ปรากฏในไดเร็กทอรีการทำงานของคุณ

$ git branch newFeature_Branch
$ git add myFile

การคอมมิตครั้งต่อไปจะบันทึกการเปลี่ยนแปลงที่สำคัญอื่น ๆ ทั้งหมดใน 'newFrature_Branch' สาขาใหม่

ตอนนี้การเพิ่มแบบโต้ตอบหรือแม้กระทั่งการแยกคอมมิตเป็นคุณสมบัติที่ใช้ได้กับ Mercurial ผ่านhg recordคำสั่ง '' หรือส่วนขยายอื่น ๆ : คุณจะต้องติดตั้งRecordExtensionหรือCrecordExtension .
แต่นี่ไม่ใช่ส่วนหนึ่งของเวิร์กโฟลว์ปกติสำหรับ Mercurial

Git ดูคอมมิตเป็นชุดของ " การเปลี่ยนแปลงเนื้อหาไฟล์ " และให้คุณเพิ่มการเปลี่ยนแปลงเหล่านั้นทีละรายการ
คุณควรศึกษาว่าคุณลักษณะและผลของมัน: ส่วนใหญ่ของการใช้พลังงาน Git (เช่นความสามารถในการย้อนกลับผสาน (หรือแบ่งครึ่งปัญหาหรือย้อนกลับไปกระทำ) , ตรงกันข้ามกับ Mercurial ) มาจากที่ "เนื้อหาของแฟ้ม" กระบวนทัศน์


ตันฟา (ในโปรไฟล์: "Hg dev, pythonist": figures ... ) ในความคิดเห็น:

ไม่มีอะไรโดยพื้นฐาน "git-ish" ในดัชนี hg สามารถใช้ดัชนีได้หากเห็นว่ามีคุณค่าในความเป็นจริงmqหรือshelveเป็นส่วนหนึ่งของสิ่งนั้นอยู่แล้ว

โอ้เด็ก. ที่นี่เราไปอีกครั้ง

อย่างแรกฉันไม่ได้มาที่นี่เพื่อทำให้เครื่องมือหนึ่งดูดีกว่าอีกเครื่องมือหนึ่ง ฉันพบว่า Hg ยอดเยี่ยมใช้งานง่ายมากพร้อมการสนับสนุนที่ดี (โดยเฉพาะบน Windows ซึ่งเป็นแพลตฟอร์มหลักของฉันแม้ว่าฉันจะทำงานบน Linux และ Solaris8 หรือ 10 ด้วยก็ตาม)

ดัชนีอยู่ด้านหน้าและตรงกลางในแบบที่Linus Torvalds ทำงานร่วมกับ VCS :

Git ใช้การอัปเดตดัชนีที่ชัดเจนตั้งแต่วันที่ 1 ก่อนที่จะทำการรวมครั้งแรก เป็นเพียงวิธีที่ฉันทำงานมาตลอด ฉันมักจะมีต้นไม้สกปรกโดยมีแพทช์แบบสุ่มในทรีที่ฉันไม่ต้องการกระทำเพราะเป็นเพียงการอัปเดต Makefile สำหรับเวอร์ชันถัดไป

ตอนนี้การรวมกันของดัชนี (ซึ่งไม่ใช่ความคิดที่เห็นเฉพาะใน Git) และกระบวนทัศน์ "content is king" ทำให้มีลักษณะเฉพาะและ "git-ish" :

git เป็นตัวติดตามเนื้อหาและชื่อไฟล์ไม่มีความหมายเว้นแต่จะเชื่อมโยงกับเนื้อหา ดังนั้นลักษณะการทำงานที่ดีเพียงอย่างเดียวสำหรับ git add filename คือการเพิ่มเนื้อหาของไฟล์รวมทั้งชื่อลงในดัชนี

หมายเหตุ: "เนื้อหา" ที่นี่กำหนดไว้ดังนี้ :

ดัชนีของ Git นั้นถูกกำหนดไว้เป็นอย่างมาก

  • เพียงพอที่จะมี " เนื้อหา " ทั้งหมดของโครงสร้าง (ซึ่งรวมถึงข้อมูลเมตาทั้งหมด: ชื่อไฟล์โหมดและเนื้อหาของไฟล์ล้วนเป็นส่วนหนึ่งของ "เนื้อหา" และทั้งหมดนี้ไม่มีความหมายในตัวของมันเอง! )
  • ข้อมูล "stat" เพิ่มเติมเพื่อให้สามารถเพิ่มประสิทธิภาพการเปรียบเทียบระบบไฟล์ที่ชัดเจนและไม่สำคัญ (แต่สำคัญอย่างยิ่ง!)

ดังนั้นคุณควรดูดัชนีเป็นเป็นเนื้อหา

เนื้อหาไม่ใช่ "ชื่อไฟล์" หรือ "เนื้อหาไฟล์" เป็นส่วนแยกต่างหาก คุณไม่สามารถแยกทั้งสองอย่างออกจากกันได้
ชื่อไฟล์ด้วยตัวเองก็ไม่สมเหตุสมผล (ต้องมีเนื้อหาไฟล์ด้วย) และเนื้อหาไฟล์ในตัวเองก็ไร้เหตุผลเช่นเดียวกัน (คุณต้องรู้วิธีเข้าถึง)

สิ่งที่ฉันพยายามจะบอกคือโดยพื้นฐานแล้ว git ไม่อนุญาตให้คุณเห็นชื่อไฟล์ที่ไม่มีเนื้อหา ความคิดทั้งหมดเป็นบ้าและไม่ถูกต้อง ไม่มีความเกี่ยวข้องกับ "ความเป็นจริง"

จากคำถามที่พบบ่อยข้อดีหลัก ๆ คือ:

  • กระทำด้วยความละเอียด
  • ช่วยให้คุณสามารถปรับเปลี่ยนต้นไม้ของคุณโดยไม่ได้ตั้งใจเป็นเวลานานพอสมควร
  • ดำเนินการขั้นตอนเล็ก ๆ หลายขั้นตอนสำหรับการคอมมิตเดียวตรวจสอบสิ่งที่คุณทำgit diffและตรวจสอบความถูกต้องของแต่ละขั้นตอนย่อยด้วยgit addหรือgit add -uหรือ
  • git diff --baseช่วยให้การจัดการที่ดีของความขัดแย้งผสาน: git diff --ours, git diff --theirs,
  • อนุญาตให้git commit --amendแก้ไขเฉพาะข้อความบันทึกหากดัชนียังไม่ได้รับการแก้ไขในระหว่างนี้

โดยส่วนตัวแล้วฉันคิดว่าพฤติกรรมนี้ไม่ควรเป็นค่าเริ่มต้นคุณต้องการให้ผู้คนกระทำสิ่งที่ผ่านการทดสอบหรืออย่างน้อยก็รวบรวม

ในขณะที่คุณพูดถูกโดยทั่วไป (เกี่ยวกับส่วน "ทดสอบหรือคอมไพล์") วิธีที่ Git ช่วยให้คุณสามารถแยกสาขาและรวม (การเลือกเชอร์รี่หรือการรีเบต) ช่วยให้คุณสามารถคอมมิตได้บ่อยเท่าที่คุณต้องการในสาขาส่วนตัวชั่วคราว (ผลักดันเท่านั้น ไปยังที่เก็บ "สำรองข้อมูล" ระยะไกล) ในขณะที่ทำ "การกระทำที่น่าเกลียด" เหล่านั้นซ้ำในสาขาสาธารณะโดยมีการทดสอบที่ถูกต้องทั้งหมด


1
โดยพื้นฐานแล้วไม่มีอะไร "git-ish" ในดัชนี hg สามารถใช้ดัชนีได้หากเห็นว่ามีคุณค่าในความเป็นจริง mq หรือ Shelve ก็เป็นส่วนหนึ่งของสิ่งนั้นอยู่แล้ว ฉันคิดว่าพฤติกรรมนี้ไม่ควรเป็นค่าเริ่มต้นคุณต้องการให้ผู้คนกระทำสิ่งที่ผ่านการทดสอบหรืออย่างน้อยก็รวบรวม
tonfa

2
เกี่ยวกับสิ่งที่อยู่ในดัชนี Git ดูที่stackoverflow.com/questions/4084921/…
VonC

ใน Mercurial คอมมิตสุดท้ายของคุณ (ก่อนพุช) ทำหน้าที่เหมือนดัชนีของคอมไพล์ คุณสามารถแก้ไขย้อนกลับเปลี่ยนข้อความคอมมิตหรือสรุปได้โดยเปลี่ยนเฟสเป็นสาธารณะ
Ruslan Yushchenko

12

ปรอท:

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?

เทียบเท่า Git:

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

1
ฉัน (และฉันคิดว่าผู้ใช้ git ส่วนใหญ่) ใช้git add -uมากกว่า-A; -u จะดำเนินการเปลี่ยนแปลงสำหรับไฟล์ที่ติดตามทั้งหมดโดยไม่สนใจไฟล์ที่ไม่ได้ติดตามใหม่
u0b34a0f6ae

3
แต่ addremove เพิ่มไฟล์ใหม่ที่ไม่ได้ติดตาม :)
tonfa

3
ผมเห็นด้วยกับที่เทียบเท่ากับgit status hg statusฉันเป็นคนใหม่ใน Hg และไม่ได้รับการจัดการเพื่อให้สถานะของ hg ทำงานได้เช่นเดียวกับ Git
LéoLéopold Hertz 준영

1

มันใกล้เคียงกันโดยไม่ต้อง 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

อย่างไรก็ตามนี่เป็นคำสั่งที่คุณจะใช้เมื่อทำงานคนเดียว คุณเข้าสู่สิ่งที่เรียบร้อยเมื่อคุณต้องการรวมการเปลี่ยนแปลงของคุณกับงานของคนอื่นด้วยgit pullและgit pushและคำสั่งที่เกี่ยวข้อง


และปิดท้ายด้วยการใช้ "git show" (เหมือนกับ "git diff" ที่ฉันเชื่อ) เพื่อดูสิ่งที่คุณเปลี่ยนแปลงไปตั้งแต่การคอมมิตครั้งล่าสุด
PHLAK

3
"git show" (โดยไม่มี args) จะแสดงการเปลี่ยนแปลงในการคอมมิตล่าสุด "git diff" แสดงให้คุณเห็นการเปลี่ยนแปลงตั้งแต่การกระทำครั้งสุดท้าย
Dustin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.