나는 git pull
특정 커밋까지만 하고 싶습니다 .
A->B->C->D->E->F (Remote master HEAD)
그래서 내 local master
HEAD가를 가리키고 있다고 가정 B
하고 E
. 어떻게해야합니까?
이것은 특정 커밋을 당기는 것이 아니라 특정 커밋을 당기는 것입니다.
나는 git pull
특정 커밋까지만 하고 싶습니다 .
A->B->C->D->E->F (Remote master HEAD)
그래서 내 local master
HEAD가를 가리키고 있다고 가정 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~N
git 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^`