원격 저장소의 Git 클론 특정 버전


181

약 한 달 전에 원격 자식 저장소를 복제했습니다. 원격 저장소가 많이 변경되었으며 이제 불안정 해졌습니다. 이제 한 달 전에 복제 한 것과 동일한 버전의 저장소가 필요합니다.

어떻게해야합니까?



답변:


242

원하는 커밋으로 저장소를 "재설정"할 수 있습니다 (예 : 1 개월 전).

이를 위해 git-reset 을 사용하십시오 .

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

27
언급하지 않았지만 이것은 master분기 에서만 재설정되며 복제본에서 기본적으로 체크 아웃됩니다. master이전에 먼저 확인해야하는 주요 개발 지점 이외의 지점 인 경우git reset
Steve Folly

16
원하는 커밋을 간단하게 체크 아웃하지 않는 이유는 무엇입니까?
nemoo

10
특정 커밋에 대한 체크 아웃 후 "분리 된 HEAD"상태에 있기 때문입니다.
Rui Carneiro

6
@RuiCarneiro git checkout -b new_branch hash다른 분기를 건드리지 않고 해시를 기반으로 새 분기를 만드는 것이 좋습니다 . 기존 지점의 헤드를 이동하면 원격 서버로 무언가를 푸시 할 때 문제가 발생할 수 있습니다.
Loïc Faure-Lacroix

1
@YuriGhensev 커밋이 이미 원격 브랜치로 푸시되면 git pull origin [branch]다른 방법으로 할 수 있습니다 .
Rui Carneiro

94

간단하게 사용할 수 있습니다

git checkout  commithash

이 순서로

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

커밋 해시는이 "45ef55ac20ce2389c9180658fdba35f4a663d204"와 같습니다.


9
이 답변이 가장 좋습니다. 나는 git reset --hard에 찬성하여 피해야 한다고 생각 합니다 git checkout commit-hash. A git reset --hard는 때때로 바람직하지 않은 git history의 일부를 제거합니다.
Jordan Stewart

8
git init필요하지 않습니다
Lautaro Paskevicius

37

사용은 git log당신이 롤백하려는 개정을 발견하고,이 해시를 커밋의 메모를 촬영합니다. 그 후에는 두 가지 옵션이 있습니다.

  1. 해당 개정 이후에 커밋 할 계획 이있는 경우 새 지점을 체크 아웃하는 것이 좋습니다 .git checkout -b <new_branch_name> <hash>

  2. 당신이 그 개정 후의 아무것도 저지하지 않을 경우 수 단순히 체크 아웃 지점없이 : git checkout <hash>- 참고 :이은 현재 어느 지점에 연결되지 않은 의미 '분리 HEAD'상태에있는 저장소를 넣어 것입니다 - 그럼 당신 ' 새로운 커밋을 실제 브랜치에 병합하기위한 추가 작업이 필요하다 .

예:

$ 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.

이렇게하면 정보를 잃지 않으므로 안정 될 때 최신 버전으로 이동할 수 있습니다.


2
그러나 분리 된 헤드에 있다는 점에도 불구하고 읽기 전용 작업에는 적합합니다. 그러나이 개정판에서 시작하여 변경하려면 새 분기를 작성해야합니다. 자세한 내용은 sitaramc.github.com/concepts/detached-head.html 을 참조하십시오.
Rudi

@Rudi : 감사합니다. 사용법을 보여주는 예제 일뿐입니다. 언급하도록 업데이트되었습니다.
jweyrich

"작업 상태"로 돌아가려면 git checkout developdevelop이 지점의 이름 인 곳만 있으면됩니다.
Steve Tauber

1
@SteveTauber 아니라, 가정하여 당신 다른 지점 노력하고 그 지점이 실제로 충분히에 변화를.
jweyrich

19

해당 버전이 브랜치 또는 태그 인 경우 :

git clone -b branch_or_tag_name repo_address_or_path

2

중앙 집중식 버전 제어 시스템과 달리 Git은 전체 저장소를 복제하므로 현재 원격 파일뿐만 아니라 전체 기록을 가져옵니다. 로컬 저장소에는이 모든 것이 포함됩니다.

당시 특정 버전을 표시하는 태그 가있을 수 있습니다 . 그렇지 않은 경우 로컬에서 직접 만들 수 있습니다. 이를 수행하는 좋은 방법은 (아마도 모든 브랜치와 태그를 보는 git log것과 같은) 도구 를 사용 하거나보다 시각적으로 사용하는 것 입니다. 당시에 사용 된 커밋 해시를 발견 할 수 있으면이를 사용하여 태그를 지정한 다음 새 작업 복사본에서 태그를 확인할 수 있습니다 (예 : 태그 이름 대신 해시로 직접).gitkgitk --allgit tag <hash>git checkout -b new_branch_name tag_name


1

다음과 같이 해결할 수 있습니다.

git reset --hard sha

어디 sha 예를 들면 :85a108ec5d8443626c690a84bc7901195d19c446

다음 명령으로 원하는 sha를 얻을 수 있습니다.

git log

1

uploadpack.allowReachableSHA1InWant

Git 2.5.0 부터 서버에서이 구성 변수를 사용할 수 있습니다. 여기에서 GitHub 기능 요청이 기능을 사용 하는 GitHub 커밋이 가능합니다 .

Bitbucket Server는 버전 5.5 이상부터 활성화했습니다 .

용법:

# 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

필요한 소스 트리는 여전히 git 저장소 내에서 사용할 수 있지만 관심있는 커밋의 SHA1이 필요합니다. 현재 복제본에서 SHA1을 가져올 수 있다고 가정합니까?

해당 SHA1을 얻을 수있는 경우 동일한 리포지토리를 갖도록 분기를 생성 / 재설정 할 수 있습니다.

Rui의 답변에 따른 명령


0

아마 git reset당신의 문제를 해결합니다.

git reset --hard -#commit hash-
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.