Buộc git stash ghi đè lên các tệp đã thêm


223

Tôi có một số tập tin chưa được theo dõi trong git. Tôi đã thực hiện một số thay đổi và muốn cam kết chúng, nhưng nhận ra rằng tôi đã quên kiểm tra các tệp chưa sửa đổi trước. Vì vậy, tôi đã lưu các tệp, sau đó thêm các phiên bản chưa sửa đổi.

Sau đó, khi tôi áp dụng stash vào kho lưu trữ, tôi gặp xung đột do các tệp đã được thêm vào.

Làm cách nào tôi có thể áp dụng stash và buộc các phiên bản trong stash được sử dụng theo sở thích đối với bản gốc trong kho lưu trữ?

Cảm ơn


7
Giải pháp xấu cho đến khi ai đó đưa ra một giải pháp tốt hơn: xóa các tệp mới bằng cách sử dụng git rmtrước khi thực hiện git stash apply.
tom

Sẽ không mất lịch sử? Lý do để thêm các phiên bản chưa sửa đổi là để giữ lịch sử.
Stefan

1
Không, nó sẽ không mất lịch sử. Nếu bạn xóa một tệp, thêm nó trở lại với một sửa đổi nhỏ, và sau đó cam kết, gitsẽ coi nó chỉ là một sửa đổi nhỏ.
tom

Câu trả lời:


365

Sử dụng git checkoutthay vì git stash apply:

$ git checkout stash -- .
$ git commit

Điều này sẽ khôi phục tất cả các tệp trong thư mục hiện tại về phiên bản được lưu trữ của chúng.


Nếu có thay đổi đối với các tệp khác trong thư mục làm việc cần được lưu giữ, thì đây là một thay thế ít nặng tay hơn:

$ git merge --squash --strategy-option=theirs stash

Nếu có thay đổi trong chỉ mục hoặc hợp nhất sẽ chạm vào các tệp có thay đổi cục bộ, git sẽ từ chối hợp nhất. Các tệp riêng lẻ có thể được kiểm tra từ stash bằng cách sử dụng

$ git checkout stash -- <paths...>

hoặc tương tác với

$ git checkout -p stash

Không ai trong số này làm việc trong trường hợp sử dụng của tôi. Kết quả và giải pháp của tôi có ở đây stackoverflow.com/a/26685296/496046 - điều này cũng sẽ giải quyết tình huống của bạn,
@AlexanderBird

2
git checkout stash -- .Lệnh này thực sự không làm gì khi tôi chạy nó.
Rotsiser Mho

3
@RotsiserMho Git không tốt lắm về việc cung cấp tin nhắn xác nhận. Bạn có chắc là nó không làm gì không? Làm việc tốt cho tôi.
Sinjai

5
Tôi đã phải chạy git checkout stash -- .trong thư mục cha cao nhất có chứa các thay đổi của tôi, nếu không nó chỉ áp dụng các thay đổi cho thư mục mà tôi đã chạy lệnh.
Leo

1
@Leo: Đúng vậy, đó là vì .chỉ định thư mục hiện tại (bạn có thể thay thế nó bằng một đường dẫn khác thay vì thay đổi thư mục). Tôi cập nhật câu trả lời của tôi để làm cho rõ ràng hơn.
tom

13

git stash show -p | git apply

và sau đó git stash dropnếu bạn muốn thả các mục bị ném.


2
Lưu ý: bạn nên ở trong thư mục gốc của kho lưu trữ để hoạt động chính xác, nếu không bạn sẽ nhận được điều này .
Ruslan

@PengheGeng Như bạn thấy tôi đã trả lời khoảng một năm trước NetEmmanuel
Hasan TBT

@Ruslan Tôi nhận được điều đó trong khi ở gốc của repo của tôi 🤔
Leo

6

Buộc git stash popchạy lệnh này

git stash show -p | git apply && git stash drop

1

TL; DR:

git checkout HEAD path/to/file
git stash apply

Phiên bản dài:

Bạn gặp lỗi này vì những thay đổi không được cam kết mà bạn muốn ghi đè. Hoàn tác những thay đổi này với git checkout HEAD. Bạn có thể hoàn tác các thay đổi đối với một tệp cụ thể với git checkout HEAD path/to/file. Sau khi loại bỏ nguyên nhân của xung đột, bạn có thể áp dụng như bình thường.

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.