Từ sách GCM SCM :
Thông thường, khi bạn đang làm việc trên một phần của dự án, mọi thứ ở trong tình trạng lộn xộn và bạn muốn chuyển đổi chi nhánh một chút để làm việc khác. Vấn đề là, bạn không muốn thực hiện một công việc nửa vời chỉ để bạn có thể quay lại điểm này sau. Câu trả lời cho vấn đề này là lệnh git stash.
Stashing có trạng thái bẩn trong thư mục làm việc của bạn - nghĩa là, các tệp được theo dõi đã sửa đổi của bạn và thay đổi theo giai đoạn - và lưu nó vào một đống các thay đổi chưa hoàn thành mà bạn có thể áp dụng lại bất cứ lúc nào.
Đưa ra mô tả này, tôi sẽ nói đây là một mô hình chống. Một lời giải thích quá đơn giản về Git Stash sẽ là "Cắt và Dán" kiểm soát nguồn. Bạn lấy một loạt các tệp đã thay đổi, "bỏ" chúng trong một cây bút bên ngoài quy trình phân nhánh thông thường của Git, và sau đó áp dụng lại những thay đổi đó cho một nhánh khác vào một ngày sau đó.
Quay trở lại xa hơn một chút, cam kết làm chủ là mô hình chống ở đây. Sử dụng cành cây. Đó là những gì họ được thiết kế cho.
Nó thực sự nắm bắt được điều này:
Bạn có thể đóng đinh vít vào tường và nó sẽ giữ một bức tranh, nhưng sử dụng tuốc nơ vít là điều bạn nên làm. Đừng dùng búa khi tuốc nơ vít ngồi ngay bên cạnh bạn.
Về việc cam kết mã "bị hỏng"
Trong khi sau đây là ý kiến, tôi đã đến ý kiến này từ kinh nghiệm.
Cam kết sớm, và cam kết thường xuyên. Cam kết nhiều mã bị hỏng như bạn muốn. Xem lịch sử cam kết địa phương của bạn dưới dạng "lưu điểm" trong khi bạn hack đi thứ gì đó. Khi bạn đã hoàn thành công việc hợp lý, hãy cam kết. Chắc chắn nó có thể phá vỡ mọi thứ, nhưng điều đó không quan trọng miễn là bạn không thúc đẩy những cam kết đó. Trước khi đẩy, rebase và đè bẹp cam kết của bạn.
- Tạo chi nhánh mới
- Hack hack hack
- Cam kết mã bị hỏng
- Đánh bóng mã và làm cho nó hoạt động
- Cam kết mã làm việc
- Rebase và Squash
- Kiểm tra
- Đẩy khi các bài kiểm tra đang trôi qua
Đối với OP, chuỗi thông điệp hạt nhân Linux này có thể được quan tâm, bởi vì nó nghe có vẻ giống như một số thành viên trong nhóm của OP đang sử dụng Git theo cách tương tự.
@RibaldEddie nói trong một bình luận dưới đây:
Trước hết, một stash không nằm ngoài "quy trình phân nhánh" vì dưới mui xe, stash chỉ là một nhánh khác.
(có nguy cơ phát sinh cơn thịnh nộ của nhiều người)
Linus nói:
Với "git stash", bạn cũng có thể có nhiều thứ được sắp xếp khác nhau, nhưng chúng không xếp hàng với nhau - chúng chỉ là các bản vá độc lập ngẫu nhiên mà bạn đã bỏ đi vì đôi khi chúng bất tiện.
Điều tôi nghĩ @RibaldEddie đang cố gắng nói là bạn có thể sử dụng git stash
trong quy trình làm việc của nhánh tính năng - và điều này là đúng. Đó không phải git stash
là vấn đề. Nó là sự kết hợp của cam kết để làm chủ và sử dụng git stash
. Đây là một mô hình chống.
Làm rõ git rebase
Từ bình luận của @ RibaldEddie:
Rebasing giống như dán sao chép và thậm chí tệ hơn sửa đổi lịch sử đã cam kết.
(Nhấn mạnh của tôi)
Sửa đổi lịch sử cam kết không phải là một điều xấu, miễn là lịch sử cam kết cục bộ . Nếu bạn rebase cam kết rằng bạn đã đẩy, về cơ bản bạn sẽ mồ côi bất cứ ai khác sử dụng chi nhánh của bạn. Điều này tệ đây.
Bây giờ, giả sử bạn đã thực hiện một số cam kết trong suốt một ngày. Một số cam kết là tốt. Một số ... không tốt lắm. Các git rebase
lệnh kết hợp với cán nát cam kết của bạn là một cách tốt để làm sạch cam kết lịch sử địa phương của bạn. Thật tuyệt khi hợp nhất trong một cam kết với các chi nhánh công cộng vì nó giữ cho lịch sử cam kết của các chi nhánh được chia sẻ của nhóm của bạn sạch sẽ. Sau khi khởi động lại, bạn sẽ muốn kiểm tra lại, nhưng nếu các bài kiểm tra vượt qua thì bạn có thể đẩy một cam kết sạch thay vì một vài lần bẩn.
Có một luồng Linux Kernel thú vị khác về lịch sử cam kết sạch .
Một lần nữa, từ Linus:
Tôi muốn lịch sử sạch, nhưng điều đó thực sự có nghĩa là (a) sạch và (b) lịch sử.
Mọi người có thể (và có lẽ nên) rebase họ tin cây (công việc của mình). Đó là một sự dọn dẹp . Nhưng không bao giờ mã người khác. Đó là một "lịch sử hủy diệt"
Vì vậy, phần lịch sử là khá dễ dàng. Chỉ có một quy tắc chính và một quy định nhỏ:
Bạn không bao giờ phải phá hủy lịch sử các dân tộc khác. Bạn không được phản đối cam kết người khác đã làm. Về cơ bản, nếu nó không có dấu hiệu của bạn trên đó, thì đó là giới hạn: bạn không thể từ chối nó, bởi vì nó không phải là của bạn.
Lưu ý rằng đây thực sự là về lịch sử của những người khác , không phải về mã của những người khác . Nếu họ gửi công cụ cho bạn dưới dạng bản vá được gửi qua email và bạn đã áp dụng nó với "git am -s", thì đó là mã của họ, nhưng đó là
lịch sử của bạn .
Vì vậy, bạn có thể phát cuồng với điều "git rebase" trên đó, mặc dù bạn không viết mã, miễn là bản thân cam kết là quyền riêng tư của bạn.
Làm rõ quy tắc nhỏ: một khi bạn đã xuất bản lịch sử của mình trên một số trang web công cộng, những người khác có thể đang sử dụng nó, và vì vậy bây giờ rõ ràng đó không phải là lịch sử riêng tư của bạn nữa.
Vì vậy, một sự làm rõ nhỏ thực sự là nó không chỉ là về "cam kết của bạn", mà còn về việc nó là riêng tư đối với cây của bạn và bạn chưa đẩy nó ra và công bố nó.
...
Bây giờ phần "sạch" tinh tế hơn một chút, mặc dù các quy tắc đầu tiên khá rõ ràng và dễ dàng:
Giữ lịch sử của riêng bạn có thể đọc được
Một số người làm điều này bằng cách chỉ làm việc trong đầu trước, và không phạm sai lầm. nhưng điều đó rất hiếm, và đối với phần còn lại của chúng tôi, chúng tôi sử dụng "git rebase", vv trong khi chúng tôi làm việc với các vấn đề của mình.
Vì vậy, "git rebase" không sai. Nhưng nó chỉ đúng nếu đó là cây git RIÊNG RIÊNG CỦA BẠN.
Đừng phơi bày chuyện tào lao của bạn.
Điều này có nghĩa là: nếu bạn vẫn đang trong giai đoạn "git rebase", bạn không đẩy nó ra. Nếu nó chưa sẵn sàng, bạn gửi các bản vá xung quanh hoặc sử dụng các cây git riêng (giống như "thay thế loạt bản vá") mà bạn không nói với công chúng nói chung.
(nhấn mạnh của tôi)
Phần kết luận
Cuối cùng, OP có một số nhà phát triển làm điều này:
git checkout master
(edit files)
git commit -am "..."
(edit files)
git stash
git pull
git stash (pop|apply)
Có hai vấn đề ở đây:
- Các nhà phát triển đang cam kết làm chủ. Khóa cái này lại ngay lập tức. Thực sự, đây là vấn đề lớn nhất .
- Các nhà phát triển liên tục sử dụng
git stash
và git pull
làm chủ khi họ nên sử dụng các nhánh tính năng.
Không có gì sai khi sử dụng git stash
- đặc biệt là trước khi kéo - nhưng sử dụng git stash
theo cách này là một kiểu chống khi có quy trình công việc tốt hơn trong Git.
Họ sử dụng git stash
cá trích đỏ. Nó không phải là vấn đề. Cam kết làm chủ là vấn đề.