2009-06-04 32 views
49

Tôi mới bắt đầu sử dụng Git cùng với Mercurial để làm quen với Git.git tương đương với hg mq?

Tôi sử dụng phần mở rộng mq trong Mercurial rộng rãi để quản lý các bản vá lỗi cục bộ và tôi đang tìm kiếm một Git tương đương.

Tôi có nên sử dụng chi nhánh Git không? Hoặc có cách nào tốt hơn để quản lý các bản vá lỗi cục bộ cho phép dễ dàng áp dụng và xóa các bản vá lỗi không?

Xin cảm ơn,

+0

điều là chúng ta cần những thứ như vậy trong git vào một dịp rất hiếm. – shabunc

Trả lời

28

Kiểm tra phần "Lớp giao diện quản lý vá" trên trang Wiki Git. Có được liệt kê hai giao diện quản lý bản vá, tương đương với 'mq' Mercurials mở rộng:

  • StGIT (xếp chồng Git), cũ của hai, được viết bằng Python, sử dụng hai ảnh chụp nhanh để đại diện cho bản vá
  • Guilt (trước đây là 'gq'), được viết dưới dạng chuỗi các tập lệnh bash, tệp chuỗi và các bản vá (mỗi tệp một) được lưu trữ dưới dạng tệp văn bản thuần túy.
  • pg (Patchy Git) là không được dùng nữa và không còn được duy trì.

Nhưng nếu bạn không cần sử dụng nâng cao hơn, bạn có thể sử dụng thay thế "git rebase --interactive" để sắp xếp lại, chỉnh sửa và phân tách các bản vá lỗi. Và để quản lý chi nhánh của bạn chống lại phiên bản hiện tại của thượng lưu, "git rebase" thường là đủ.

+1

Bạn có thể đặt tên một trong những "tập quán nâng cao" này không? Tôi nghĩ rằng 'git rebase --interactive' khá nhiều loại bỏ sự cần thiết cho một cái gì đó như Mq. – kizzx2

+7

** @ kizzx2: ** 'git rebase --interactive' buộc bạn phải xử lý toàn bộ chuỗi theo thứ tự. Với giao diện quản lý bản vá, bạn có thể dễ dàng chuyển qua lại giữa các bản vá để chỉnh sửa chúng. Bạn cũng có thể xem lịch sử của một thay đổi để vá, thêm cam kết mới ở giữa loạt, anh đào chọn cam kết khác, vv –

+1

@ jakub, không 'git checkout' sẽ cho phép bạn đi qua lại giữa các cam kết? Có gì dễ dàng như vậy về việc quản lý các bản vá lỗi. Toàn bộ điểm git, là việc đi bộ xuyên suốt cam kết thật dễ dàng. –

7

Git không thực sự cung cấp tính năng này. Tùy thuộc vào cách sử dụng của bạn, bạn có thể nhận được bằng "git stash" và/hoặc các nhánh, nhưng nó sẽ khá cơ bản. Nếu mọi người có nhu cầu quản lý bản vá nâng cao hơn với git, họ dường như chuyển sang Quilt hoặc StGit: xem http://git.or.cz/gitwiki/PatchManagement

9

Chỉ cần sử dụng một chi nhánh và đặt lại chi nhánh đó vào nhánh thượng nguồn của bạn thường xuyên. Điều này dễ quản lý và an toàn hơn so với việc sử dụng mq (mà tôi đã mất dữ liệu trong quá khứ).

31

Tuyên bố từ chối trách nhiệm: Tôi không phải là người dùng hg, vì vậy tôi đã đọc về hg nhưng không có nhiều kinh nghiệm đầu tiên về việc sử dụng nó.

git cung cấp một số công cụ rất mạnh mẽ và linh hoạt để quản lý các chi nhánh theo kiểu 'hàng đợi bản vá' cho nhiều trường hợp sử dụng cơ bản (và thậm chí một số phức tạp), git gốc đủ mạnh.

Thông thường, hầu hết các dự án đều giữ một nhánh chính ổn định ở trung tâm chỉ nhận được các cam kết mới và không bao giờ được 'tua lại' để cam kết trong nhánh chính được cố định.

Trên đầu trang của một người duy trì (hoặc một nhà phát triển) có thể duy trì một hoặc nhiều nhánh lỏng của các bản vá đang hoạt động (tức là cam kết) dựa trên nhánh ổn định.

hoạt động quản lý bản vá điển hình bao gồm:

rebasing hàng đợi bản vá vào nhánh ổn định mới nhất - sử dụng git rebase,

sao chép hàng đợi bản vá vào một chi nhánh maintentance cũ - sử dụng git branchgit rebase,

sắp xếp lại các bản vá lỗi trong hàng đợi - sử dụng git rebase --interactive (aka git rebase -i) bằng cách sử dụng trình chỉnh sửa văn bản để sắp xếp lại hàng đợi.

bản vá lỗi đè bẹp - sử dụng git rebase -i với chỉ thị bí

bản vá lỗi làm biến đổi hay vá cam messages - sử dụng git rebase -i (tại chỗ một chủ đề?) Với các chỉnh sửa chỉ thị.

Bất kỳ hoạt động nào thay đổi bản vá theo bất kỳ cách nào (tức là nội dung, mô tả hoặc nguồn gốc) sẽ tạo một cam kết mới với id cam kết mới cho bản vá đó. Thực tế là các cam kết cũ có thể bị vứt bỏ và thay thế thường xuyên trước khi chúng được đẩy vào nhánh master ổn định là thứ duy nhất làm cho chúng trở thành 'hàng đợi vá' thay vì nhánh, nhưng đây là một quy ước dự án hơn là bất kỳ sự khác biệt vật lý nào trong dữ liệu tạo nên các cam kết. Để git chúng là đối tượng giống nhau.

Để quảng bá bản vá cho cam kết 'thực' chỉ cần di chuyển bản vá đến trước hàng đợi và hợp nhất nó vào nhánh chính. Sau khi di chuyển bản vá đến trước hàng đợi, nó chỉ giống như một cam kết bình thường dựa trên nhánh chính, vì vậy việc sáp nhập nó chỉ cần chuyển tiếp nhanh nhánh trỏ nhánh tới điểm cam kết vá.

Xuất bản cam kết này dưới dạng bản vá chính 'ổn định' là hành động cho biết: đây là cam kết sẽ không thay đổi và là một phần của lịch sử bất biến của dự án.

+0

Tôi thường sử dụng Mercurial, nhưng đây có lẽ là mô tả tốt nhất về các nhánh git hợp lý mà tôi đã thấy. Cảm ơn! :) – rpjohnst

+2

Một tính năng của Hàng đợi Mercurial mà tôi sử dụng rộng rãi trong một dự án là "xuất" chúng bằng cách sao chép thư mục .hg/patches. Có thể lưu trữ và quản lý các bản vá lỗi bên ngoài từ repo là rất quan trọng. Phải thừa nhận rằng việc sử dụng này rất bất thường, nhưng git có bất kỳ thứ gì cung cấp chức năng tương tự không? –

+0

@PaulMoore Chỉ cần thực hiện 'git format-patch' trên các bản vá bạn muốn xuất, thậm chí có thể lưu chúng vào tệp mbox nếu bạn muốn, vì vậy bạn có thể thực hiện một' git am' để áp dụng tất cả chúng cùng một lúc . – kyrias

Các vấn đề liên quan