Câu trả lời:
Xem stash gần đây nhất:
git stash show -p
Xem một stash tùy ý:
git stash show -p stash@{1}
Từ các git stash
trang:
Theo mặc định, lệnh hiển thị diffstat, nhưng nó sẽ chấp nhận bất kỳ định dạng nào được biết đến với git diff (ví dụ: git stash show -p stash @ {1} để xem stash gần đây thứ hai ở dạng bản vá).
stash@{0}
là mặc định; bạn chỉ cần một đối số nếu bạn muốn xem xét các stash trước đó.
{0}
.
-p
đứng cho?
Để xem stash gần đây nhất:
git stash show -p
Để xem một stash tùy ý:
git stash show -p stash@{1}
Ngoài ra, tôi sử dụng git diff để so sánh stash với bất kỳ nhánh nào.
Bạn có thể dùng:
git diff stash@{0} master
Để xem tất cả các thay đổi so với chủ chi nhánh.
Hoặc bạn có thể sử dụng:
git diff --name-only stash@{0} master
Để dễ dàng tìm thấy chỉ thay đổi tên tập tin.
git diff stash@{0} master
, bạn sẽ nhận được một stash khác với master hiện tại (bao gồm cả công việc được thực hiện trên master sau stash đã được thực hiện), không phải các tệp / dòng mà stash sẽ thay đổi, đó là những gì câu hỏi là về.
git difftool --tool=... stash@{0} HEAD
git diff stash@{0}^ stash@{0}
git diff stash@{0} master -- filename
để nhận các thay đổi đối với một tệp cụ thể.
Nếu nhánh mà các thay đổi được lưu trữ của bạn dựa trên đã thay đổi trong thời gian đó, lệnh này có thể hữu ích:
git diff stash@{0}^!
Điều này so sánh stash với cam kết mà nó dựa trên.
~/.gitconfig
:laststash = diff stash@{0}^!
git difftool stash^!
đối với khác biệt của lần gửi cuối cùng với cam kết, nó được dựa trên, git difftool stash HEAD
đối với khác biệt của lần gửi cuối cùng với cam kết hiện tại (stash @ {n} cho các lần gửi trước đó)
Nếu cây làm việc của bạn bị bẩn , bạn có thể so sánh nó với stash bằng cách trước tiên cam kết cây làm việc bẩn, sau đó so sánh nó với stash. Sau đó, bạn có thể hoàn tác cam kết với cây làm việc bẩn (vì bạn có thể không muốn có cam kết bẩn đó trong nhật ký cam kết của mình).
Bạn cũng có thể sử dụng cách tiếp cận sau đây để so sánh hai stash với nhau (trong trường hợp đó bạn chỉ bật một trong các stash lúc đầu).
Cam kết cây làm việc bẩn thỉu của bạn:
git add .
git commit -m "Dirty commit"
Khác biệt với bản cam kết đó:
git diff HEAD stash@{0}
Sau đó, sau đó, bạn có thể hoàn nguyên cam kết và đưa nó trở lại vào thư mục làm việc:
git reset --soft HEAD~1
git reset .
Bây giờ bạn đã phân biệt cây làm việc bẩn thỉu với stash của mình và quay lại nơi ban đầu.
git stash show -l
. Liệu nó có khác với bản sao mới nhất chống lại bản sao (bẩn) không? Làm thế nào để bạn sử dụng nó mà không nhận được error: switch l requires a value
?
git stash show -l
. Về lý do tại sao nó không làm việc cho bạn, tôi chỉ có thể đoán bạn có thể đang ở phiên bản cũ hơn của git? Tôi đang sử dụng git v2.20.1 và nó hoạt động hoàn hảo không có lỗi.
Câu trả lời của @ Magne là ngày duy nhất (rất muộn) trả lời cách giải thích linh hoạt / hữu ích nhất cho câu hỏi, nhưng nó hơi phức tạp hơn mức cần thiết. Thay vì cam kết và đặt lại, chỉ cần bỏ bản sao làm việc của bạn, so sánh, sau đó hủy bỏ.
git stash save "temp"
git diff stash@{0} stash@{1}
git stash pop
Điều đó cho bạn thấy sự khác biệt giữa đỉnh ngăn xếp và thư mục làm việc của bạn bằng cách tạm thời thay đổi thư mục làm việc của bạn trở thành đỉnh của ngăn xếp (stash @ {0}), di chuyển từ trên xuống dưới (stash @ {1} ) sau đó so sánh bằng cách sử dụng đỉnh ban đầu ở vị trí set bộ mới 'để bạn thấy những thay đổi sẽ dẫn đến việc áp dụng nó lên trên công việc hiện tại của bạn.
"Nhưng nếu tôi không có công việc hiện tại thì sao?" Sau đó, bạn đang ở trong trường hợp nhàm chán bình thường. Chỉ cần sử dụng câu trả lời của @ Amber
git stash show
hoặc câu trả lời của @ czerasz
git diff stash@{0}
hoặc thừa nhận rằng stashing và unstashing là nhanh chóng và dễ dàng, chỉ cần hủy bỏ các thay đổi và kiểm tra chúng. Nếu bạn không muốn chúng tại thời điểm này, hãy ném chúng (chỉ mục hiện tại / thư mục làm việc thay đổi) đi. Đầy đủ đó
git stash apply
git diff
git reset
git checkout
git stash save -u
Điều này hoạt động với tôi trên phiên bản git 1.8.5.2:
git diff stash HEAD
git stash apply
.
Nếu bạn có công cụ cho diff (như ngoài so sánh)
git difftool stash HEAD
git stash apply
.
HEAD
. Tôi có thể sửa đổi câu trả lời của @ yerlilbilgin để loại bỏ ĐẦU nhưng tôi nghĩ rằng bất kỳ ai sử dụng git đều có thể tìm ra phần đó và tôi kéo dài câu trả lời sẽ khiến nó không thể đọc được. Không đổ lỗi cho @yerlibilgin.
Một cách để làm điều này mà không cần di chuyển bất cứ điều gì là tận dụng thực tế patch
có thể đọc git diff (cơ bản là khác biệt)
git stash show -p | patch -p1 --verbose --dry-run
Điều này sẽ cho bạn thấy một bản xem trước từng bước về những gì bản vá thường sẽ làm. Lợi ích bổ sung cho điều này là bản vá sẽ không ngăn bản thân viết bản vá lên cây làm việc, nếu vì lý do nào đó bạn thực sự cần git để im lặng về việc cam kết trước khi sửa đổi, hãy tiếp tục và xóa --dry- chạy và làm theo hướng dẫn dài dòng
Kết hợp những gì tôi đã học được trong chủ đề này và trong bài viết này , khi tôi muốn xem "những gì bên trong thùng rác", lần đầu tiên tôi chạy:
git stash show stash@{0}
Điều đó sẽ hiển thị những tập tin đã được sửa đổi. Sau đó, để có được một hình ảnh khác biệt đẹp trong một Difftool, tôi làm:
git difftool --dir-diff stash@{0} stash@{0}^
Điều này sẽ hiển thị tất cả sự khác biệt cùng một lúc của stash đã cho so với cha mẹ của nó.
Bạn có thể định cấu hình công cụ tìm khác ~/.gitconfig
, ví dụ như với Meld :
...
[diff]
tool = meld
FWIW Điều này có thể hơi dư thừa đối với tất cả các câu trả lời khác và rất giống với câu trả lời được chấp nhận tại chỗ; nhưng có lẽ nó sẽ giúp được ai đó
git stash show --help
sẽ cung cấp cho bạn tất cả những gì bạn cần; bao gồm thông tin chương trình stash.
hiển thị [<stash>]
Hiển thị các thay đổi được ghi lại trong ngăn chứa dưới dạng khác biệt giữa trạng thái được lưu trữ và cha mẹ ban đầu của nó. Khi không được đưa ra, hiển thị cái mới nhất. Theo mặc định, lệnh hiển thị diffstat, nhưng nó sẽ chấp nhận bất kỳ định dạng nào được biết đến với git diff (ví dụ: git stash show -p stash @ {1} để xem stash gần đây thứ hai ở dạng bản vá). Bạn có thể sử dụng các biến cấu hình stash.showStat và / hoặc stash.showPatch để thay đổi hành vi mặc định.
Cô ấy danh sách stash
git stash list
stash@{0}: WIP on feature/blabla: 830335224fa Name Commit
stash@{1}: WIP on feature/blabla2: 830335224fa Name Commit 2
Vì vậy, lấy số stash và làm:
Bạn có thể làm:
git stash show -p stash@{1}
Nhưng nếu bạn muốn tìm khác biệt (điều này khác với hiển thị stash, đó là lý do tại sao tôi viết câu trả lời này. Hãy Diff
xem xét mã hiện tại trong chi nhánh của bạn và show
chỉ hiển thị những gì bạn sẽ áp dụng )
Bạn có thể dùng:
git diff stash@{0}
hoặc là
git diff stash@{0} <branch name>
Một điều thú vị để làm là:
git stash apply
git stash apply stash@{10}
Điều này áp dụng stash mà không xóa nó khỏi danh sách, bạn có thể git checkout .
xóa những thay đổi đó hoặc nếu bạn vui lòng git stash drop stash@{10}
xóa stash khỏi danh sách.
Từ đây tôi không bao giờ khuyên bạn nên sử dụng git stash pop
và sử dụng kết hợp git stash apply
và git stash drop
Nếu bạn áp dụng một stash ở nhánh sai ... đôi khi rất khó để khôi phục mã của bạn.
Tùy thuộc vào những gì bạn muốn so sánh stash với (cây làm việc cục bộ / cam kết cha mẹ / cam kết đầu), thực tế có một số lệnh có sẵn, trong đó có lệnh cũ git diff
và cụ thể hơn git stash show
:
╔══════════════════════╦═══════════════════════════════╦═══════════════════╗
║ Compare stash with ↓ ║ git diff ║ git stash show ║
╠══════════════════════╬═══════════════════════════════╬═══════════════════╣
║ Local working tree ║ git diff stash@{0} ║ git stash show -l ║
║----------------------║-------------------------------║-------------------║
║ Parent commit ║ git diff stash@{0}^ stash@{0} ║ git stash show -p ║
║----------------------║-------------------------------║-------------------║
║ HEAD commit ║ git diff stash@{0} HEAD ║ / ║
╚══════════════════════╩═══════════════════════════════╩═══════════════════╝
Mặc dù git stash show
trông thân thiện với người dùng hơn từ cái nhìn đầu tiên, nhưng git diff
thực sự mạnh mẽ hơn ở chỗ nó cho phép chỉ định tên tệp cho một khác biệt tập trung hơn. Cá nhân tôi đã thiết lập bí danh cho tất cả các lệnh này trong plugin zsh git của mình .