Có thể xem trước nội dung stash trong git?


554

Tôi thường để công việc đi sau, sau đó những thứ khác xuất hiện và vài tuần sau, tôi muốn kiểm tra stash, và tìm hiểu những thay đổi sẽ làm nếu tôi áp dụng nó vào cây làm việc ở trạng thái hiện tại.

Tôi biết tôi có thể thực hiện một git diff trên stash, nhưng điều này cho tôi thấy tất cả sự khác biệt giữa cây làm việc và stash, trong khi tôi chỉ quan tâm để biết stash áp dụng sẽ thay đổi gì.

Tôi có thể làm cái này như thế nào?


1
colorized diff output: git stash show -p stash@{1} >~/.diff && vim ~/.diff(không cần phải có vim. bất kỳ trình soạn thảo văn bản nào miễn là trình soạn thảo văn bản của bạn có hỗ trợ tô sáng cú pháp cho diffđầu ra).
Trevor Boyd Smith

Câu trả lời:


728

git stash showsẽ hiển thị cho bạn các tệp đã thay đổi trong ngăn chứa gần đây nhất của bạn. Bạn có thể thêm -ptùy chọn để hiển thị khác.

git stash show -p

Nếu stash mà bạn quan tâm không phải là stash gần đây nhất, thì hãy thêm tên của stash vào cuối lệnh:

git stash show -p stash@{2}

Điều đó có vẻ tốt, và tôi thấy nó trong hướng dẫn, nhưng khi tôi thử nó cho tôi fatal: unable to create temp-file: Invalid argument- có ý tưởng nào tại sao không?
Stewol

29
Sử dụng git stash show -p stash@{0}để xem một stash cụ thể. 0 hiển thị âm cuối cùng, 1 âm cuối thứ hai .. vv git stash listsẽ hiển thị tất cả các âm có sẵn.
brita_

6
Nếu bạn đang sử dụng PowerShell, bạn sẽ phải đặt tên stash trong dấu ngoặc kép. (tức là git stash show -p 'stash@{0}':)
scott-pascoe


1
Nếu bạn muốn lưu diff trong sử dụng tệpgit stash show -p stash@{0}> stash.txt
S_K

87

Để xem danh sách stash hiện tại:

git stash list

Bạn sẽ thấy một danh sách như thế này:

stash@{0}: WIP on ...
stash@{1}: ...
stash@{2}: ...
...

Để xem diff trên bất kỳ stash nào:

git stash show -p stash@{n}

34

Tôi là một fan hâm mộ của gitkgiao diện người dùng đồ họa để trực quan hóa git repos. Bạn có thể xem mục cuối được lưu với:

gitk stash

Bạn cũng có thể sử dụng xem bất kỳ thay đổi nào của mình (như được liệt kê bởi git stash list). Ví dụ:

gitk stash@{2}

Trong ảnh chụp màn hình bên dưới, bạn có thể thấy stash là một cam kết ở phía trên bên trái, khi nào và xuất phát từ đâu trong lịch sử cam kết, danh sách các tệp được sửa đổi ở phía dưới bên phải và khác biệt từng dòng ở phía dưới -trái. Tất cả trong khi stash vẫn còn giấu.

gitk xem một stash


5
Bạn có thể cung cấp nhiều stash@{X}giá trị trên dòng lệnh để xem nhiều kết quả hơn cùng một lúc, nhưng tôi chưa tìm thấy một cách đơn giản để chỉ nói 'hiển thị tất cả các mục nhập' trong gitk.
tộc

5
gitk stashdường như là cách viết tắt củagitk stash@{0}
Leif Gruenwoldt

3
để hiển thị tất cả các stash trong gitk, bạn có thể sử dụng gitk `git stash list --pretty=format:%gd`và sau đó tìm kiếm "WIP on" để chuyển sang stash tiếp theo.
Ikar Pohorský

2
gitk --reflogcho phép bạn xem tất cả các stash, và nhiều hơn nữa.
tộc

1
gitk là công cụ duy nhất cho tôi thấy trực tiếp rằng stash có các tệp không bị theo dõi được lưu trong đó. Tất cả những người khác chỉ cho tôi "không có sự khác biệt".
Martin Bonner hỗ trợ Monica

22

Để xem tất cả các thay đổi trong ngăn chứa chưa được bật:

git stash show -p stash@{0}

Để xem các thay đổi của một tệp cụ thể trong ngăn không được bật:

git diff HEAD stash@{0} -- path/to/filename.php

trong trường hợp người ta không nhớ tên tệp, nó cũng hoạt động với tất cả các tệp đã thay đổi git diff HEAD stash @ {0}
Simeon

Chỉ cho rõ ràng: -plà viết tắt của --patch. Các tùy chọn đến từ git-diff. Nếu bạn thích hình thức dài, bạn có thể viết git stash show --patch.
Peterino

5

Ngoài đề xuất gitk trong Có thể xem trước nội dung stash trong git không? bạn có thể cài đặt tig và gọi tig stash. Chương trình bảng điều khiển miễn phí / mở này cũng cho phép bạn chọn stash nào để so sánh


1
Trông giống như một công cụ hoàn hảo để quản lý nhiều stash! Bạn cũng có thể bậtthả stash với P!các phím tương ứng.
Ikar Pohorský

Các lựa chọn thay thế TUI luôn tốt, nhưng đối với dân gian đã quen hoặc bằng cách nào đó thích gitk thì việc hack nó để hiển thị tất cả các stash là tương đối dễ dàng .
1737973

4

Tôi sử dụng điều này để xem tất cả các stash của mình với màu sắc nổi bật khác nhau (trên Fedora 21):

git stash list | 
  awk -F: '{ print "\n\n\n\n"; print $0; print "\n\n"; 
  system("git -c color.ui=always stash show -p " $1); }' | 
  less -R

(Chuyển thể từ Git: xem những gì trong stash mà không áp dụng stash )


4

Khi câu hỏi này lần đầu tiên được hỏi, đây có thể không phải là một tùy chọn, nhưng, nếu bạn sử dụng PyCharm, bạn có thể sử dụng UnStash Changescông cụ (VCS-> Git-> UnStash Change ...). Điều này cho phép bạn xem danh sách các thay đổi được lưu trữ, cũng như bật, thả, xóa hoặc áp dụng (vào một nhánh mới nếu muốn):

Unstash Thay đổi cửa sổ

và xem các tệp đã thay đổi trên mỗi stash:

Đường dẫn bị ảnh hưởng

cũng như khác biệt cho mỗi tập tin. Trong các khác biệt, bạn có thể chọn các thay đổi riêng lẻ để áp dụng từ các thay đổi được lưu vào nhánh làm việc (sử dụng chevron trỏ trái):

nhập mô tả hình ảnh ở đây


3

Bạn có thể xem tất cả danh sách của stash bằng lệnh sau:

$ git stash list

stash@{0}: WIP on dev: ddd4d75 spelling fix

stash@{1}: WIP on dev: 40e65a8 setting width for messages

......

......

......


stash@{12}: WIP on dev: 264fdab added token based auth

Stash mới nhất là cái đầu tiên.

Bạn có thể chỉ cần chọn chỉ mục ncủa stash được cung cấp trong danh sách trên và sử dụng lệnh sau để xem chi tiết stash

git stash show -p stash@{3}

Tương tự

git stash show -p stash@{n}

Bạn cũng có thể kiểm tra diff bằng cách sử dụng lệnh:

git diff HEAD stash@{n} -- /path/to/file

3

vâng, cách tốt nhất để xem những gì được sửa đổi là lưu trong tệp như thế:

git stash show -p stash@{0} > stash.txt

2

Đầu tiên chúng ta có thể sử dụng danh sách git stash để nhận tất cả các mục stash:

$git stash list
stash@{0}: WIP on ...
stash@{1}: WIP on ....
stash@{2}: WIP on ...

Sau đó, chúng ta có thể sử dụng git stash show stash@{N}để kiểm tra các tệp trong một ngăn cụ thể N. Nếu chúng tôi bắn nó thì chúng tôi có thể nhận được:

$ git stash show stash@{2}
fatal: ambiguous argument 'stash@2': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

Lý do cho điều này có thể là vỏ ăn ăn niềng răng cong và git thấy stash@2và không stash@{2}. Và để khắc phục điều này, chúng ta cần sử dụng các dấu ngoặc đơn cho dấu ngoặc nhọn như:

git stash show stash@'{2'}
com/java/myproject/my-xml-impl.xml                     | 16 ++++++++--------
com/java/myproject/MyJavaClass.java                    | 16 ++++++++--------
etc.

2

Xem danh sách các thay đổi được lưu trữ

git stash list

Để xem danh sách các tập tin đã thay đổi trong một stash cụ thể

git stash show -p stash@{0} --name-only

Để xem một tập tin cụ thể trong stash

git show stash@{0} path/to/file

1

Hiển thị tất cả các stash

Chỉ tên tệp:

for i in $(git stash list --format="%gd") ; do echo "======$i======"; git stash show $i; done

Nội dung tập tin đầy đủ trong tất cả các stash:

for i in $(git stash list --format="%gd") ; do echo "======$i======"; git stash show -p $i; done

Bạn sẽ nhận được đầu ra khác biệt được tô màu mà bạn có thể trang với space ( chuyển tiếp ) và b( ngược lại ) và qđể đóng máy nhắn tin cho stash hiện tại. Nếu bạn muốn có nó trong một tập tin thì hãy thêm > stashes.diffvào lệnh.


1

Ngoài các câu trả lời hiện có gợi ý sử dụng (để hiển thị độ lệch của ngăn thứ ba đến cuối cùng)

git stash show -p stash@{2}

Lưu ý rằng trong git-stashtài liệu , nó được viết rằng

Stash cũng có thể được tham chiếu bằng cách chỉ định chỉ số stash (ví dụ: số nguyên ntương đương với stash@{n}).

Do đó, nó cũng có thể sử dụng (điều này tương đương với lệnh trên)

git stash show -p 2

Mà cũng nên tránh một số vấn đề Powershell .


1

tôi thích cách làm gitk có thể cho bạn thấy chính xác những gì chưa được theo dõi hoặc ngồi trong chỉ mục, nhưng theo mặc định, nó sẽ hiển thị các "cam kết" đó ở giữa tất cả các cam kết khác của bạn trên nhánh hiện tại.

Mẹo nhỏ là chạy gitk như sau:

gitk "stash@{0}^!"

(Trích dẫn là có để làm cho nó hoạt động trong Powershell nhưng theo cách này nó vẫn sẽ hoạt động trong các shell khác.)

Nếu bạn tìm kiếm cú pháp này trong trang trợ giúp của gitrevutions, bạn sẽ tìm thấy những điều sau đây:

Các r1^!ký hiệu bao gồm cam kết r1 nhưng không bao gồm tất cả các bậc cha mẹ của nó. Chính nó, ký hiệu này biểu thị cho cam kết duy nhất r1 .

Điều này rõ ràng sẽ đặt gitk ở chế độ mà chỉ cha mẹ trực tiếp của cam kết được chọn mới được hiển thị, đó chính xác là những gì tôi thích.


Nếu bạn muốn thực hiện điều này hơn nữa và liệt kê tất cả các stash thì bạn có thể chạy nó:

gitk `git stash list '--pretty=format:%gd^!'`

(Những trích dẫn đơn lẻ bên trong backticks là cần thiết để xoa dịu Bash, nếu không, nó phàn nàn về dấu chấm than)

Nếu bạn đang dùng Windows và sử dụng cmd hoặc Powershell:

gitk "--argscmd=git stash list --pretty=format:%gd^!"

0

Lệnh sau có thể được sử dụng để trích xuất diff của stash thay đổi một lần nữa bất kỳ stash hoặc commit hoặc nhánh hoặc HEAD khác.

git stash show
git show
git diff
git difftool

Hãy xem, làm thế nào chúng ta có thể sử dụng từng lệnh được đề cập ở trên.

  1. chương trình git stash

Lệnh git stash hiển thị đơn giản đưa ra tóm tắt rất ngắn gọn về các thay đổi của tệp, nhưng sẽ không hiển thị khác biệt của các thay đổi so với CHÍNH hiện tại.

  1. chương trình git

Lệnh git-show được sử dụng để xem các loại đối tượng khác nhau.

Lệnh git-show không chỉ được sử dụng để trực quan hóa các thay đổi của stash, mà còn được sử dụng để xem một hoặc nhiều đối tượng như đốm, cây, thẻ và cam kết.

  1. khác biệt

Lệnh git-diff cũng là một trong những lệnh phổ biến được sử dụng để hiển thị các thay đổi giữa các xác nhận, cam kết và cây làm việc, v.v.

Theo mặc định, git diff sẽ hiển thị khác biệt của stash được chọn so với (các tệp đã sửa đổi) trạng thái hiện tại của kho lưu trữ trừ khi tham chiếu hoặc cam kết stash khác được chỉ định.

Để có sự khác biệt giữa stash stash hàng đầu nhất @ {0} và nhánh chính:

$ git diff stash @ {0} chính

Chỉ hiển thị tên của tệp không khác với thay đổi:

$ git diff - stash chỉ có tên @ {0} chính

Xem sự khác biệt giữa các mục được chọn cho một tệp đã chọn:

$ git diff stash @ {0} ^ 1 stash @ {0} -

  1. git Difftool

Lệnh git-Difftool cũng có thể được sử dụng để tìm khác biệt giữa stash được chọn và cam kết được chọn hoặc nhánh hoặc stash

Xem sự khác biệt giữa hai stash mới nhất:

$ git Difftool stash @ {0} stash @ {0} ^ 1

git Difftool - stir-diff stash @ {0} stash @ {0} ^ 1

Tóm lược:

Các lệnh hữu ích để trích xuất diff từ chương trình stash git stash đã chọn, git show, git diff, git Difftool.

Xem sự khác biệt bằng cách sử dụng lệnh git stash show,

chương trình git stash -p stash @ {0}

Xem các thay đổi trong stash bằng lệnh git show,

stit show stash @ {1}

Xem sự khác biệt giữa stash mới nhất và cam kết được chọn bằng lệnh git diff,

git diff stash @ {0}

Người giới thiệu:

https://howto.lintel.in/how-to-see-stashing-changes-USE-git-stash/

https://git-scm.com/docs/git-show

https://git-scm.com/docs/git-stash

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.