특정 커밋까지 힘내 풀


106

나는 git pull특정 커밋까지만 하고 싶습니다 .

 A->B->C->D->E->F (Remote master HEAD)

그래서 내 local masterHEAD가를 가리키고 있다고 가정 B하고 E. 어떻게해야합니까?

이것은 특정 커밋을 당기는 것이 아니라 특정 커밋을 당기는 것입니다.



3
git fetchgit merge E.
찌를

예를 들어 현재 B에 있지만 C, E 및 F 만 가져오고 싶습니다. D를 제거하고 싶습니다. 감사합니다!
Frenkey

@Frenkey는 마스터를 병합 한 다음 마지막 세 개의 커밋을 제거한 다음 체리가 마지막 두 개를 선택할 수 있습니다. 또한 더 제어 된 자식 병합을 위해 rebase -i를 시도 할 수 있습니다.
Ninja420

C에서만 변경 사항을 가져 오려면 A와 B의 변경 사항 만 포함하지 않고 C 만 가져 오려면 어떻게해야합니까? 어떻게 할 수 있습니까?
Vikas Chauhan

답변:


120

git pull아무것도하지만없는 git fetch다음 git merge. 그래서 당신이 할 수있는 것은

git fetch remote example_branch

git merge <commit_hash>


"Refer to this"는 무엇입니까?
developerbmw

@Brett은 .. 링크를 게시 잊으 완전히 제거
unrealsoul007

@ unrealsoul007 이것은 하나의 특정 커밋을 병합합니다. 따라서 B에서 E로 가져 오려면 명령은 git merge <commit_hash C> <commit_hash D> <commit_hash E> 맞습니까?
Wim Feijen

7
@WimFeijen은 git merge E병합합니다 E모든 조상과 함께 C하고 D(자식이 그것을 알고 A그리고 B그들은 당신의 지점에 이미 있었기 때문에 병합 할 필요가 없습니다). 변경 사항 만 원하는 경우 대신 E해야 git cherry-pick E합니다.
neXus

답변 주셔서 감사합니다. 같은 문제를 찾고있었습니다.
Akash Bisariya

25

먼저 원격 저장소에서 최신 커밋을 가져옵니다. 이것은 로컬 지점에 영향을 미치지 않습니다.

git fetch origin

그런 다음 원격 추적 분기를 확인하고 git 로그를 수행하여 커밋을 확인하십시오.

git checkout origin/master
git log

병합하려는 커밋의 커밋 해시 (또는 첫 번째 ~ 5 자)를 잡고 해당 커밋을 마스터로 병합합니다.

git checkout master
git merge <commit hash>

1
이것이 광고 된대로 작동하지 않기 때문에 나는 당신을 반대 투표했습니다. 우선, "git fetch origin"메소드를 사용하여 모든 원격 브랜치를 가져옵니다 (특히 많은 브랜치가있는 프로젝트에서 작업하는 사람들의 경우 명시 적으로 지적해야합니다). 둘째,이 방법을 사용하면 "git merge <commit hash>"는 로컬 기록을 원하는 커밋까지 병합하지 않습니다. 예 : 로컬에서 커밋 100에 있고 모든 것을 가져 와서 최대 150 개를 얻고 자합니다 (원격 HEAD가 100에 있음).
자리 표시 자

8
@Placeholder git fetch그런 말도 안되는 글을 쓰기 전에 매뉴얼을 읽어야합니다 . 더 나아가, 당신은 원래의 질문과 나의 대답을 읽어야합니다. 내 답변을 따르면 내가 명시 적으로 사용자에게 지시 한대로 "역사로 돌아 가지"않을 것 git checkout master입니다. 전반적으로 자신이하는 일에 대해 50 % 이상 명확하지 않은 경우 게시물을 올리지 마십시오.
developerbmw

1
다른 사람에게 명확하지 않은 경우 git fetch origin명시 적으로 origin을 가져옵니다 .
Daniel Farrell

2
이것은 완벽하게 작동하며 허용되는 답변보다 더 잘 설명됩니다.
walen 19

1
Best answer, Worked Perfectly
Asfandyar Khan

14

최신 커밋을 가져와 원하는 커밋까지 실행 취소 할 수도 있습니다.

git pull origin master
git reset --hard HEAD~1

master원하는 분기로 교체하십시오 .

git log를 사용하여 되돌리려는 커밋을 확인하십시오.

git log

개인적으로 이것은 나를 위해 더 잘 작동했습니다.

기본적으로 이것이하는 일은 최신 커밋을 가져오고 수동으로 커밋을 하나씩 되 돌리는 것입니다. 커밋 기록을 보려면 git log를 사용하십시오.

장점 : 광고 된대로 작동합니다. 커밋 해시를 사용하거나 불필요한 분기를 가져올 필요가 없습니다.

나쁜 점 : 커밋을 하나씩 되돌려 야합니다.

경고 : 모든 로컬 변경 사항을 커밋 / 숨 깁니다 --hard. 잃게 될 것이기 때문입니다 . 자신의 책임하에 사용하십시오!


3
나는 왜 반대표를 던 졌는지 모르겠습니다. 이것이 가장 깨끗한 방법 인 것 같습니다. 그리고 다른 답변과는 달리 최신 정보를 얻으려는 즉시 간단한 끌어 오기가 수행됩니다
Mauricio Pasquier Juan

더 많은 찬성 투표를하지 마십시오. 유일한 단점은 HEAD돌아 가기 전에 에 가야한다는 것입니다. 갈등을 해결해야한다면 어떤 일이 일어날 지 모르겠습니다. 그러나이 솔루션은를 허용하고 git pull --rebase, 말한 것과는 반대로 (즉, 3 개의 커밋에 대해 ) N커밋 전으로 직접 재설정 할 수 있습니다 . git reset --hard HEAD~Ngit reset --hard HEAD~3
증권 Overflaw

할 수 있으며 git reset --hard SHA원하는 커밋으로 재설정하므로 거꾸로 계산할 필요가 없습니다.
Visya

2

커밋을 브랜치에 병합하면 그 사이의 모든 기록을 가져와야합니다.

관찰 :

$ 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 개 삽입 (+)
$ 고양이 편지
ㅏ
비
씨
디

1

이 비디오 에서 업데이트 된 답변을 찾았습니다 . 수락 된 답변이 저에게 적합하지 않습니다.

먼저 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>. 그게 다야. 참조를 위해 비디오 를 확인하십시오 .


0

이것은 나를 위해 작동합니다.

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^`
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.