2012-12-09 33 views
68

Tôi gặp sự cố khi thực hiện lựa chọn anh đào. Trên máy cục bộ của tôi, tôi hiện đang ở nhánh "master" của tôi. Tôi muốn anh đào chọn trong một cam kết từ một chi nhánh khác, có tên là "ngựa vằn". Nhánh "ngựa vằn" là một nhánh từ xa.Làm thế nào để anh đào-pick từ một chi nhánh từ xa?

trạng thái để git:

# On branch master 
nothing to commit (working directory clean) 

ok, bây giờ tôi cố gắng cherry-chọn cam kết tôi muốn:

git cherry-pick xyz 
fatal: bad object xyz 

nơi "xyz" là chữ ký của người cam kết Tôi quan tâm trong, đã xảy ra trên nhánh "ngựa vằn".

Vì vậy, câu hỏi hiển nhiên đầu tiên là, tại sao tôi không thể tìm thấy cam kết mà tôi đang tham chiếu? Tôi không thực sự hiểu làm thế nào đây là làm việc ở nơi đầu tiên phải trung thực. Có git lưu trữ một cái gì đó giống như một cơ sở dữ liệu của cam kết cục bộ trong thư mục làm việc của tôi, cho tất cả các chi nhánh khác? Khi thực hiện lệnh cherry-pick, nó có đi và tìm kiếm cơ sở dữ liệu cục bộ đó để tìm ra commit mà tôi đang nói không?

Vì "ngựa vằn" là một nhánh từ xa, tôi đã nghĩ rằng tôi không có dữ liệu cục bộ của nó. Vì vậy, tôi đã chuyển các chi nhánh:

git checkout zebra 
Switched to branch 'zebra' 

vì vậy bây giờ ở đây trên máy cục bộ, tôi có thể thấy các tệp trong thư mục phản ánh đúng trạng thái của zerbra. Tôi quay trở lại làm chủ, cố gắng để anh đào chọn lại (hy vọng dữ liệu cam kết có sẵn ngay bây giờ), nhưng một số vấn đề.

Tôi có một sự hiểu lầm cơ bản về những gì đang xảy ra ở đây, bất kỳ trợ giúp nào cũng sẽ tuyệt vời.

+2

khái niệm mọi thứ có vẻ đúng. bạn có chắc bạn đang sử dụng đúng băm (chữ ký như bạn gọi nó) của cam kết? thử 'git show ' để xác minh. – 0xc0de

+0

Xin chào, có tích cực - cả hai nhánh của tôi đều đang trên github và tôi có thể sử dụng chúng để tìm các trang cam kết theo cách đó. Nếu tôi hiểu, trạng thái của máy của tôi cục bộ là như vậy mà git không thể tìm thấy băm từ 'ngựa vằn' trong khi trong bối cảnh 'chủ'. Tôi có cần phải bằng cách nào đó nói với nó rằng 'ngựa vằn' tồn tại cục bộ, quá? – user291701

+0

oh và làm 'git show xyz' cho cùng một lỗi "gây tử vong: đối tượng xấu". (và tôi đang thay thế xyz bằng hàm băm chính xác). – user291701

Trả lời

101

Vì "ngựa vằn" là một nhánh từ xa, tôi đã nghĩ rằng tôi không có dữ liệu của nó cục bộ.

Bạn đúng rằng bạn không có đúng dữ liệu, nhưng đã cố gắng giải quyết nó sai cách. Để thu thập dữ liệu cục bộ từ nguồn từ xa, bạn cần sử dụng git fetch. Khi bạn đã thực hiện git checkout zebra bạn đã chuyển sang bất kỳ trạng thái nào của nhánh đó là lần cuối cùng bạn tìm nạp. Vì vậy, tìm nạp từ xa trước tiên:

# fetch just the one remote 
git fetch <remote> 
# or fetch from all remotes 
git fetch --all 
# make sure you're back on the branch you want to cherry-pick to 
git cherry-pick xyz 
+0

tuyệt vời, rất hữu ích, cảm ơn – PierrOz

+1

Liên kết đã lưu trữ: http://archive.miek.nl/blog/archives/2011/12/13/cherry-picking_remote_branches/index.html – brianpeiris

+0

tốt đẹp, nó cũng phù hợp với tôi, cảm ơn –

1

Cần phải kéo cả hai dữ liệu nhánh trên ổ đĩa cục bộ của bạn trước.

Điều gì đang xảy ra là bạn đang cố gắng hái anh đào từ chi nhánh-a đến chi nhánh-b, nơi bạn hiện đang ở chi nhánh-b, nhưng bản sao chi nhánh địa phương chưa được cập nhật (bạn cần phải thực hiện một git kéo trên cả hai nhánh đầu tiên).

bước sau:
- git checkout ngành một
- git pull nguồn gốc ngành một
- git checkout ngành b
- git pull nguồn gốc ngành b
- git cherry-chọn < băm >

đầu ra:
[chi nhánh-b < băm >] dữ liệu log
tác giả: tác giả < Author
1 tệp đã thay đổi, 1 lần chèn (+), 3 lần xóa (-)

1

Sau khi hợp nhất chi nhánh phát triển thành thạo, tôi thường xóa nhánh phát triển. Tuy nhiên, nếu tôi muốn anh đào chọn các cam kết trong nhánh phát triển, tôi phải sử dụng mã số hợp nhất cam kết băm để tránh lỗi "đối tượng xấu".

0

này cũng có thể dễ dàng đạt được với SourceTree:

  • kiểm tra chi nhánh chủ của bạn
  • mở "Đăng nhập/History" tab
  • Xác định vị trí xyz cam kết và click chuột phải vào nó
  • nhấp chuột trên "Hợp nhất ..."

done :)

+0

Điều này là không chính xác.Bởi vì bây giờ bạn đang hợp nhất HEAD của master thành zebra thay vì chỉ các commit đã chọn. –

0

Cũng giống như một phụ lục để OP chấp nhận câu trả lời:

Nếu bạn gặp vấn đề với

fatal: bad object xxxxx 

đó là bởi vì bạn không có quyền truy cập vào đó cam kết. Điều đó có nghĩa là bạn không có kho lưu trữ cục bộ đó. Sau đó:

git remote add upstream REPO_YOU_WANT_THE_COMMIT_FROM 
git fetch REPO_YOU_WANT_THE_COMMIT_FROM 
git cherry-pick xxxxxxx 

Nơi xxxxxxx là băm cam kết bạn muốn.

+0

hmm khi tôi đã thêm repo mà không có cờ thượng nguồn? – Gobliins

0

Tôi đã trả lại lỗi này sau khi sử dụng id cam kết từ tab cam kết yêu cầu kéo. Cam kết đó sau đó đã bị đè bẹp và sáp nhập. Trong yêu cầu kéo github, hãy tìm văn bản này: "commit commit xxxxxxx into ..." thay vì cố gắng sử dụng các id cam kết từ tab commit.

Các vấn đề liên quan