Trường hợp sử dụng dự định cho git stash là gì?


142

Nếu tôi làm việc trên chi nhánh A và đột nhiên cần làm việc trên chi nhánh B trước khi sẵn sàng với một cam kết trên chi nhánh A, tôi lưu trữ các thay đổi của mình trên A, thanh toán B, thực hiện công việc của mình ở đó, sau đó thanh toán A và áp dụng lưu trữ.

Nếu tôi đang làm việc trên A và tôi muốn ngừng làm việc trong ngày, tôi có nên lưu trữ công việc của mình và sau đó áp dụng nó vào ngày hôm sau (khi tôi tiếp tục công việc của mình) hay tôi nên để mọi thứ như cũ — các tệp đã sửa đổi không cam kết trong thư mục làm việc? Tôi không hiểu tại sao tôi cần sử dụng stash trong trường hợp này, ngoại trừ nếu có một số lợi ích bảo mật.

Ngoài ra, một kịch bản khác: Tôi làm việc cả ở cơ quan và ở nhà. Nếu tôi chưa sẵn sàng với một cam kết khi tôi muốn về nhà, tôi có thể lưu trữ công việc của mình, đẩy nó lên GitHub và sau đó kéo lưu trữ đó ở nhà không?


3
phần lớn phụ thuộc vào các chính sách của công ty bạn, nếu có. Bạn sẽ chọn câu trả lời "được chấp nhận" như thế nào?
Daemon Painter

1
Câu hỏi này như phrased chỉ là yêu cầu cho ý kiến (tôi nên sử dụng git này cách này hay cách cách?) Và do đó nên được đóng lại hoặc thay đổi nội dung.
TylerH

Câu trả lời:


161

Stash chỉ là một phương pháp tiện lợi. Vì các chi nhánh rất rẻ và dễ quản lý bằng git, cá nhân tôi hầu như luôn thích tạo một chi nhánh tạm thời mới hơn là stashing, nhưng chủ yếu là vấn đề sở thích.

Một nơi mà tôi thích lưu trữ là nếu tôi phát hiện ra mình đã quên điều gì đó trong lần cam kết cuối cùng của mình và đã bắt đầu làm việc tiếp theo trong cùng một nhánh:

# Assume the latest commit was already done
# start working on the next patch, and discovered I was missing something

# stash away the current mess I made
git stash save

# some changes in the working dir

# and now add them to the last commit:
git add -u
git commit --amend

# back to work!
git stash pop

2
Liệu thứ bạn đã thêm bị thiếu có được hợp nhất vào kho lưu trữ sau khi bạn bỏ dấu vết không? (Tôi vẫn còn run sợ về cách dòng thời gian hoạt động trong git - Tôi cho rằng bạn đang ghi đè lịch sử ??)
Kiki Jewell

@KikiJewell các thay đổi được bật lên được áp dụng trên chỉ mục - chúng không được cam kết. vì vậy nếu bạn git stash pophai lần, bạn sẽ mất sự phân biệt giữa hai tập hợp thay đổi đó.
Mureinik

Kể từ cuối tháng 10 năm 2017, đã có nhiều cuộc thảo luận về danh sách gửi thư Git, trong đó lệnh git stash save không được dùng nữa để thay thế cho giải pháp thay thế hiện có git stash push. Lý do chính cho điều này là do git stash pushgiới thiệu tùy chọn lưu trữ các pathspec đã chọn , một cái gì đó git stash savekhông hỗ trợ.
Krishna Gupta

39

Tôi sẽ chia câu trả lời trên ba đoạn văn.

Phần 1:

git stash(Để lưu các thay đổi chưa được cam kết của bạn trong một "kho". Lưu ý: điều này sẽ xóa các thay đổi khỏi cây làm việc!)

git checkout some_branch(thay đổi sang nhánh dự định - trong trường hợp này some_branch)

git stash list (danh sách các kho lưu trữ)

Bạn có thể xem:
stash @ {0}: WIP trên {branch_name}: {SHA-1 of last commit} {last commit of you branch}
stash @ {0}: WIP on master: sửa đổi 085b095c6 để kiểm tra

git stash apply (để áp dụng stash vào cây làm việc trong nhánh hiện tại)

git stash apply stash@{12}(nếu bạn có nhiều kho, bạn có thể chọn loại sẽ áp dụng - trong trường hợp này chúng tôi áp dụng kho 12)

git stash drop stash@{0}(để xóa khỏi danh sách lưu trữ - trong trường hợp này là lưu trữ 0)

git stash pop stash@{1} (để áp dụng kho lưu trữ đã chọn và thả nó khỏi danh sách lưu trữ)

Phần 2:
Bạn có thể ẩn các thay đổi của mình bằng lệnh này nhưng không cần thiết.
Bạn có thể tiếp tục vào ngày hôm sau mà không cần cất giữ.
Lệnh này để ẩn các thay đổi của bạn và hoạt động trên các nhánh khác nhau hoặc để triển khai một số hiện thực hóa mã của bạn và lưu vào kho lưu trữ không có nhánh và cam kết trong trường hợp tùy chỉnh của bạn!
Và sau này bạn có thể sử dụng một số kho lưu trữ và kiểm tra sẽ tốt hơn.

Phần 3:
Lệnh Stash để ẩn các thay đổi của bạn cục bộ.
Nếu bạn muốn làm việc từ xa, bạn phải cam kết và thúc đẩy.


10

Ý tưởng chính là

Lưu trữ các thay đổi trong một thư mục làm việc bẩn thỉu

Vì vậy lệnh Basicallly Stash giữ lại một số thay đổi mà bạn không cần hoặc không muốn vào lúc này; nhưng bạn có thể cần chúng.

Sử dụng git stash khi bạn muốn ghi lại trạng thái hiện tại của thư mục làm việc và chỉ mục, nhưng muốn quay lại thư mục làm việc sạch. Lệnh sẽ lưu các sửa đổi cục bộ của bạn và hoàn nguyên thư mục làm việc để khớp với cam kết HEAD .


7

Bạn có thể sử dụng các lệnh sau:

  • Để lưu các thay đổi chưa cam kết của bạn

    git stash

  • Để liệt kê các kho lưu trữ đã lưu của bạn

    git stash list

  • Để áp dụng / lấy lại các thay đổi không giới hạn trong đó x là 0,1,2 ...

    git stash apply stash@{x}

Ghi chú:

  • Để áp dụng một kho lưu trữ và xóa nó khỏi danh sách lưu trữ

    git stash pop stash@{x}

  • Để áp dụng một kho lưu trữ và giữ nó trong danh sách lưu trữ

    git stash apply stash@{x}


4

Nếu bạn nhấn git stashkhi bạn có các thay đổi trong bản sao đang làm việc (không phải trong khu vực dàn dựng), git sẽ tạo một đối tượng được lưu trữ và đẩy vào ngăn xếp của tệp lưu trữ (giống như bạn đã làm git checkout -- .nhưng bạn sẽ không mất các thay đổi). Sau đó, bạn có thể bật từ trên cùng của ngăn xếp.


2

Lệnh stash sẽ lưu trữ bất kỳ thay đổi nào bạn đã thực hiện kể từ lần cam kết cuối cùng của bạn. Trong trường hợp của bạn, không có lý do gì để cất giữ nếu bạn sẽ tiếp tục làm việc với nó vào ngày hôm sau. Tôi sẽ chỉ sử dụng stash để hoàn tác những thay đổi mà bạn không muốn thực hiện.


2
Không, git stashsẽ không thay đổi chi nhánh của bạn. Nó đặc biệt sẽ không "hoàn nguyên" bất kỳ thay đổi đã cam kết nào. Nó sẽ chỉ (tạm thời) loại bỏ mọi thay đổi chưa được cam kết trên các tệp của bạn. - Nghe có vẻ khó hiểu, nhưng những từ loại đó có ý nghĩa rất đặc biệt trong ngữ cảnh của git. Bạn thực sự không nên trộn chúng với nhau.
michas 12/1213

Cảm ơn vì đã chỉ ra điều đó. Tôi đã thay đổi câu trả lời của mình cho phù hợp.
Severin

Trong git, một "nhánh" được định nghĩa là một chuỗi các cam kết. git stashsẽ không chạm vào bất kỳ cam kết nào và do đó sẽ không sửa đổi bất kỳ chi nhánh nào. Nó sẽ không "loại bỏ" bất cứ thứ gì khỏi một nhánh và nó sẽ không "đặt lại" nó theo bất kỳ cách nào. Nhánh giữ nguyên, chỉ có các tệp trong cây làm việc thay đổi. - Đó là hai điều hoàn toàn khác nhau.
michas 12/1213

Nó sẽ không loại bỏ mà "lưu trữ" các thay đổi của bạn! Git duy trì cấu trúc LIFO cho các kho lưu trữ, vì vậy một kho lưu trữ thực sự là một cú hích và bạn có thể bật từ trên cùng của nó. Từ "loại bỏ" có nghĩa là bạn sẽ mất bất cứ thứ gì, nhưng bạn sẽ không.
gyorgyabraham 12/1213

1

Tôi biết StackOverflow không phải là nơi dành cho các câu trả lời dựa trên ý kiến, nhưng tôi thực sự có quan điểm tốt về thời điểm nên tạm hoãn các thay đổi bằng một kho lưu trữ.

Bạn không muốn cam kết với bạn những thay đổi thử nghiệm

Khi bạn thực hiện các thay đổi trong không gian làm việc / cây làm việc của mình, nếu bạn cần thực hiện bất kỳ hoạt động dựa trên nhánh nào như hợp nhất, đẩy, tìm nạp hoặc kéo, bạn phải ở điểm cam kết sạch. Vì vậy, nếu bạn có những thay đổi về không gian làm việc, bạn cần phải cam kết chúng. Nhưng nếu bạn không muốn phạm phải chúng thì sao? Nếu chúng là thử nghiệm thì sao? Một cái gì đó bạn không muốn một phần của lịch sử cam kết của bạn? Điều gì đó bạn không muốn người khác nhìn thấy khi bạn đẩy lên GitHub?

Bạn không muốn mất các thay đổi cục bộ khi khôi phục cài đặt gốc

Trong trường hợp đó, bạn có thể thực hiện khôi phục cài đặt gốc. Nhưng nếu bạn thực hiện khôi phục cài đặt gốc, bạn sẽ mất tất cả các thay đổi cây làm việc cục bộ của mình vì mọi thứ sẽ bị ghi đè lên vị trí tại thời điểm cam kết cuối cùng và bạn sẽ mất tất cả các thay đổi của mình.

Vì vậy, đối với câu trả lời của 'khi nào bạn nên lưu trữ', câu trả lời là khi bạn cần quay lại điểm cam kết sạch với cây làm việc / chỉ mục / cam kết được đồng bộ hóa, nhưng bạn không muốn mất các thay đổi cục bộ của mình trong quá trình. Chỉ cần gác những thay đổi của bạn trong một kho lưu trữ và bạn đã tốt.

Và khi bạn đã hoàn tất việc lưu trữ của mình và sau đó hợp nhất hoặc kéo hoặc đẩy, bạn chỉ có thể lưu trữ cửa sổ bật lên hoặc áp dụng và bạn quay lại nơi bạn bắt đầu.

Git stash và GitHub

GitHub liên tục bổ sung các tính năng mới, nhưng tính đến thời điểm hiện tại, bây giờ có cách để lưu trữ ở đó. Một lần nữa, ý tưởng về kho lưu trữ là nó cục bộ và riêng tư. Không ai khác có thể nhìn vào kho lưu trữ của bạn nếu không có quyền truy cập vật lý vào máy trạm của bạn. Kinda giống như cách git reflog là riêng tư với git log là public. Nó có lẽ sẽ không riêng tư nếu nó được đẩy lên GitHub.

Một thủ thuật có thể là thực hiện thay đổi không gian làm việc của bạn, kiểm tra khác biệt trong kho lưu trữ git của bạn, cam kết và sau đó đẩy. Sau đó, bạn có thể thực hiện kéo từ nhà, lấy chênh lệch và sau đó mở ra. Nhưng đó là một cách khá lộn xộn để đạt được những kết quả đó.

git diff > git-dif-file.diff

bật kho

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.