Git에서 로컬 커밋을 버립니다.


1468

나쁜 체리 따기 때문에 로컬 Git 리포지토리는 현재 상태보다 좋은 5 가지 커밋보다 앞서 있습니다. 이 커밋을 모두 없애고 다시 시작하고 싶습니다.

분명히 내 작업 디렉토리를 삭제하고 다시 복제하면 GitHub에서 모든 것을 다시 다운로드하는 것이 과도하게 보이고 시간을 잘 사용하지 않는 것 같습니다.

어쩌면 git revert내가 필요한 것 일지도 모르지만 코드 자체를 올바른 상태로 되돌 리더라도 원점 (또는 6 개)보다 10 개의 커밋 을 끝내기를 원하지 않습니다 . 지난 30 분 동안 일어난 적이없는 척하고 싶습니다.

이를 수행하는 간단한 명령이 있습니까? 명백한 유스 케이스처럼 보이지만 그 예를 찾지 못했습니다.


이 질문은 구체적으로 commit 에 관한 것이 아니라 다음 에 관한 것입니다.

  • 추적되지 않은 파일
  • 비 단계적 변경
  • 단계적이지만 커밋되지 않은 변경

답변:


2470

초과 커밋이 나에게만 보이는 git reset --hard origin/<branch_name> 경우, 원점으로 돌아갈 수 있습니다 . 그러면 리포지토리의 상태가 이전 커밋으로 재설정되고 모든 로컬 변경 내용이 삭제됩니다.

를 수행 git revert하면 커밋을 수행하여 모든 사람의 기록을 깔끔하게 유지하는 방식으로 오래된 커밋을 제거 합니다.


91
git reset --hard <commit hash, branch, or tag>원격 브랜치 이외의 특정 참조로 이동하려는 경우
Sam Soffes

55
분명히하기 위해, master다른 지점에서 작업하고 있지 않다면 다음을 실행해야합니다.git reset --hard origin/<your-branch-name>
Zoltán

33
이것은 로컬 커밋을 버릴뿐만 아니라 작업 트리의 모든 것을 버립니다 (예 : 로컬 파일). 당신이 원하는 모든 uncommit이지만, 그대로 컴퓨터를 사용하지 않을 경우에는 당 "자식 재설정 HEAD ^"... 어떻게해야 stackoverflow.com/questions/2845731/...
aaronbauman

3
이 후에 Fetch를 수행 할 수 있습니다. 이로 인해 SourceTree에서 커밋 수 대기 대기 카운터가 수정되었습니다.
Stan

2
git reset --hard origin/<branch_name>프로젝트 구성도 재설정되므로주의하십시오. .cfg기본 파일로 재설정 된 큰 파일이 있습니다. 나는 그것에 다시 몇 시간을 보내야했다.
MAC

271

로컬 마스터 브랜치를 삭제하고 다음과 같이 다시 만드십시오.

git branch -D master
git checkout origin/master -b master

2
변경 사항을 역 추적하는 데 너무 많은 시간이 소요될 수 있습니다. 몇 번의 리베이스 후에 나에게 일어났습니다.
aross

1
팀 구성원 간의 하위 트리 풀 / 푸시 문제에 유용합니다!
Jorge Orpinel

이것은 마스터 대신 브랜치를 복원하려는 경우에 적합합니다.
블라디미르 Ralev

1
단일 로컬 커밋을 삭제하는 좋은 방법은 아닙니다. 더 나은 사용법git reset --hard origin/<branch_name>
Kirit Vaghela

1
어쩌면 그 해결책이 효과가 있을지 모르지만 이것이 올바른 해결책은 아닙니다.
Adly

201

시험:

git reset --hard <the sha1 hash>

당신이 원하는 곳으로 머리를 재설정합니다. gitk를 사용하여 원하는 커밋을 확인하십시오. gitk 내에서도 재설정 할 수 있습니다.


5
이 B / C를 유용한 정보로 바꾸었지만 Ben Jackson의 대답은 커밋 해시를 조회하지 않아도되는 방식으로 원하는 것을 정확하게 해결하기위한 확인 표시를 얻습니다. :)
David Moles

2
새 지점이 아직 원점으로 밀리지 않은 경우입니다.
Jan

126

가장 최근의 커밋을 삭제하십시오.

git reset --hard HEAD~1

수행 한 작업을 중단하지 않고 가장 최근의 커밋을 삭제하십시오.

git reset --soft HEAD~1


5
유용한 답변. 감사합니다! git reset --soft origin / master를 사용했습니다
Tarun Kumar

2
@TarunKumar 감사합니다! VS 통합을 사용하고 있으며 솔루션은 내가 체크인 할 권한이없는 지점에서 원하지 않는 많은 병합 커밋을 지울 수있는 유일한 방법이었습니다.
DVK

고마워, 내가 찾고있는 바로 "git reset --soft HEAD ~ 1"은 의도하지 않게 커밋하고 되돌리고 싶었지만 되 돌린 후 파괴하고 싶지 않은 다른 파일을 가지고 있었기 때문에 작업을 수행했습니다.
edvard_munch

47

당신이 사용하는 경우 골드 피처 SourceTree의 응용 프로그램을 사용하면 상황에 맞는 메뉴에서 재설정 옵션을 사용할 수 있습니다.

여기에 이미지 설명을 입력하십시오


42

브랜치 시도에서 :

git reset --hard origin/<branch_name>

" git log"또는 " git status"를 사용하여 반전 (로컬 커밋이없는 상태로)을 검증하십시오 .


1
@Troyseph : 위에 나열된 모든 답변은 그대로 시도했지만 시나리오가 수정되지 않았습니다. 위의 답변 중 어느 것에도 설명되지 않은 일반적인 접근 방식은 여기에 대답하려고 시도한 것입니다.
parasrish

3
허용되는 답변은 귀하의 답변과 동일하며 일반적인 지점 이름을 빼고 @Zoltan은 다음과 같이 명시 적으로 말합니다Just to be clear, if you're not working on master but on another branch, you should run git reset --hard origin/<your-branch-name>
Troyseph

1
이것은 내 의견으로는 가장 좋은 대답입니다.
dwjohnston

21

git reset --hard @{u}* 커밋을 포함하여 현재 분기의 모든 로컬 변경 사항을 삭제합니다. 나는 당신이 브랜치로 복귀하거나 플레이하기 위해 커밋 할 것을 찾을 필요가 없다는 것을 고려할 때 아무도 이것을 게시하지 않은 것에 놀랐습니다.

* 즉, @{upstream}일반적 으로에서 현재 분기로 재설정 origin/<branchname>하지만 항상 그런 것은 아닙니다.


1
fish와 같은 일부 쉘은 "@"을 해석하므로`@ {u} '를 따옴표로 묶어야합니다 (예 :`git reset --hard'@ {u} '). 어쨌든, 잘 찾아라!
trysis

멋진 답변은 대단합니다
Marko

1
@ {u}의 값을 어떻게 인쇄합니까?
Philip Rego 2016 년

12

돌아오고 싶은 커밋의 SHA-1 id를 보거나 얻으려면

gitk --all

해당 커밋으로 롤백하려면

git reset --hard sha1_id

!노트. 해당 커밋 후에 이루어진 모든 커밋이 삭제되고 프로젝트에 대한 모든 수정 사항이 삭제됩니다. 따라서 먼저 프로젝트를 다른 브랜치로 복제하거나 다른 디렉토리로 복사하는 것이 좋습니다.


이것은 원격 장치를 더 이상 사용할 수없고 로컬 커밋으로 재설정해야하는 상황에 적합합니다. gitk는 굉장하다-미리 그것을 몰랐다.
theRiley

이미 gitk에 있다면 커밋을 마우스 오른쪽 버튼으로 클릭하고 "XY를 여기로 재설정"을 선택하면됩니다.
mkrieger1

최신 커밋은 즉시 삭제되지 않습니다. 더 이상 그들을 가리키는 분기가 없습니다 (분기는 특정 커밋에 대한 "책갈피"에 지나지 않습니다.)
mkrieger1

9

푸시되지 않은 커밋을 제거하려는 상황이 있었지만 커밋이 다른 커밋보다 먼저 수행되었습니다. 그렇게하기 위해 다음 명령을 사용했습니다.

git rebase -i HEAD~2 -> 마지막 두 커밋을 리베이스합니다.

그리고 제거하려는 커밋 서명에 'drop'을 사용했습니다.


9

추적되지 않은 파일 제거 (커밋되지 않은 로컬 변경)

git clean -df

모든 로컬 커밋을 영구적으로 삭제하고 최신 원격 커밋

git reset --hard origin/<branch_name>

8

푸시되지 않는 로컬 커밋의 경우 커밋 git rebase -i을 삭제하거나 스쿼시 할 수도 있습니다 .


1
나는 이것이 가장 짧은 해결책은 아니지만, IMHO git rebase -i가 많은 유사한 문제를 해결하는 더 일반적인 방법이며 다양한 상황에서 도움이 될 수 있기 때문에 당신을 찬성했습니다 .
Stefan Marinov

1
사용 drop중단 REBASE를 피하기 위해 모든 커밋을 제거 할 때 (대신 라인을 삭제) 키워드를.
Michal Čizmazia

6

간단한 해결책은 로컬 마스터 브랜치 HEAD를 오리진 / 마스터 브랜치 HEAD와 일치시키는 것입니다.

git reset --hard origin/master

PS : origin / master-마스터 브랜치에 대한 원격 포인터입니다. 모든 지점 이름으로 master를 바꿀 수 있습니다


4

대답하기 전에 이것에 대해 설명하는 배경을 추가해 봅시다 HEAD. 아래 옵션 중 일부는 헤드가 분리되므로

First of all what is HEAD?

HEAD단순히 현재 분기의 현재 커밋 (최신)에 대한 참조입니다. 주어진 시간에
하나만있을 수 있습니다 HEAD. (제외 git worktree)

내용은 HEAD내부에 저장 .git/HEAD되며 현재 커밋의 40 바이트 SHA-1을 포함합니다.


detached HEAD

최근 커밋-의미에 있지 않은 경우 HEAD기록에서 이전 커밋을 가리키고 detached HEAD있습니다.

여기에 이미지 설명을 입력하십시오

명령 행에서 분기 이름 대신 다음과 같이 표시됩니다 HEAD. 현재 분기의 끝을 가리 키지 않기 때문 입니다.

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

분리 된 HEAD에서 복구하는 방법에 대한 몇 가지 옵션 :


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

원하는 커밋을 가리키는 새 분기를 체크 아웃합니다.
이 명령은 주어진 커밋을 체크 아웃합니다.
이 시점에서 지점을 만들고이 시점부터 작업을 시작할 수 있습니다.

# Checkout a given commit. 
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

당신은 항상 사용할 수 있습니다 reflog.
git reflog변경 사항을 표시 HEAD하고 원하는 참조 로그 항목을 체크 아웃하면 HEAD이 커밋으로 다시 설정됩니다 .

HEAD가 수정 될 때마다 reflog

git reflog
git checkout HEAD@{...}

원하는 커밋으로 돌아갑니다.

여기에 이미지 설명을 입력하십시오


git reset --hard <commit_id>

HEAD를 원하는 커밋으로 "이동"하십시오.

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts if you've modified things which were
# changed since the commit you reset to.
  • 참고 : ( Git 2.7 이후 )
    도 사용할 수 있습니다 git rebase --no-autostash.

git revert <sha-1>

지정된 커밋 또는 커밋 범위를 "실행 취소"합니다.
reset 명령은 지정된 커밋에서 변경 한 내용을 "실행 취소"합니다.
실행 취소 패치가 포함 된 새 커밋이 커밋되고 원래 커밋도 기록에 남아 있습니다.

# add new commit with the undo of the original one.
# the <sha-1> can be any commit(s) or commit range
git revert <sha-1>

이 스키마는 어떤 명령이 무엇을 수행하는지 보여줍니다.
보시다시피을 reset && checkout수정하십시오 HEAD.

여기에 이미지 설명을 입력하십시오


3

Visual Studio 솔루션에 관심이있는 사용자를위한 드릴은 다음과 같습니다.

  1. 에서 Team Explorer창, 대상의 repo에 연결합니다.
  2. 그런 다음에서 Branches원하는 지점을 마우스 오른쪽 버튼으로 클릭하고을 선택 View history합니다.
  3. History창 에서 커밋을 마우스 오른쪽 버튼으로 클릭하고을 선택합니다 Reset -> Delete changes (--hard).

로컬 커밋을 버리고 리포지토리 상태를 선택한 커밋으로 재설정합니다. 즉, repo를 가져온 후 변경 사항이 손실됩니다.


2

분기가 ' origin/XXX'5 커밋 보다 앞선 경우 .

다음을 발행 할 수 있습니다.

git reset --hard HEAD~5

그리고 마지막 5 개의 커밋을 제거해야합니다.


0
git reset --hard <SHA-Code>

로컬 사본에서 실수로 원격 지사로 푸시되지 않도록 실수를 한 경우 유용합니다.

SHA 코드는 지점의 마지막 커밋에 대한 git 대시 보드의 webVersion을 보면 얻을 수 있습니다.

이렇게하면 지점의 마지막 커밋과 동기화 할 수 있습니다.

당신은 할 수 git pull성공적으로 메시지를 볼 수가 SYN 즉 새로운 확인 아무것도 하드 리셋을 완료 한 후.

지사는 최신 상태입니다 Origin/<Branch Name>


0

로컬 리포지토리를 완전히 엉망으로 만들면 Git에서 로컬 커밋을 버리는 신뢰할 수있는 방법은 ...

  1. "git config --get remote.origin.url"을 사용하여 원격 원점의 URL을 가져옵니다.
  2. 로컬 git 폴더의 이름을 "my_broken_local_repo"로 바꿉니다.
  3. "git clone <url_from_1>"을 사용하여 원격 git 저장소의 새로운 로컬 사본을 얻으십시오.

내 경험상 이클립스는 세상의 변화를 잘 처리한다. 그러나 Eclipse에서 영향을받는 프로젝트를 선택하고 정리하여 Eclipse가 다시 빌드하도록해야 할 수도 있습니다. 다른 IDE에도 강제 재구성이 필요할 수 있습니다.

위 절차의 부작용은 프로젝트가 git에 넣지 않은 로컬 파일에 의존하는지 여부를 알 수 있다는 것입니다. 누락 된 파일을 찾으면 "my_broken_local_repo"에서 파일을 복사하여 git에 추가 할 수 있습니다. 새 로컬 저장소에 필요한 모든 것이 있다고 확신하면 "my_broken_local_repo"를 삭제할 수 있습니다.


0

로컬 커밋을 버리고 수정 사항을 파일에서 계속 유지하려면
git reset @ ~ do ~ do를 수행하십시오.
다른 답변은 하드 리셋을 해결했습니다.

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