Câu trả lời:
Khi tôi phải áp dụng các thay đổi được lưu trữ cho một bản sao làm việc bẩn, ví dụ: bật nhiều hơn một thay đổi từ bản gốc, tôi sử dụng như sau:
$ git stash show -p | git apply -3 && git stash drop
Về cơ bản nó
Tôi tự hỏi tại sao không có -f
tùy chọn (lực lượng) git stash pop
nào hoạt động chính xác như một lớp lót ở trên.
Trong thời gian chờ đợi, bạn có thể muốn thêm lớp lót này dưới dạng bí danh git:
$ git config --global --replace-all alias.unstash \
'!git stash show -p | git apply -3 && git stash drop'
$ git unstash
Cảm ơn @SamHasler đã chỉ ra -3
tham số cho phép giải quyết xung đột trực tiếp thông qua hợp nhất 3 chiều.
git stash apply
sẽ không áp dụng các thay đổi được lưu trữ nếu bạn có một bản sao làm việc bẩn. Vì vậy, bạn có thể thấy git stash show -p | git apply
như một số loại stash bắt buộc áp dụng.
error: <file> does not match index
mọi tệp sửa đổi. Tuy nhiên, một giải pháp khác đã làm việc.
Tôi làm theo cách này:
git add -A
git stash apply
và sau đó (tùy chọn):
git reset
git add -u
, giống như -A
ngoại trừ nó không thêm các tệp không bị theo dõi.
Bạn có thể thực hiện việc này mà không cần phải bỏ các thay đổi hiện tại của mình bằng cách xuất stash bạn muốn dưới dạng tệp vá và áp dụng thủ công.
Ví dụ: giả sử bạn muốn áp dụng stash @ {0} cho cây bẩn:
Xuất stash @ {0} dưới dạng bản vá:
chương trình git stash -p stash @ {0}> Stash0.patch
Áp dụng thủ công các thay đổi:
git áp dụng Stash0.patch
Nếu bước thứ hai không thành công, bạn sẽ phải chỉnh sửa tệp Stash0.patch để sửa bất kỳ lỗi nào và sau đó thử git áp dụng lại.
Làm sạch thư mục làm việc của bạn với git reset, cam kết các thay đổi hoặc, nếu bạn muốn xóa các thay đổi hiện tại, hãy thử:
$ git stash lưu "mô tả các thay đổi hiện tại" $ git stash pop stash @ {1}
Điều này sẽ bỏ qua các thay đổi hiện tại, và sau đó bật ngăn thứ hai từ ngăn xếp.
Giải pháp của Mathias chắc chắn là gần nhất với pop-stash pop - Force (và thực sự, đó là các nhà phát triển Git, chúng ta hãy có tùy chọn này!)
Tuy nhiên, nếu bạn muốn làm điều tương tự chỉ bằng các lệnh git, bạn có thể:
Nói cách khác, thực hiện một cam kết (mà chúng tôi sẽ không bao giờ thúc đẩy) các thay đổi hiện tại của bạn. Bây giờ không gian làm việc của bạn sạch sẽ, hãy bật stash của bạn. Bây giờ, cam kết thay đổi stash như là một sửa đổi cho cam kết trước đó của bạn. Hoàn thành rằng bây giờ bạn có cả hai bộ thay đổi được kết hợp trong một cam kết duy nhất ("Fixme"); chỉ cần đặt lại (--soft KHÔNG - vì vậy không có gì thực sự bị mất) thanh toán của bạn thành "một trước khi cam kết" và bây giờ bạn có cả hai bộ thay đổi, hoàn toàn không được cam kết.
** CHỈNH SỬA * *
Tôi chỉ nhận ra rằng nó thực sự thậm chí còn dễ dàng hơn; bạn hoàn toàn có thể bỏ qua bước 3, vì vậy ...
(Cam kết các thay đổi hiện tại, tắt các thay đổi được lưu lại, đặt lại cam kết đầu tiên đó để có được cả hai bộ thay đổi được kết hợp ở trạng thái không được cam kết.)
Không có câu trả lời nào thực sự hiệu quả nếu bạn thấy mình trong tình huống này như tôi đã làm hôm nay. Bất kể git reset --hard
tôi đã làm bao nhiêu , nó chẳng đưa tôi đến đâu. Câu trả lời của tôi (không chính thức bằng bất kỳ phương tiện nào là):
git reflog --all
Tôi cũng thấy giải pháp của Mathias Leppich hoạt động rất tốt vì vậy tôi đã thêm một bí danh cho nó vào .gitconfig toàn cầu của mình
[alias]
apply-stash-to-dirty-working-tree = !git stash show -p | git apply && git stash drop
Bây giờ tôi chỉ có thể gõ
git apply-stash-to-dirty-working-tree
công việc tuyệt vời cho tôi
(Số dặm của bạn có thể thay đổi theo tên bí danh dài này. Nhưng tôi thích một mức độ dài dòng khi đi kèm với hoàn thành bash.)
Bạn có thể áp dụng một stash cho cây "bẩn" bằng cách thực hiện git add
bất kỳ thay đổi nào bạn đã thực hiện, do đó làm sạch cây. Sau đó, bạn có thể git stash pop
và áp dụng các thay đổi được lưu trữ, không có vấn đề.
Bạn có các tệp đã được sửa đổi nhưng không được cam kết. Hoặc:
git reset --hard HEAD (to bring everything back to HEAD)
hoặc, nếu bạn muốn lưu các thay đổi của mình:
git checkout -b new_branch
git add ...
git commit
git checkout -b old_branch
git stash pop
Tôi đã không thể có được hầu hết những thứ này để làm việc; vì một số lý do, nó luôn nghĩ rằng tôi có các thay đổi cục bộ đối với một tệp. Tôi không thể áp dụng stash, các bản vá sẽ không áp dụng checkout
và reset --hard
thất bại. Điều cuối cùng có hiệu quả là lưu stash như một nhánh với git stash branch tempbranchname
, và sau đó thực hiện hợp nhất nhánh bình thường: git checkout master
và git merge tempbranchname
. Từ http://git-scm.com/book/en/Git-Tools-Stashing :
Nếu bạn muốn một cách dễ dàng hơn để kiểm tra lại các thay đổi được lưu lại, bạn có thể chạy nhánh git stash, tạo ra một nhánh mới cho bạn, kiểm tra cam kết bạn đã thực hiện khi bạn thực hiện công việc của mình, áp dụng lại công việc của bạn ở đó và sau đó thả stash nếu áp dụng thành công
git stash show -p | git apply
khácgit stash apply
gì không?