git cherry-pick không hoạt động


110

Tôi đang cố gắng chọn một cam kết từ bậc thầy và đưa nó vào chi nhánh sản xuất hiện tại. Tuy nhiên, khi tôi thực thi git cherry-pick <SHA-hash>, tôi chỉ nhận được thông báo sau:

# On branch prod_20110801
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#   site/test-result/
 nothing added to commit but untracked files present (use "git add" to track)
 The previous cherry-pick is now empty, possibly due to conflict resolution.
If you wish to commit it anyway, use:

    git commit --allow-empty

Otherwise, please use 'git reset'

Lưu ý: Tôi đã thử thực hiện đặt lại và đặt lại --hard HEAD ^ và dường như không thay đổi được gì.

Tôi bối rối tại sao điều này không hiệu quả với tôi.

Mọi thông tin chi tiết, lời khuyên hoặc ý tưởng về cách giải quyết vấn đề này sẽ hữu ích ~!


Điều này đã xảy ra với tôi khi tôi vô tình cố gắng chọn sai cam kết. Đôi khi xảy ra khi sử dụng gitk.
cst1992

Câu trả lời:


141

Git đang giải quyết việc chọn anh đào dưới dạng không chọn - tất cả các thay đổi được giới thiệu bởi cam kết đó đã được giới thiệu bởi một số cam kết trên chi nhánh hiện tại của bạn. (Hoặc đó là những gì Git nghĩ, dù sao.) Xác minh rằng cam kết mà bạn đang hái cherry chưa được hợp nhất bằng cách nào đó, như là một hợp nhất thích hợp, rebase / cherry-pick hoặc bản vá chắp vá. (Sử dụng git show <commit-id>để xem sự khác biệt.)


16
Cảm ơn lời khuyên của bạn, hóa ra việc chọn anh đào đã diễn ra và tất cả những gì tôi cần làm là đẩy nó lên github.
Jay Taylor,

Đúng vậy, tôi không nhận ra rằng nó đang kiểm tra nội dung của các tệp được cung cấp id cam kết. Tôi đã tìm kiếm id cam kết trong nhật ký và không thể tìm thấy nó. nó bật ra nó đã được sáp nhập vào.
mparaz

Thật không may, đây không phải là lý do duy nhất của vấn đề được đề cập. Tôi đã gặp phải tình huống giống hệt như khi tôi thực hiện cam kết, điều này sẽ hoàn nguyên một số cam kết trước đó và khi tôi chọn anh đào nó trên một nhánh khác, lịch sử không cho rằng các thay đổi đó được hoàn nguyên (tức là đã không chọn anh đào của cam kết được hoàn nguyên đó ). Tất nhiên, đó là lỗi của tôi. Nhưng trong trường hợp này, người ta cho rằng git sẽ không thành công với trạng thái xung đột, thay vì cố gắng quá thông minh, dẫn đến người dùng bối rối.
Artem Pisarenko

Điều này có thể xảy ra nếu bạn hoàn nguyên một cam kết hợp nhất và cam kết được chọn như anh đào nằm trên nhánh hoàn nguyên.
matt

11

Trong trường hợp của tôi, điều này khiến tôi phát điên lên, vì rõ ràng là cam kết cụ thể mà tôi muốn hái cherry chưa được hợp nhất vào chi nhánh hiện tại của tôi.

Hóa ra ai đó đã chọn quả anh đào trước đó một tuần. Những thay đổi , nhưng không phải SHA cụ thể, đã có trong chi nhánh hiện tại của tôi và tôi đã không nhận thấy chúng.

Kiểm tra (các) tệp mà bạn đang cố gắng chọn anh đào. Nếu họ đã có các thay đổi, một phiên bản của cam kết đã được chọn hoặc thêm vào theo cách khác. Do đó không cần phải hái anh đào nữa.


Tôi khá chắc chắn rằng cam kết cụ thể không bao giờ có trong nhánh của bạn khi nó được mang đến bởi một người hái anh đào, vì hái anh đào sẽ là một băm mới, phải không? Hay tôi đang hiểu lầm?
msouth

@msouth Điều ban đầu tôi lấy đi từ các câu trả lời khác là "cam kết đã được hợp nhất", nhưng tôi có thể thấy rằng nó không có trong nhánh của tôi. Mặc dù vậy, bạn đã đúng về việc chọn anh đào luôn là một SHA mới.
pkamb

Vâng, tôi đã nghĩ đến "cam kết cụ thể, được xác định bởi hàm băm", khi tôi nhập nó. Ngôn ngữ của tôi không chính xác. Tôi thường nhìn lại kết quả đầu ra của git log --graph --pretty --decorate --onelineđể xem liệu SHA nhất định có nằm trong chi nhánh của tôi hay không. Hãy xem câu trả lời của tôi bên dưới về cách bạn cũng có thể bị lẫn lộn khi nghĩ rằng thông điệp cam kết là dấu hiệu của sự thay đổi - có một trường hợp là không, và đó là điều đã dẫn tôi đến câu hỏi này ban đầu. Bộ não của một người có xu hướng tạo ra những lối tắt đó và đôi khi chúng có thể quay lại cắn bạn.
msouth

6

Cũng lưu ý rằng việc thêm một tệp trống (ví dụ .gitkeep) vào cây được cherry-pick coi như một cam kết trống.


Trong trường hợp của tôi, tôi đã có một cam kết hoàn nguyên (đang hoàn nguyên một cam kết trống) trước khi thử chọn quả anh đào của tôi, vì vậy tôi đoán bất kỳ thứ gì trống có thể sẽ khiến thông báo này xuất hiện.
lidkxx

3

Vì vậy, đây là một tình huống khó hiểu khác mà điều này có thể phát sinh: Tôi có những điều sau đây:

ảnh chụp màn hình git log

Tôi đã cố gắng chọn anh đào 9a7b12e mà dường như không có gì - nó thậm chí đã cố gắng nói với tôi trên dòng đó trong đầu ra nhật ký git rằng 4497428 là thứ tôi thực sự muốn. (Những gì tôi đã làm chỉ là tìm kiếm thông báo cam kết và lấy mã băm đầu tiên mà tôi thấy có nó). Dù sao, chỉ muốn cho mọi người biết rằng có một cách khác bạn có thể bị lừa khi cố gắng chọn anh đào không chọn.


10
Không hữu ích lắm nếu bạn phản đối mà không có lời giải thích - đây là sự tái hiện chính xác của một vấn đề mà tôi đã gặp phải khiến tôi tìm thấy câu hỏi này trong tìm kiếm của mình. Nếu bạn có đề xuất để cải thiện điều này, vui lòng cho tôi biết trong phần nhận xét thay vì chỉ phản đối.
msouth
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.