2010-08-24 27 views
123

Tôi đã sao chép kho lưu trữ git từ xa khoảng một tháng trước. Kho lưu trữ từ xa đã trải qua nhiều thay đổi và hiện đã trở nên không ổn định. Bây giờ tôi cần một bản sao của kho lưu trữ, phiên bản giống với bản sao tôi đã sao chép một tháng trước.Git sao chép phiên bản cụ thể của kho lưu trữ từ xa

Làm cách nào để thực hiện việc này?

+0

có thể trùng lặp của http://stackoverflow.com/questions/3489173/how-to-clone-git-repository-with-specific-revision-changeset –

Trả lời

174

Bạn có thể "đặt lại" kho lưu trữ của mình thành bất kỳ cam kết nào bạn muốn (ví dụ: 1 tháng trước).

Sử dụng git-reset cho rằng:

git clone [remote_address_here] my_repo 
cd my_repo 
git reset --hard [ENTER HERE THE COMMIT HASH YOU WANT] 
+21

Bạn đã không đề cập đến nó, nhưng điều này sẽ chỉ đặt lại nhánh 'master', được kiểm tra theo mặc định trên bản sao. Nếu một chi nhánh không phải là "master" là chi nhánh phát triển chính của bạn phải được kiểm tra trước khi 'git reset' –

+0

@Steve đúng! +1 –

+10

tại sao bạn không thực hiện thanh toán đơn giản về cam kết mong muốn? – nemoo

28

Sử dụng git log để tìm phiên bản bạn muốn rollback đến, và lưu ý các cam kết băm. Sau đó, bạn có 2 lựa chọn:

  1. Nếu bạn có kế hoạch để thực hiện bất cứ điều gì sau khi xem xét lại đó, tôi khuyên bạn để kiểm tra đến một chi nhánh mới: git checkout -b <new_branch_name> <hash>

  2. Nếu bạn không kế hoạch cam kết bất cứ điều gì sau phiên bản đó, bạn có thể chỉ cần thanh toán mà không có chi nhánh: git checkout <hash> - LƯU Ý: Điều này sẽ đặt kho của bạn ở trạng thái 'tách rời', có nghĩa là hiện tại không được đính kèm với bất kỳ chi nhánh nào - sau đó you'll have some extra work to merge new commits to an actual branch.

Ví dụ:

$ git log 
commit 89915b4cc0810a9c9e67b3706a2850c58120cf75 
Author: Jardel Weyrich <suppressed> 
Date: Wed Aug 18 20:15:01 2010 -0300 

    Added a custom extension. 

commit 4553c1466c437bdd0b4e7bb35ed238cb5b39d7e7 
Author: Jardel Weyrich <suppressed> 
Date: Wed Aug 18 20:13:48 2010 -0300 

    Missing constness. 

$ git checkout 4553c1466c437bdd0b4e7bb35ed238cb5b39d7e7 
Note: moving to '4553c1466c437bdd0b4e7bb35ed238cb5b39d7e7' 
which isn't a local branch 
If you want to create a new branch from this checkout, you may do so 
(now or later) by using -b with the checkout command again. Example: 
    git checkout -b <new_branch_name> 
HEAD is now at 4553c14... Missing constness. 

Bằng cách đó bạn sẽ không bị mất bất kỳ thông tin, do đó bạn có thể chuyển sang một phiên bản mới hơn khi nó trở nên ổn định.

+2

Nhưng cũng không biết rằng bạn đang ở trên một đầu tách rời, đó là OK cho các hoạt động chỉ đọc. Nhưng khi bạn có ý định thay đổi bắt đầu từ bản sửa đổi này, bạn cần phải tạo một chi nhánh mới. Xem http://sitaramc.github.com/concepts/detached-head.html để biết thêm thông tin. – Rudi

+0

@Rudi: Cảm ơn bạn. Nó chỉ là một ví dụ để hiển thị cách sử dụng. Cập nhật đề cập đến nó. – jweyrich

+0

Để quay lại "trạng thái hoạt động", bạn chỉ có thể 'git checkout develop' phát triển là tên chi nhánh của bạn. –

0

Cây nguồn bạn đang yêu cầu vẫn có sẵn trong kho git, tuy nhiên, bạn sẽ cần SHA1 của cam kết mà bạn quan tâm. Tôi cho rằng bạn có thể lấy SHA1 từ bản sao hiện tại bạn có?

Nếu bạn có thể nhận được SHA1 đó, bạn có thể tạo chi nhánh/đặt lại ở đó để có kho lưu trữ giống hệt nhau.

lệnh theo Rui của câu trả lời

2

Không giống như hệ thống kiểm soát phiên bản tập trung, Git nhái toàn bộ kho lưu trữ, do đó bạn không chỉ nhận được các tập tin từ xa hiện tại, nhưng toàn bộ lịch sử. Bạn kho lưu trữ cục bộ sẽ bao gồm tất cả điều này.

Có thể đã có thẻ để đánh dấu một phiên bản cụ thể tại thời điểm đó. Nếu không, bạn có thể tự tạo chúng tại địa phương. Cách tốt nhất để làm điều này là sử dụng git log hoặc có thể trực quan hơn với các công cụ như gitk (có lẽ là gitk --all để xem tất cả các chi nhánh và thẻ). Nếu bạn có thể phát hiện các băm cam kết được sử dụng tại thời điểm đó, bạn có thể gắn thẻ chúng bằng cách sử dụng git tag <hash> và sau đó kiểm tra chúng trong các bản sao làm việc mới (ví dụ: git checkout -b new_branch_name tag_name hoặc trực tiếp với băm thay vì tên thẻ).

-1

Khi tôi đang tìm kiếm một cam kết của một tác giả nào đó (ví dụ như bản thân mình) Tôi lọc các bản ghi với

git log --author=[authorname] 
+3

Điều này không trả lời câu hỏi –

48

Bạn có thể sử dụng đơn giản

git checkout commithash 

theo thứ tự này

git init  
git clone `URLTORepository` 
cd `into your cloned folder` 
git checkout commithash 

cam kết băm trông như thế này "45ef55ac20ce2389c9180658fdba35f4a663d204"

+3

Tôi thích câu trả lời này là tốt nhất. Tôi nghĩ rằng một 'git reset --hard' nên tránh, trong lợi của' git checkout commit-hash'. Một 'git reset --hard' loại bỏ một phần của lịch sử git mà đôi khi không được mong muốn. –

0

Có thể git reset giải quyết vấn đề của bạn.

git reset --hard -#commit hash- 
Các vấn đề liên quan