Tôi có nên sử dụng git stash để lưu các thay đổi liên tục của dự án của mình và đẩy nó lên github để truy cập vào các máy tính khác không?


20

Tôi rất thường xuyên làm việc trên một số tính năng của dự án của mình mà tôi cần nghỉ ngơi trước khi nó đủ tốt cho một cam kết. Tuy nhiên, tôi sử dụng hàng ngày hai máy tính khác nhau để mã hóa (máy tính xách tay và máy tính để bàn nghiên cứu của tôi). Vd: Tôi đang làm việc trên một tính năng ở nhà, sau đó tôi dừng lại và đi đến phòng thí nghiệm của tôi.

Tôi không muốn kết hợp đồng bộ hóa đám mây (ví dụ Dropbox) với theo dõi từ xa GitHub.

Tôi chỉ đơn giản là đã cam kết các trạng thái chưa hoàn thành (và lộn xộn) của mã của mình trước đây (và đẩy nó) chỉ với mục đích kéo mã đó trong máy tính khác để tiếp tục công việc. Tôi khá chắc chắn rằng đây là một thực hành xấu.

Hôm nay, mặc dù, tôi đã đi qua git stashsau khi Googling một chút. Nó có vẻ là giải pháp hoàn hảo cho những gì tôi cần.

Tuy nhiên, tài liệu không nói nếu nó đi vào github một khi tôi đẩy các thay đổi của mình. Bên cạnh đó, tôi muốn biết liệu có cách nào hiệu quả hơn để thực hiện khả năng di động mà tôi cần không.

Cảm ơn trước!


1
Tôi đang bỏ phiếu để đóng câu hỏi này ngoài chủ đề vì nó đã được trả lời trên Stack Overflow
David Arno

5
@DavidArno: Tôi không nghĩ đó là một trang web trùng lặp. Câu hỏi StackOverflow là về "Tôi có thể làm X" không và câu hỏi này là về "Có phải X là một thực hành tốt". Trong rất ít nguyên nhân gốc rễ của câu hỏi là khác nhau.
Greg Burghardt

7
@DavidArno lần cuối tôi kiểm tra, "Đã trả lời trên SO" không phải là lý do để đóng câu hỏi.
RubberDuck

Câu trả lời:


28

Tôi chỉ đơn giản là đã cam kết các trạng thái chưa hoàn thành (và lộn xộn) của mã của mình trước đây (và đẩy nó) chỉ với mục đích kéo mã đó trong máy tính khác để tiếp tục công việc. Tôi khá chắc chắn rằng đây là một thực hành xấu.

Không sao để cam kết công việc còn dang dở. Làm công việc của bạn trong một nhánh chủ đề. Cam kết sớm, và cam kết thường xuyên. Đọc lên khi nào để cam kết mã? cho một số hướng dẫn về khi nào thực hiện một cam kết. Cụ thể cho Git, cam kết với một nhánh chủ đề và đẩy nó thường xuyên như bạn muốn.

Nếu nhánh chủ đề này chỉ dành cho bạn, hãy cam kết và đẩy mã bị hỏng. Bạn chỉ nên trì hoãn việc đẩy mã bị hỏng sang một nhánh được người khác sử dụng. Hãy phá vỡ mã của riêng bạn.


6
Tôi thậm chí còn nói mạnh hơn: không bao giờ làm việc trên nhánh chính, luôn sử dụng nhánh chủ đề. Cam kết với nó khi bạn thấy phù hợp, đẩy nó một cách không sợ hãi. Khi bạn hài lòng với những thay đổi, hãy hợp nhất nó thành chủ.
9000

Lời khuyên tuyệt vời! Tôi nghĩ rằng sự nhầm lẫn lớn có thể xảy ra bởi vì chúng ta cần thêm một nhận xét vào một cam kết, và đôi khi nó thực sự sẽ là một cái gì đó như "nhiệm vụ đang diễn ra" hoặc một cái gì đó tương tự. Và vâng, tôi đang làm việc một mình trong chi nhánh này vì vậy mọi điều bạn nói đều có ý nghĩa!
Leandro

4
Điều này cũng cung cấp cho bạn tùy chọn nén từng cam kết thành một khi hợp nhất nhánh git merge
snoopy

2
@Leandro cam kết thông điệp nên nguyên tử và rõ ràng như có ý nghĩa. Ví dụ: ngay cả khi đó là WIP, bạn có thể nói ví dụ "Thêm bộ điều khiển để xử lý các yêu cầu trang - WIP". Thông điệp cam kết cũng cung cấp một lịch sử có thể tìm kiếm của các thay đổi được thực hiện trong dự án. Mười cam kết của "WIP" sẽ không giúp bất cứ ai tìm kiếm sự thay đổi xung quanh việc xử lý người dùng chẳng hạn.
Ben

7

Stash được dành cho sử dụng cục bộ, như một nơi tạm thời để đặt mọi thứ trong khi bạn lộn xộn với các chi nhánh.

Nếu bạn là người duy nhất làm việc trong một chi nhánh, sẽ không có vấn đề gì với việc cam kết mã bị hỏng. Những gì tôi làm khi trong tình huống tương tự là thực hiện một cam kết bị hỏng, sau đó sau khi kéo nó ở vị trí khác, hãy thực hiện git reset HEAD~1để hoàn tác nó. Tất nhiên, điều này đòi hỏi phải sử dụng --forcetrên pullspusheskhi bạn thay đổi địa điểm.

Hoặc tôi chỉ cần đợi cho đến khi cam kết đầu tiên của tôi và làm a git commit --amend. Hoặc tôi chỉ xóa tất cả các cam kết bị hỏng khi tôi cam kết nhánh tính năng. Hoặc tôi chỉ không lo lắng về một vài cam kết bị phá vỡ rõ ràng trong lịch sử của mình, bởi vì tôi có xu hướng không rời đi cho đến khi tôi ở một nơi dừng chân tốt. Có rất nhiều lựa chọn.


1
Mặc dù vậy, tôi không khuyên bạn nên làm quen với --amendnó để yêu cầu --forceđẩy. Tốt hơn chỉ cam kết với một chi nhánh ném đi.
leftaroundabout

1

stashkhông thực sự thỏa mãn cho bất cứ điều gì ngoài việc làm sạch thư mục công việc của bạn để không làm hỏng chi nhánh của bạn; Nếu bạn không ngay lập tức stash poptrở lại trạng thái thì mọi thứ sẽ trở nên rất khó hiểu.

Nếu có công việc thực tế được lưu, ngay cả khi nó không tốt cho mục repo vĩnh viễn, thì nó vẫn phải là một cam kết. Trên thực tế, tôi không bao giờ để thư mục làm việc của mình ở trạng thái không thuộc quyền kiểm soát phiên bản - Tôi sử dụng một số tập lệnh Python rất đơn giản để lưu mọi thay đổi dưới dạng cam kết tạm thời. Nếu bạn muốn thử, đây là việc cần làm:

  1. Khi bạn đã hoàn thành một số công việc còn dang dở và chuẩn bị rời khỏi nơi làm việc, hãy thực hiện git-tmp-commit. Nó sẽ tự động cam kết tất cả các thay đổi đối với một nhánh mới, duy nhất.
  2. Đẩy nhánh này ra xa.
  3. Rời khỏi.
  4. Khi bạn muốn tiếp tục, sao chép lại nhánh đó từ xa. Tôi thực hiện điều này với ccdtập lệnh, thực sự kiểm tra mọi thứ từ đầu đến thư mục tạm thời , tự động chọn chi nhánh gần đây nhất ... nhưng bạn cũng có thể tự tìm nạp và kiểm tra chi nhánh temporary-commits/original-branch/YYYY-MM-DD...từ một bản sao hiện có của repo.
  5. Cuối cùng, những người khác không cam kết với những thay đổi với git-tmp-commit -r. Điều này sẽ đưa bạn trở lại chi nhánh ban đầu (ví dụ master) và để lại các thay đổi của cam kết tạm thời trong thư mục công việc, vì vậy bạn có thể tiếp tục ở đây cho đến khi có một cam kết thích hợp (hoặc tạm thời, nếu bạn phải rời đi một lần nữa).

Cách kịch bản được viết ngay bây giờ, điều này chỉ hoạt động nếu không có chi nhánh mastertrong repo thanh toán . Vì vậy, nghi ngờ, bạn phải git branch -d master; điều này rõ ràng không thực sự lý tưởng ...

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.