나는 git pull특정 커밋까지만 하고 싶습니다 .
A->B->C->D->E->F (Remote master HEAD)
그래서 내 local masterHEAD가를 가리키고 있다고 가정 B하고 E. 어떻게해야합니까?
이것은 특정 커밋을 당기는 것이 아니라 특정 커밋을 당기는 것입니다.
나는 git pull특정 커밋까지만 하고 싶습니다 .
A->B->C->D->E->F (Remote master HEAD)
그래서 내 local masterHEAD가를 가리키고 있다고 가정 B하고 E. 어떻게해야합니까?
이것은 특정 커밋을 당기는 것이 아니라 특정 커밋을 당기는 것입니다.
git fetch및 git merge E.
답변:
git pull아무것도하지만없는 git fetch다음 git merge. 그래서 당신이 할 수있는 것은
git fetch remote example_branch
git merge <commit_hash>
git merge E병합합니다 E모든 조상과 함께 C하고 D(자식이 그것을 알고 A그리고 B그들은 당신의 지점에 이미 있었기 때문에 병합 할 필요가 없습니다). 변경 사항 만 원하는 경우 대신 E해야 git cherry-pick E합니다.
먼저 원격 저장소에서 최신 커밋을 가져옵니다. 이것은 로컬 지점에 영향을 미치지 않습니다.
git fetch origin
그런 다음 원격 추적 분기를 확인하고 git 로그를 수행하여 커밋을 확인하십시오.
git checkout origin/master
git log
병합하려는 커밋의 커밋 해시 (또는 첫 번째 ~ 5 자)를 잡고 해당 커밋을 마스터로 병합합니다.
git checkout master
git merge <commit hash>
git fetch그런 말도 안되는 글을 쓰기 전에 매뉴얼을 읽어야합니다 . 더 나아가, 당신은 원래의 질문과 나의 대답을 읽어야합니다. 내 답변을 따르면 내가 명시 적으로 사용자에게 지시 한대로 "역사로 돌아 가지"않을 것 git checkout master입니다. 전반적으로 자신이하는 일에 대해 50 % 이상 명확하지 않은 경우 게시물을 올리지 마십시오.
git fetch origin명시 적으로 origin을 가져옵니다 .
최신 커밋을 가져와 원하는 커밋까지 실행 취소 할 수도 있습니다.
git pull origin master
git reset --hard HEAD~1
master원하는 분기로 교체하십시오 .
git log를 사용하여 되돌리려는 커밋을 확인하십시오.
git log
개인적으로 이것은 나를 위해 더 잘 작동했습니다.
기본적으로 이것이하는 일은 최신 커밋을 가져오고 수동으로 커밋을 하나씩 되 돌리는 것입니다. 커밋 기록을 보려면 git log를 사용하십시오.
장점 : 광고 된대로 작동합니다. 커밋 해시를 사용하거나 불필요한 분기를 가져올 필요가 없습니다.
나쁜 점 : 커밋을 하나씩 되돌려 야합니다.
경고 : 모든 로컬 변경 사항을 커밋 / 숨 깁니다 --hard. 잃게 될 것이기 때문입니다 . 자신의 책임하에 사용하십시오!
HEAD돌아 가기 전에 에 가야한다는 것입니다. 갈등을 해결해야한다면 어떤 일이 일어날 지 모르겠습니다. 그러나이 솔루션은를 허용하고 git pull --rebase, 말한 것과는 반대로 (즉, 3 개의 커밋에 대해 ) N커밋 전으로 직접 재설정 할 수 있습니다 . git reset --hard HEAD~Ngit reset --hard HEAD~3
git reset --hard SHA원하는 커밋으로 재설정하므로 거꾸로 계산할 필요가 없습니다.
커밋을 브랜치에 병합하면 그 사이의 모든 기록을 가져와야합니다.
관찰 :
$ git init ./
/Users/dfarrell/git/demo/.git/에 빈 Git 저장소가 초기화되었습니다.
$ echo 'a'> 편지
$ git add letter
$ git commit -m '초기 편지'
[마스터 (루트-커밋) 6e59e76] 초기 문자
1 개 파일 변경, 1 개 삽입 (+)
모드 100644 문자 만들기
$ echo 'b'>> 문자
$ git add letter && git commit -m 'Adding letter'
[마스터 7126e6d] 문자 추가
1 개 파일 변경, 1 개 삽입 (+)
$ echo 'c'>> 문자; git add letter && git commit -m 'Adding letter'
[마스터 f2458be] 문자 추가
1 개 파일 변경, 1 개 삽입 (+)
$ echo 'd'>> 문자; git add letter && git commit -m 'Adding letter'
[마스터 7f77979] 문자 추가
1 개 파일 변경, 1 개 삽입 (+)
$ echo 'e'>> 문자; git add letter && git commit -m 'Adding letter'
[마스터 790eade] 편지 추가
1 개 파일 변경, 1 개 삽입 (+)
$ 자식 로그
커밋 790eade367b0d8ab8146596cd717c25fd895302a
저자 : Dan Farrell
날짜 : 2015 년 7 월 16 일 목요일 14:21:26 -0500
편지 추가
커밋 7f77979efd17f277b4be695c559c1383d2fc2f27
저자 : Dan Farrell
날짜 : 2015 년 7 월 16 일 목요일 14:21:24 2015-0500
편지 추가
커밋 f2458bea7780bf09fe643095dbae95cf97357ccc
저자 : Dan Farrell
날짜 : 2015 년 7 월 16 일 목요일 14:21:19 -0500
편지 추가
커밋 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
저자 : Dan Farrell
날짜 : 7 월 16 일 목요일 14:20:52 2015-0500
편지 추가
커밋 6e59e7650314112fb80097d7d3803c964b3656f0
저자 : Dan Farrell
날짜 : 7 월 16 일 목요일 14:20:33 2015 -0500
초기 편지
$ git checkout 6e59e7650314112fb80097d7d3803c964b3656f
$ git checkout 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
참고 : '7126e6dcb9c28ac60cb86ae40fb358350d0c5fad'를 확인하십시오.
'분리 된 HEAD'상태입니다. 주변을 둘러보고 실험 할 수 있습니다.
변경하고 커밋하고 여기에서 만든 커밋을 삭제할 수 있습니다.
다른 체크 아웃을 수행하여 분기에 영향을주지 않고 상태를 유지합니다.
생성 한 커밋을 유지하기 위해 새 브랜치를 생성하려면
체크 아웃 명령과 함께 -b를 다시 사용하여이를 수행하십시오 (지금 또는 나중에). 예:
git checkout -b new_branch_name
HEAD는 이제 7126e6d에 있습니다 ... 문자 추가 중
$ git checkout -b B 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
새로운 지점 'B'로 전환
$ git pull 790eade367b0d8ab8146596cd717c25fd895302a
치명적 : '790eade367b0d8ab8146596cd717c25fd895302a'가 git 저장소로 보이지 않습니다.
치명적 : 원격 저장소에서 읽을 수 없습니다.
올바른 액세스 권한이 있는지 확인하십시오
저장소가 존재합니다.
$ git merge 7f77979efd17f277b4be695c559c1383d2fc2f27
7126e6d..7f77979 업데이트
빨리 감기
편지 | 2 ++
1 개 파일 변경, 2 개 삽입 (+)
$ 고양이 편지
ㅏ
비
씨
디
이 비디오 에서 업데이트 된 답변을 찾았습니다 . 수락 된 답변이 저에게 적합하지 않습니다.
먼저 git에서 최신 리포지토리를 복제하지 않은 경우 사용
git clone <HTTPs link of the project>
(또는 SSH 사용) 한 다음
git checkout <branch name>
.
명령 사용
git log
최신 커밋을 확인하십시오. 특정 커밋의 shal을 복사합니다. 그런 다음 명령을 사용하십시오.
git fetch origin <Copy paste the shal here>
Enter 키를 누른 후. 이제 명령을 사용하십시오.
git checkout FETCH_HEAD
이제 특정 커밋을 로컬에서 사용할 수 있습니다. 무엇이든 변경하고 git push origin <branch name>. 그게 다야. 참조를 위해 비디오 를 확인하십시오 .
이것은 나를 위해 작동합니다.
git pull origin <sha>
예 :
[dbn src]$ git fetch
[dbn src]$ git status
On branch current_feature
Your branch and 'origin/master' have diverged,
and have 2 and 7 different commits each, respectively.
...
[dbn src]$ git log -3 --pretty=oneline origin/master
f4d10ad2a5eda447bea53fed0b421106dbecea66 CASE-ID1: some descriptive msg
28eb00a42e682e32bdc92e5753a4a9c315f62b42 CASE-ID2: I'm so good at writing commit titles
ff39e46b18a66b21bc1eed81a0974e5c7de6a3e5 CASE-ID2: woooooo
[dbn src]$ git pull origin 28eb00a42e682e32bdc92e5753a4a9c315f62b42
[dbn src]$ git status
On branch current_feature
Your branch and 'origin/master' have diverged,
and have 2 and 1 different commits each, respectively.
...
이것은 28eb00, ff39e4 및 이전의 모든 것을 가져 오지만 f4d10ad는 가져 오지 않습니다. pull --rebase 사용을 허용하고 gitconfig의 pull 설정을 따릅니다. 이것은 기본적으로 28eb00을 분기로 취급하기 때문에 작동합니다.
내가 사용중인 git 버전의 경우이 방법에는 전체 커밋 해시가 필요합니다. 약어 나 별칭은 허용되지 않습니다. 다음과 같이 할 수 있습니다.
[dbn src]$ git pull origin `git rev-parse origin/master^`