Git clone phiên bản cụ thể của kho lưu trữ từ xa


181

Tôi đã nhân bản một 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 khác của kho lưu trữ, phiên bản giống hệt với bản mà tôi đã nhân bản một tháng trước.

Làm thế nào để tôi làm điều này?



Câu trả lời:


242

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 điều đó:

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

27
Bạn đã không đề cập đến nó, nhưng điều này sẽ chỉ thiết lập lại masterchi nhánh, được kiểm tra theo mặc định trên một bản sao. Nếu một nhánh khác không phải masterlà nhánh phát triển chính của bạn phải được kiểm tra trước tiêngit reset
Steve Folly

16
Tại sao bạn không thực hiện kiểm tra đơn giản về cam kết mong muốn?
nemoo

10
Bởi vì bạn sẽ ở trạng thái "tách rời" sau khi thanh toán cho một cam kết cụ thể.
Rui Carneiro

6
@RuiCarneiro sẽ tốt hơn nếu git checkout -b new_branch hashbạn sử dụng bạn tạo một nhánh mới dựa trên hàm băm mà không cần chạm vào bất kỳ nhánh nào khác. Di chuyển đầu của một chi nhánh hiện tại có thể gây ra vấn đề khi đến lúc phải đẩy một cái gì đó đến một máy chủ từ xa.
Loïc Faure-Lacroix

1
@YuriGhensev Nếu cam kết đã được đẩy đến một chi nhánh từ xa, bạn có thể làm git pull origin [branch]khác, afaik, nó bị mất.
Rui Carneiro

94

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

git checkout  commithash

trong chuỗi này

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

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


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

8
git initlà không cần thiết
Lautaro Paskevicius

37

Sử dụng git logđể tìm bản sửa đổi mà bạn muốn quay lại và ghi chú hàm băm cam kết. Sau đó, bạn có 2 tùy chọn:

  1. Nếu bạn dự định cam kết bất cứ điều gì sau lần sửa đổi đó, tôi khuyên bạn nên kiểm tra một chi nhánh mới:git checkout -b <new_branch_name> <hash>

  2. Nếu bạn không có kế hoạch cam kết bất cứ điều gì sau lần sửa đổi đó, bạn chỉ cần kiểm tra mà không cần chi nhánh: git checkout <hash>- LƯU Ý: Điều này sẽ đặt kho lưu trữ của bạn ở trạng thái 'ĐẦU tách rời', có nghĩa là hiện tại nó không được gắn vào bất kỳ chi nhánh nào - sau đó bạn ' sẽ có một số công việc bổ sung để hợp nhất các cam kết mới với một chi nhánh thực tế .

Thí 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 không mất bất kỳ thông tin nào, do đó bạn có thể chuyển sang phiên bản mới hơn khi nó ổn định.


2
Nhưng cũng lưu ý rằng bạn đang ở trên một đầu tách ra, điều đó ổn đối với các hoạt động chỉ đọc. Nhưng khi bạn có ý định thực hiện các thay đổi bắt đầu từ phiên bản này, bạn cần tạo một chi nhánh mới. Xem sitaramc.github.com/con accept / drached-head.html để biết thêm thông tin.
Rudi

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

Để trở lại "trạng thái làm việc", bạn có thể chỉ cần git checkout developphát triển là tên của chi nhánh của bạn.
Steve Tauber

1
@SteveTauber tốt, giả sử bạn một chi nhánh khác đang hoạt động , thay đổi thành chi nhánh đó thực sự là đủ.
jweyrich

19

Nếu phiên bản đó bạn cần lấy là một nhánh hoặc một thẻ thì:

git clone -b branch_or_tag_name repo_address_or_path

2

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

Có thể đã có cá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. Một cách tốt để làm điều này là sử dụng git loghoặc có thể trực quan hơn với các công cụ như gitk(có lẽ gitk --allđể xem tất cả các nhánh và thẻ). Nếu bạn có thể phát hiện các băm xác nhận đã đượ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_namehoặc trực tiếp với hàm băm thay vì tên thẻ).


1

Bạn có thể giải quyết nó như thế này:

git reset --hard sha

nơi shaví dụ như:85a108ec5d8443626c690a84bc7901195d19c446

Bạn có thể nhận được sha mong muốn với lệnh:

git log

1

uploadpack.allowReachableSHA1InWant

Git 2.5.0 , biến cấu hình này có thể được bật trên máy chủ, ở đây yêu cầu tính năng GitHubcam kết GitHub kích hoạt tính năng này .

Bitbucket Server đã kích hoạt nó kể từ phiên bản 5.5+ .

Sử dụng:

# Make remote with 4 commits, and local with just one.
mkdir server
cd server
git init
touch 1
git add 1
git commit -m 1
git clone ./ ../local
for i in {2..4}; do
    touch "$i"
    git add "$i"
    git commit -m "$i"
done

# Before last commit.
SHA3="$(git log --format='%H' --skip=1 -n1)"
# Last commit.
SHA4="$(git log --format='%H' -n1)"

# Failing control without feature.
cd ../local
# Does not give an error, but does not fetch either.
git fetch origin "$SHA3"
# Error.
git checkout "$SHA3"

# Enable the feature.
cd ../server
git config uploadpack.allowReachableSHA1InWant true

# Now it works.
cd ../local
git fetch origin "$SHA3"
git checkout "$SHA3"
# Error.
git checkout "$SHA4"

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 sẽ giả sử rằng bạn có thể lấy SHA1 từ bản sao hiện tại mà bạn có?

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

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


0

Có lẽ git resetgiải quyết vấn đề của bạn.

git reset --hard -#commit hash-
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.