Có nhất thiết phải làm việc trên một số lỗi cùng một lúc không? Và bởi "cùng một lúc", ý tôi là "có các tệp được chỉnh sửa cho nhiều lỗi cùng một lúc." Bởi vì trừ khi bạn thực sự cần điều đó, tôi chỉ làm việc với một lỗi tại một thời điểm trong môi trường của bạn. Bằng cách đó, bạn có thể sử dụng các nhánh & rebase cục bộ, điều mà tôi thấy dễ dàng hơn nhiều so với việc quản lý một stash / giai đoạn phức tạp.
Giả sử chủ nhân đang cam kết B. Bây giờ hãy làm việc với lỗi # 1.
git checkout -b bug1
Bây giờ bạn đang ở nhánh bug1. Thực hiện một số thay đổi, cam kết, chờ xem xét mã. Đây là địa phương, vì vậy bạn không ảnh hưởng đến bất kỳ ai khác và nó đủ dễ để tạo một bản vá từ git diffs.
A-B < master
\
C < bug1
Bây giờ bạn đang làm việc trên bug2. Quay về làm chủ với git checkout master
. Tạo một chi nhánh mới git checkout -b bug2
,. Thực hiện thay đổi, cam kết, chờ xem xét mã.
D < bug2
/
A-B < master
\
C < bug1
Hãy giả vờ rằng người khác cam kết E & F trên chủ trong khi bạn đang chờ xem xét.
D < bug2
/
A-B-E-F < master
\
C < bug1
Khi mã của bạn đã được phê duyệt, bạn có thể khởi động lại để làm chủ với các bước sau:
git checkout bug1
git rebase master
git checkout master
git merge bug1
Điều này sẽ dẫn đến kết quả như sau:
D < bug2
/
A-B-E-F-C' < master, bug1
Sau đó, bạn có thể đẩy, xóa chi nhánh bug1 cục bộ của mình và tắt đi. Một lỗi tại một thời điểm trong không gian làm việc của bạn, nhưng với việc sử dụng các nhánh cục bộ, kho lưu trữ của bạn có thể xử lý nhiều lỗi. Và điều này tránh được một điệu nhảy / stash phức tạp.
Trả lời câu hỏi của ctote trong các bình luận:
Chà, bạn có thể quay lại stash cho mỗi lỗi và chỉ hoạt động với một lỗi tại một thời điểm. Atleast giúp bạn tiết kiệm các vấn đề dàn dựng. Nhưng đã thử điều này, cá nhân tôi thấy nó thật rắc rối. Stash là một chút lộn xộn trong một biểu đồ nhật ký git. Và quan trọng hơn, nếu bạn làm hỏng cái gì đó, bạn không thể hoàn nguyên. Nếu bạn có một thư mục làm việc bẩn và bạn bật stash, bạn không thể "hoàn tác" cửa sổ bật lên đó. Khó hơn nhiều để làm hỏng các cam kết hiện có.
Vì vậy git rebase -i
.
Khi bạn rebase một nhánh lên nhánh khác, bạn có thể thực hiện nó một cách tương tác (cờ -i). Khi bạn làm điều này, bạn có tùy chọn để chọn những gì bạn muốn làm với mỗi cam kết. Pro Git là một cuốn sách tuyệt vời cũng trực tuyến ở định dạng HTML và có một phần hay về việc đánh lại & bẹp:
http://git-scm.com/book/ch6-4.html
Tôi sẽ đánh cắp nguyên văn ví dụ của họ để thuận tiện. Giả sử bạn có lịch sử cam kết sau đây và bạn muốn rebase & squash bug1 lên master:
F < bug2
/
A-B-G-H < master
\
C-D-E < bug1
Đây là những gì bạn sẽ thấy khi bạn gõ git rebase -i master bug1
pick f7f3f6d changed my name a bit
pick 310154e updated README formatting and added blame
pick a5f4a0d added cat-file
#
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
Để xóa tất cả các cam kết của một nhánh thành một cam kết duy nhất, hãy giữ cam kết đầu tiên là "chọn" và thay thế tất cả các mục "chọn" tiếp theo bằng "squash" hoặc đơn giản là "s". Bạn cũng sẽ có cơ hội thay đổi thông điệp cam kết.
pick f7f3f6d changed my name a bit
s 310154e updated README formatting and added blame
s a5f4a0d added cat-file
#
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
Vì vậy, yeah, squashing là một chút đau đớn, nhưng tôi vẫn sẽ khuyên bạn nên sử dụng quá nhiều stash.