Chỉ lưu trữ một tệp duy nhất


215

Tôi muốn chỉ có thể lưu trữ các thay đổi từ một tệp duy nhất:

git stash save -- just_my_file.txt

Những điều trên không hoạt động mặc dù. Bất kỳ lựa chọn thay thế?



đối với một tệp duy nhất , thay vì tung hứng các lệnh lưu trữ, cách tiếp cận dễ dàng hơn nhiều là sao chép tệp đơn và khi bạn muốn đưa nó trở lại, chỉ cần sao chép thay thế bản gốc. ví dụ. cp just_my_file.txt just_my_file.txt.manualstash bây giờ bạn có thể thực hiện tất cả các kiểm tra và nội dung và vì bản sao là "tệp chưa được kiểm tra", bạn có thể di chuyển qua các chi nhánh và cam kết mà không gặp bất kỳ sự cố nào. Khi bạn đang ở trên các chi nhánh phải / cam kết mà bạn muốn "hợp nhất các đơn tập tin" chỉ làm mv just_my_file.txt.manualstash just_my_file.txtvà bây giờ bạn có thể xem lại các thay đổi và cam kết nó khi cần thiết
Dimitry K

@DimitryK Chỉ cần không làm git clean -f -dtrong thời gian chờ đợi, vì nó xóa các tệp không được theo dõi. :-)
Danijel

Câu trả lời:


193

Tôi nghĩ stash -pcó lẽ là sự lựa chọn mà bạn muốn, nhưng đề phòng bạn gặp phải những thứ khác thậm chí còn khó khăn hơn trong tương lai, hãy nhớ rằng:

Stashthực sự chỉ là một sự thay thế rất đơn giản cho các branchbộ phức tạp hơn một chút . Stash rất hữu ích để di chuyển mọi thứ một cách nhanh chóng, nhưng bạn có thể hoàn thành những việc phức tạp hơn với các nhánh mà không phải đau đầu và tốn nhiều công sức hơn.

# git checkout -b tmpbranch
# git add the_file
# git commit -m "stashing the_file"
# git checkout master

đi về và làm những gì bạn muốn, sau đó đơn giản rebasevà / hoặc mergetmpbranch. Nó thực sự không phải quá nhiều công việc khi bạn cần theo dõi cẩn thận hơn mức cho phép.


2
Ngược lại, bạn có thể biến những cành cây thành những cành cây thật mà không phải đau đớn.
Wes Hardaker

trộn cái này với git checkout tmpbranch the_filetừ cái chính làm cho điều này hữu ích hơn để kéo các thay đổi của một tệp trở lại nhánh cái. Xem stackoverflow.com/a/307872/4692594
Matthew Davis

122

Nếu bạn không muốn chỉ định một thông báo với các thay đổi được lưu trữ của mình, hãy chuyển tên tệp sau dấu gạch ngang kép.

$ git stash -- filename.ext

Nếu đó là một tệp chưa được kiểm soát / mới, bạn sẽ phải xử lý nó trước.

Tuy nhiên, nếu bạn làm muốn chỉ định một tin nhắn, sử dụng push.

git stash push -m "describe changes to filename.ext" filename.ext

Cả hai phương pháp đều hoạt động trong phiên bản git 2.13+


1
Câu trả lời này dường như thẳng nhất về phía trước với tôi khi làm sửa đổi thay đổi: git stash -- filename.ext, git commit --amend, git stash pop
Brandon Dewey

1
Tôi nghĩ rằng điều này phải dựa vào một số chức năng rất mới. Nó không hoạt động trong git 2.1.4.
Richard Smith

Nó dẫn đến một số hành vi kỳ lạ đối với tôi, với kho lưu trữ được lưu, nhưng các tệp giống nhau được thêm vào hệ thống cùng một lúc (git v2.20.1),
paradroid

59

Bạn có thể lưu trữ tương tác các dòng đơn với git stash -p(tương tự với git add -p).

Nó không cần tên tệp, nhưng bạn có thể bỏ qua các tệp khác dcho đến khi bạn đến tệp bạn muốn lưu trữ và lưu trữ tất cả các thay đổi trong đó a.


3
Điều này mất nhiều thời gian nếu bạn có nhiều tệp mà bạn không muốn lưu trữ.
jjj

25
Tôi không biết điều này đã thay đổi khi nào nhưng git 2.14.1bạn có thể chỉ định tên tệpgit stash -p <filename>
muon

23

Tùy chọn tốt nhất là sắp xếp mọi thứ trừ tệp này và yêu cầu stash giữ chỉ mục với git stash save --keep-index, do đó lưu trữ tệp chưa phân giai đoạn của bạn:

$ git add .
$ git reset thefiletostash
$ git stash save --keep-index

Như Dan đã chỉ ra, thefiletostashlà tệp duy nhất được đặt lại bởi kho lưu trữ, nhưng nó cũng lưu trữ các tệp khác, vì vậy nó không chính xác như những gì bạn muốn.


2
Mặc dù điều này giữ cho chỉ mục ở cùng một trạng thái, nhưng điều này cũng không lưu trữ các tệp có trong chỉ mục sao? Nói cách khác, nếu sau khi làm điều này, bạn cam kết chỉ mục cho nhánh hiện tại, sau đó chuyển sang nhánh khác và thực hiện git stash pop, nó sẽ không áp dụng tất cả các tệp, không chỉ một tệp mà chúng ta muốn lưu trữ?
Dan Molding,

@DanMoulding: bạn hoàn toàn đúng, tôi chưa nghĩ đến điều này.
CharlesB

15

Chỉ trong trường hợp bạn thực sự muốn nói "loại bỏ các thay đổi" bất cứ khi nào bạn sử dụng "git stash" (và không thực sự sử dụng git stash để lưu trữ nó tạm thời), trong trường hợp đó bạn có thể sử dụng

git checkout -- <file>

Lưu ý rằng git stash chỉ là một giải pháp thay thế nhanh chóng và đơn giản hơn cho việc phân nhánh và thực hiện công việc.


Tôi nghĩ đây là câu trả lời tốt nhất nếu bạn muốn xóa tất cả các thay đổi đã sửa đổi của mình đối với một tệp duy nhất.
Mohamed Haseel

và tôi điều này sẽ là câu trả lời tốt nhất cho rằng nhiệm vụ cụ thể
Zakir Hussain

9
Câu hỏi đủ rõ ràng và không hỏi làm thế nào để hoàn nguyên các thay đổi đối với một tệp. Bị phản đối.
Richard Smith,

@MukulJain Tôi thực sự cần sử dụng stash-per-file theo cách rất tạm thời (về cơ bản tách một số thay đổi trong hai cam kết ảnh hưởng đến các dòng giống nhau cho một tệp). Tôi sẽ không thực sự phản đối, chỉ nói rằng nó vô dụng đối với tôi.
Paul Stelian
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.