Stash thay đổi trong khi giữ các thay đổi trong thư mục làm việc trong Git


145

Có một git stashlệnh ngăn chặn các thay đổi của bạn, nhưng cũng giữ chúng trong thư mục làm việc? Vì vậy, về cơ bản một git stash; git stash applytrong một bước?



Điều này có trả lời câu hỏi của bạn không? Lệnh Git để lưu một stash mà không sửa đổi cây làm việc?
Mariusz Pawelski

1
@MariuszPawelski Không, không thực sự. Câu hỏi đó cụ thể hơn của tôi. Câu trả lời cho câu hỏi của tôi chỉ đơn giản là "không". Cảm ơn về liên kết mặc dù, nó có thể hữu ích cho một số người, hoặc thậm chí bản thân tôi sau đó.
Michael Dorst

Để rõ ràng, câu hỏi của tôi là khác nhau bởi vì tôi không có yêu cầu rằng các tập tin vẫn còn nguyên. Tôi chỉ đơn thuần là tìm kiếm sự thay thế git stash && git stash apply. Bạn sẽ nhận thấy rằng câu trả lời cho câu hỏi đó khá khác với tôi.
Michael Dorst

ah, đúng, câu hỏi của bạn là một chút ít cụ thể. Nhưng tôi đặt câu hỏi đó vì câu trả lời của nó cũng đáp ứng yêu cầu của bạn. Và theo cách đó, câu hỏi này xuất hiện dưới dạng "Liên kết" trong thanh bên, vì vậy nó có thể hữu ích cho ai đó.
Mariusz Pawelski

Câu trả lời:


156

Để biết giá trị của nó, một cách khác để làm điều này là tạo ra các thay đổi bạn muốn giữ và sau đó bỏ qua mọi thứ bằng cách sử dụng --keep-index:

$ git add modified-file.txt
$ git stash push --keep-index

Các lệnh trên sẽ chứa tất cả mọi thứ, nhưng nó sẽ để lại các tệp được sắp xếp trong thư mục làm việc của bạn.

Từ tài liệu chính thức của Linux Kernel Git chogit stash hoặc từ git-scm :

Nếu --keep-indextùy chọn được sử dụng, tất cả các thay đổi đã được thêm vào chỉ mục sẽ được giữ nguyên.


3
đây là lời giải thích đơn giản nhất về --keep-index mà tôi đã thấy. Tôi đã không hiểu ý nghĩa của nó bằng cách nó được diễn đạt trên các tài liệu.
40

52

git stashvà sau đó git stash apply( git stash && git stash apply) sẽ stash các tệp và áp dụng stash ngay sau nó. Vì vậy, sau tất cả, bạn sẽ có những thay đổi của bạn trong stash và trong thư mục làm việc.

Bạn có thể tạo một bí danh nếu bạn muốn nó trong một mảnh. Chỉ cần đặt một cái gì đó như thế này để ~/.gitconfig:

[alias]
    sta = "!git stash && git stash apply"

Hạn chế của phương pháp này là tất cả các tệp được lưu trữ và tạo lại. Điều này có nghĩa là dấu thời gian trên các tệp trong câu hỏi sẽ được thay đổi. (Khiến Emacs phàn nàn khi tôi cố lưu tệp nếu đã mở tệp trước khi tôi thực hiện git stavà có thể gây ra việc xây dựng lại không cần thiết nếu bạn đang sử dụng makehoặc bạn bè.)


1
Ngoài ra, sự khác biệt giữa git stash; git stash applyvà là git stash && git stash applygì?
Michael Dorst


2
@anthropomorphic git config --global alias.sta "!git stash && git stash apply"nên làm điều đó.

Làm thế nào tôi có thể sửa đổi bí danh này để sử dụng git stash savevới một đối số và sau đó làm gì git stash apply?
spinarrow

1
@JaySidri, bang có nghĩa là nó thực sự là lệnh bên ngoài, không phải là đối số git. Theo tài liệu : "Như bạn có thể nói, Git chỉ cần thay thế lệnh mới bằng bất cứ điều gì bạn đặt bí danh cho nó. Tuy nhiên, có thể bạn muốn chạy một lệnh bên ngoài, thay vì một tiểu ban Git. Trong trường hợp đó, bạn bắt đầu lệnh bằng một ! tính cách."
madhead

10

Một cải tiến nhỏ trong câu trả lời mà trong thực tế có thể sẽ sử dụng.

$ git add modified-file.txt  
(OR $ git add .    ---- for all modified file)
$ git stash save --keep-index "Your Comment"

LƯU Ý: không hoạt động mà không có "git add" (ví dụ: đã sửa đổi nhưng không được thêm vào tệp cam kết)
alex_1948511

4

Có một mẹo có thể giúp bạn, không phải là thứ bỏ đi mà là FWIW:

git add -A
git commit -m "this is what's called stashing"       (create new stash commit)
git tag stash                               (mark the commit with 'stash' tag)
git reset HEAD~        (Now go back to where you've left with your working dir intact)

Và vì vậy, bây giờ bạn có một thẻ được gắn thẻ cam kết theo ý của bạn, git stash popdù sao bạn cũng không thể thực hiện được nhưng bạn có thể làm những việc như tạo bản vá hoặc đặt lại các tệp, v.v. từ đó, các tệp thư mục làm việc của bạn cũng được giữ nguyên BTW.


2

Bạn có thể sử dụng git stash createđể tạo một cam kết stash và sau đó lưu nó vào stash bằng cách sử dụng git stash store:

git stash store $(git stash create) -m "Stash commit message"

Điều này có thể được lưu vào bí danh git để thuận tiện hơn:

git config --global alias.stash-keep '!git stash store $(git stash create)'

git stash-keep -m "Stash commit message"

Lưu ý rằng điều này không làm mọi thứgit stash pushlàm. Chẳng hạn, nó không nối tên chi nhánh vào cam kết, ví dụ " stash@{0}: On myBranch: Stash commit message".


1
Thích cái này!! Một điều chỉnh mặc dù: man git-stashnói rằng -m <message>phải đến trước khi băm xác nhận. Ngoại trừ một cái gì đó thay đổi trong git mới nhất.
tanius
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.