자식 풀 실행 취소, 저장소를 오래된 상태로 만드는 방법


1006

git pull을 되돌 리거나 취소하여 git pull을 수행하기 전에 이전 소스 / 레포지토리가 이전 상태가되도록하는 방법이 있습니까? 그렇게하고 싶지 않은 파일을 병합했지만 나머지 파일은 병합하기 때문에이 작업을 수행하고 싶습니다. 그래서 그 파일을 다시 가져오고 싶습니다. 가능합니까?

편집 : 설명을 위해 git merge를 실행 취소하고 싶습니다. 몇 가지 답변을 본 후 나는 이것을했다.

git reflog
bb3139b... HEAD@{0}: pull : Fast forward
01b34fa... HEAD@{1}: clone: from ...name...

이제 어떻게해야합니까? 이렇게 git reset --hard OK는? 다시 나사로 고정하고 싶지 않으므로 자세한 단계를 요구합니까?


23
기록에 복제본과 가져 오기의 두 가지만있는 것 같습니다. clone :으로 재설정하십시오. git reset --hard 01b34fa이 경우 git reset --hard HEAD^HEAD 전에 하나의 커밋으로 재설정 할 수 있습니다 .
jkp

2
당신이 당신의 작업 디렉토리에있는 파일을 수정하려면 --hard이 필요하다
윌리엄 Pursell

3
@ seg.server.fault : 그것이 작동한다면, 당신은 항상 대답을 받아 들일 수 있습니다;)
jkp

7
git reset --hard HEAD ^
funroll

7
git refloggit으로 수행 된 모든 것을 보여줍니다. 예를 들어 목표가 아닌에 git reset --hard [sha1 of something from reflog]표시된 모든 내용을 되돌릴 우려가 reflog있습니다. 불량 데이터 (happens)가있는 원점에서 가져온 마스터 브랜치의 병합을 되돌리려는 경우 해당 병합 후에 다른 브랜치에서 작업했습니다. reflog다른 지점의 모든 창을 표시합니다. 그러나 git checkout mastergit reset --hard [SH1 of commit on master branch just before merge]원점에서 뽑아 병합을 제거에만 현재 마스터 분기를 재설정합니다.
블라디미르 부 카낙

답변:


1427

Running git pull은 다음 작업을 순서대로 수행합니다.

  1. git fetch
  2. git merge

병합 단계는 구성에서 병합되도록 설정된 분기를 결합합니다. 병합 단계 를 실행 취소하려고 하지만 가져 오기 는 수행하지 않을 것입니다 (많은 의미가 없으며 필요하지 않아야 함).

병합 을 취소하려면을 사용 git reset --hard하여 로컬 저장소를 이전 상태로 재설정하십시오. git-reflog 를 사용 하여 이전 상태의 SHA-1을 찾은 다음 재설정하십시오.

경고

이 섹션에 나열된 명령은 커밋되지 않은 모든 변경 사항을 제거하여 잠재적으로 작업 손실을 초래합니다.

git reset --hard

또는 다음과 같은 특정 시점으로 재설정하십시오.

git reset --hard master@{"10 minutes ago"}

325
git-reflog 및 복사 해시를 사용하는 대신 이전 상태를 선택하는 가장 좋은 방법은 , 또는 , master@{1}의 이전 위치 인 바로 가기를 사용하는 것 입니다. 이러한 방식으로 개정판을 지정하는 방법에 대한 자세한 내용 은 "개정판 지정"섹션을 참조하십시오. mastermaster@{"5 minutes ago"}master@{14:30}man git-rev-parse
Cascabel

38
이 경우 ORIG_HEAD에서 또한 작업 ( "--hard ORIG_HEAD 다시 힘내")한다
야쿱 Narębski

@Jelfromi : 그 팁에 감사드립니다. 나는 HEAD와 관련하여 수정본을 고르는 것에 대해 알고 있었지만 질문이 제기되었을 때 나는 얼마나 오래 전에 돌아가고 싶었는지 알지 못했습니다.
jkp

내가 당기면라고 말합니다 Updating d2c90a3..035ac4d. 여기에서 d2c90a3재설정 매개 변수로 사용할 수도 있습니다 .
Thai

reflog를 사용할 때 해시를 입력 할 필요가 없습니다. HEAD @ {1} 또는 참조 번호에 정의 된 이전 번호를 사용할 수도 있습니다.
Simon The Cat

338

jkp의 답변과 동일하지만 다음은 전체 명령입니다.

git reset --hard a0d3fe6

a0d3fe6은 다음을 수행하여 찾을 수 있습니다.

git reflog

실행 취소하려는 지점을보고


git reset HEAD --hard예를 들어 왜 내가 할 수 없습니까?
Sung Cho

9
이 방법을 사용하면 예를 들어 다시 여러 끌어 갈 수 있습니다 @MikeC
xji

2
왼쪽 ID를 사용할 수 없었지만 git reset --hard HEAD@{n}효과가 있었습니다
E. Sundin

1
당신은 jkp의 답변을 수년 후에 거의 복제하지 않고 편집하도록 제안했을 것입니다.
Abhishek Anand

내가 이것을 가지고 있다면 git reflog: dab04ec HEAD @ {0}, aaaaaaa HEAD @ {1} 및 bbbbbbb HEAD @ {2}. 내가 git reset --hard bbbbbbb하면 HEAD 0과 1을 잃을 것입니까?
pmiranda

115

병합을 취소하는보다 현대적인 방법은 다음과 같습니다.

git merge --abort

그리고 조금 오래된 방법 :

git reset --merge

이전 답변에서 설명한 구식 방법 (경고 : 모든 로컬 변경 사항을 버립니다) :

git reset --hard

그러나 실제로는 그것이 주어진 git merge --abort것과 동등한 것에 주목할 가치 가 있습니다. 이것은 git help for merge 명령에서 읽을 수 있습니다.git reset --mergeMERGE_HEAD

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.

더있을 때 실패한 병합 한 후 MERGE_HEAD, 실패한 병합으로 취소 할 수 없다 git reset --merge반드시으로하지만 git merge --abort, 그들은 같은 일에 대한 이전 및 새 구문뿐만 아니라 그래서 . 이것이 git reset --merge제가 일상 업무에서 훨씬 더 유용한 이유 입니다.


20
git merge --abort병합 git pull이 완료된 후 가 아니라 병합 중에 작동합니다 . 따라서이 답변은 질문과 관련이없는 것 같습니다.
Abhishek Anand

1
git reset --merge커밋을 위해 준비되지 않은 모든 변경 사항을 삭제합니다. 어려운 길을 찾았습니다.
theadriangreen

62

그것은 처음 사용합니다 : git reflog

이전 상태의 SHA를 찾고 확인하십시오 (HEAD @ {1}은 예입니다)

git reset --hard HEAD@{1}

40

gitk ( "gitk --all from git command line"을 실행 해 보자)가 있다면 간단하다. 실행하고 롤백하려는 커밋 (마우스 오른쪽 버튼 클릭)을 선택하고 "마스터 브랜치를 여기로 재설정"을 선택하십시오. 커밋되지 않은 변경 사항이 없으면 "하드"옵션을 선택하십시오.


8
당신이 그것을 보지 못했다면 이것은 가치가 있습니다. 미친 GUI가 나타납니다.
Evan Moran

35

$COMMIT수행하기 전에 마지막 커밋 ID 라고 가정하십시오 git pull. 마지막 당김을 취소하려면

git reset --hard $COMMIT

.

보너스:

끌어 당김에 대해 흥미로운 트릭을 나누고 싶습니다.

git pull --rebase

이 위의 명령은 내 자식 생활에서 가장 유용한 명령으로 많은 시간을 절약했습니다.

새로 커밋을 서버에 푸시하기 전에이 명령을 시도하면 최신 서버 변경 사항 (페치 + 병합)을 자동으로 동기화하고 커밋을 git log의 맨 위에 놓습니다. 수동 풀 / 병합에 대해 걱정할 필요가 없습니다.

자세한 내용은 http://gitolite.com/git-pull--rebase를 참조하십시오.


17

변경 사항을 가져 오는 가장 쉬운 방법입니다.

** Warning **

새로 만든 파일과 폴더가 삭제되므로 변경된 파일을 백업하십시오 .

git reset --hard 9573e3e0

9573e3e0{커밋 ID}는 어디에 있습니까


이 응답은 우리가 이런 식으로 뭔가를 얻을 위스콘신 자식 풀 원산지 분기를 할 경우 때문에, 매우 유용 Updating ffce65bd..e929e884는 할git reset --hard ffce65bd
에르네스토 알폰소

15

넌 할 수있어 git reset --hard ORIG_HEAD

"풀 (pull)"또는 "병합 (merge)"이후 ORIG_HEAD를 현재 상태로 설정하여 해당 조치를 수행합니다.


5

git pull 은 아래 작업을 수행합니다.

나는. git fetch

ii. git merge

풀을 실행 취소하려면 작업을 수행하십시오.

나는. git reset --hard --- 그것은 또한 모든 지역 변화를 되돌립니다

또는

ii. git reset --hard master@{5.days.ago} (예 10.minutes.ago: 1.hours.ago, 1.days.ago..) 로컬 변경 사항을 가져옵니다.

또는

iii. git reset --hard commitid

개량:

다음 번 git pull --rebasegit pull.. 대신 동기화 서버 변경 (페치 및 병합)을 사용하십시오.


4

실패한 병합이있는 경우을 실행 취소하려는 가장 일반적인 이유는 git pull실행 git reset --merge이 가져온 것입니다. 가져온 파일은 유지하지만 병합을 git pull시도한 병합은 실행 취소합니다 . 그러면 git merge때때로 생성 되는 혼란없이 수행 할 작업을 결정할 수 있습니다 . 그리고 --hard다른 모든 대답에 언급 된 정확한 커밋 ID를 찾기 위해 하나가 필요하지 않습니다 .

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