Làm cách nào để lưu trữ một tệp cụ thể?


1625

Làm cách nào tôi có thể lưu trữ một tệp cụ thể để các tệp khác hiện đang được sửa đổi ra khỏi kho mà tôi sắp lưu?

Ví dụ: nếu trạng thái git cho tôi điều này:

younker % gst      
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   app/controllers/cart_controller.php
#   modified:   app/views/cart/welcome.thtml
#
no changes added to commit (use "git add" and/or "git commit -a")

và tôi chỉ muốn lưu trữ app / views / cart / welcome.thtml, tôi sẽ làm như thế nào? Một cái gì đó như (nhưng tất nhiên điều này không hoạt động):

git stash save welcome_cart app/views/cart/welcome.thtml

56
Câu hỏi "có thể trùng lặp" hiện có một câu trả lời sai được đánh dấu là được chấp nhận.
Penguin Brian

6
bạn có thể sử dụng git checkout -- filenamevà hoàn nguyên nó về trạng thái ban đầu.
visualex

7
@visualex nó thực sự sẽ trở lại, nhưng không giấu nó
Jesper

2
Nhận xét của Re Penguin Brian: Có, câu trả lời được chấp nhận cho các liên kết câu hỏi "có thể trùng lặp" cho câu hỏi này cho các phiên bản gần đây của git.
Mars

1
$ Git stash - filename.ext
Linielson

Câu trả lời:


2470

EDIT: Kể từ git 2.13, có một lệnh để cứu một con đường cụ thể cho các stash: git stash push <path>. Ví dụ:

git stash push -m welcome_cart app/views/cart/welcome.thtml

CÂU TRẢ LỜI CŨ:

Bạn có thể làm điều đó bằng cách sử dụng git stash --patch(hoặc git stash -p) - bạn sẽ vào chế độ tương tác, nơi bạn sẽ được trình bày với từng phần đã được thay đổi. Sử dụng nđể bỏ qua các tệp mà bạn không muốn lưu trữ, ykhi bạn gặp tệp mà bạn muốn lưu trữ, và qđể thoát và bỏ lưu các tệp còn lại. asẽ lưu trữ phần được hiển thị và phần còn lại của phần còn lại trong tệp đó.

Không phải là cách tiếp cận thân thiện với người dùng nhất, nhưng nó sẽ hoàn thành công việc nếu bạn thực sự cần.


32
Rắc rối, nhưng hiệu quả. Tôi ước gì có một cách nhanh chóng để chỉ lưu trữ các thay đổi theo giai đoạn và sau đó đưa các thay đổi vào cây làm việc không theo giai đoạn khi nó xuất hiện sau đó.
James Johnston

54
@JamesJohnston git stash --keep-indexsẽ cho phép bạn lưu trữ tất cả các thay đổi chưa được phân giai đoạn (ngược lại với những gì bạn đang tìm kiếm). stackoverflow.com/a/8333163/378253
Nicolas Wormser

121
Nếu bạn nói athay vì ynó sẽ lưu trữ phần rác đó + phần còn lại của tệp, nhanh hơn nhiều.
i_am_jorf

53
@jeffamaphone tuyệt vời! cũng dsẽ làm ngược lại, tức là không lưu trữ thêm bất kỳ phần nào trong tệp hiện tại. và thực sự ?sẽ hiển thị tất cả các tùy chọn có thể.
omnikron

8
@Vencovsky Nó là viết tắt của "message" và được sử dụng để chỉ định mô tả tùy chọn của kho lưu trữ. Nếu không cần, bạn có thể bỏ -m welcome_cartphần đó ra.
svick

333

Tôi thường thêm vào các thay đổi chỉ mục mà tôi không muốn lưu trữ và sau đó lưu trữ với --keep-indextùy chọn.

git add app/controllers/cart_controller.php
git stash --keep-index
git reset

Bước cuối cùng là tùy chọn, nhưng thường là bạn muốn. Nó loại bỏ các thay đổi khỏi chỉ mục.


Cảnh báo Như đã lưu ý trong các bình luận, điều này đưa mọi thứ vào kho, cả dàn dựng và chưa dàn dựng. Các --keep-indexchỉ rời khỏi index một mình sau khi stash được thực hiện. Điều này có thể gây ra xung đột hợp nhất khi bạn bật kho lưu trữ sau đó.


5
Điều này tốt hơn nhiều so với câu trả lời được chấp nhận nếu bạn có nhiều thay đổi mà bạn không muốn vượt qua với tùy chọn --patch.
quux00 21/12/12

181
Không, điều này đưa mọi thứ vào kho, cả dàn dựng và chưa dàn dựng. Các --keep-indexchỉ rời khỏi index một mình sau khi stash được thực hiện. Vì vậy, đây không phải là câu trả lời hợp lệ cho câu hỏi, AFAICT.
Raman

2
Xem câu trả lời của tôi trên @ câu hỏi của Rachel kiếm một giải pháp để làm nghịch đảo của này (stashing các tổ chức thay đổi, thay vì những thay đổi unstaged) - stackoverflow.com/questions/3040833/...
JesusFreke

3
Sau đó, nếu bạn muốn lấy lại các tệp bạn đã lưu trữ mà không cần cam kết các tệp bạn đã thêm, bạn có thể chạy git stash; git stash pop stash@{1}.
yndolok

7
CẢNH BÁO: Hãy lưu ý quan điểm của @ Raman. Điều này không làm những gì nó nên làm. Điều này sẽ đặt các thay đổi tương tự trong kho lưu trữ để chúng trong cây làm việc. Sau đó, khi bạn cố gắng mở kho lưu trữ, bạn có thể gặp phải xung đột hợp nhất và chúng thường thực sự khó hiểu và khó sửa chữa.
rjmunro

17

Để thêm vào câu trả lời của svick, -mtùy chọn chỉ cần thêm một tin nhắn vào kho lưu trữ của bạn và hoàn toàn là tùy chọn. Do đó, lệnh

git stash push [paths you wish to stash]

là hoàn toàn hợp lệ. Vì vậy, ví dụ: nếu tôi chỉ muốn lưu trữ các thay đổi trong src/thư mục, tôi có thể chạy

git stash push src/
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.