Git에서 로컬 커밋을 버리는 방법?


263

나는 무언가를 연구하고 있었고, 그 중 일부를 저지른 후에 완전히 망가 졌다고 결정했습니다. 그래서 나는 다음 순서를 시도했다 :

git reset --hard
git rebase origin
git fetch
git pull
git checkout

어느 시점에서 메시지를 받았습니다

Your branch is ahead of 'origin/master' by 2 commits.

로컬 디렉토리를 지우고 모든 것을 다시 다운로드하지 않고도 로컬 커밋 을 삭제하고 싶습니다. 어떻게하면 되나요?


6
모두 할 필요가 없습니다 git fetchgit pull- 풀 인출 및 병합의 조합입니다.
Ether

12
사용자에 대한 참고 사항 :이 질문의 주요 문제는 "N 커밋에서 분기가 '원점 / 마스터'보다 앞서 있습니다"라는 메시지와는 아무 관련이 없습니다. . 해당 메시지로 인해 다른 질문은이 질문과 중복되는 것으로 중단하십시오.

답변:


580
git reset --hard origin/master

origin/master어디에 originrepo 이름이 아닌 master지점의 이름 이 아닌 모든 커밋을 제거합니다 .


1
슬래시가있는 "origin / master"라는 구문이 로컬 리포지토리를 의미한다고 생각합니까?
Daniel C. Sobral

9
mipadi : 더 정확하게 말하면, 현재 브랜치가 origin / master와 같은 커밋을 가리 키도록 재설정합니다.
Christoffer Hammarström

지점을 말합니다. 원격 리포지토리 origin/master의 분기를 추적하는 master분기입니다 origin.
mipadi

@ DanielC.Sobral No origin/mastermaster라는 리모컨 의 분기에 대한 참조 origin입니다.
Matthew

1
@littletiger git은 폴더, 파일 및 경로 만 추적하지 않습니다. 따라서 빈 폴더 (파일이없는 폴더 또는 무시 된 파일 만)를 완전히 무시합니다. 거기에 아무것도 없어서 어디에도 나타나지 않습니다.
Mumbleskates

33

옆으로, mipadi의 답변 (제대로 작동해야 함)을 제외하고는 다음을 수행해야합니다.

git branch -D master
git checkout master

또한 당신이하지 않고 원하는 것을 정확하게 수행 having to redownload everything합니다 (인용 문구). 로컬 리포지토리에 원격 리포지토리의 복사본이 포함되어 있기 때문입니다 (그리고 해당 복사본은 로컬 디렉터리와 동일하지 않으며 체크 아웃 한 분기와 동일하지도 않습니다).

지점을 지우는 것은 완벽하게 안전하며 지점을 재구성하는 것은 매우 빠르며 네트워크 트래픽이 없습니다. git은 기본적으로 로컬 리포지토리입니다. 심지어 원격 지사에도 로컬에 사본이 있습니다. git에게 특정 로컬 사본이 실제로 원격 브랜치임을 알려주는 메타 데이터가 약간 있습니다. git에서 모든 파일은 항상 하드 디스크에 있습니다.

master 이외의 지점이없는 경우 다음을 수행해야합니다.

git checkout -b 'temp'
git branch -D master
git checkout master
git branch -D temp

4
그러나 그것은 어떻게 로컬에서 만들어진 커밋을 원래의 커밋과 구별합니까? 사실, 그것은 나에게 있음을 알려줍니다Cannot delete the branch 'master' which you are currently on.
다니엘 C. 소브랄

1. 기본적으로 모든 커밋은 로컬에서 시작했는지 또는 시작되었는지에 관계없이 동일합니다. 중요한 것은 기록이 올바르게 동기화된다는 것입니다. 로컬 커밋은 푸시 한 후에 만 ​​존재하며 기본적으로 git은 원래 기록이 의미가없는 상태로 끝날 수있는 경우 푸시를 거부합니다.
slebetman

2
2. 물론 현재 체크 아웃 된 브랜치를 삭제할 수 없습니다. 마스터를 삭제하려면 먼저 다른 지점을 확인하십시오. 다른 지사가 없다면 단순히 임시 지사를 만드십시오 :git checkout -b temp;git branch -D master;git checkout master;git branch -D temp
slebetman

또한 원격 저장소의 로컬 사본이 다르다는 것에 대해 언급 했으므로 git을 사용하면 원격 분기 사본의 파일을 편집하거나 볼 수 없습니다. 그것은 당신이보고 편집 할 수있는 원격 지점에서 다른 지점을 만들 수 있습니다. 일반적으로이 로컬 브랜치는 원격 브랜치와 동일한 이름을 갖습니다. 귀하는 origin/master로컬 컴퓨터에 부분적으로 권리 가 있습니다. 이것이 원격 지사의 로컬 (전체) 사본입니다. 실제 원격 지점은 origin master입니다.
slebetman

이것은 나를 위해 일했습니다. 아마는 git branch -D master이 오류가 발생합니다 지적 때문에,하지만 필요하지 않았다.
Alexis Wilke

15

내가하는 일은 HEAD로 열심히 재설정하려고합니다. 로컬 커밋이 모두 지워집니다.

git reset --hard HEAD^

이것이 가장 효과가 좋은 답변입니다. 모든 로컬 커밋을 버리고 HEAD로 재설정합니다. ^ char의 사용법은 무엇입니까?
카림

(가) '^'는 아마도 정규식 물건입니다 @karim 아마하는 아주 깊은 내가 알거나 수동 파일에 전 .. 죄송 사람 : 오랜 시간을 읽을하지 않는 것이 무엇인가
지앙 응 우옌

1
늦었지만을 ^부모 커밋을 나타내므로 HEAD^커밋되지 않은 변경 사항 을 삭제하고 분기를 이전 커밋으로 이동하여 가장 최근의 커밋을 효과적으로 "삭제"합니다 (커밋은 여전히 ​​존재하지만 브랜치는이를 가리 키지 않습니다). 답변에는 로컬 커밋이 하나만 있고 나머지는 커밋되지 않은 변경 사항입니다. @karim @giang
QuantumQuaver

3

당신은 실행해야합니다

git fetch

모든 변경 사항을 얻으려면 "지점을 앞두고"라는 메시지가 나타나지 않습니다.


5
가져 오기는 로컬 커밋을 제거하는 asker의 주요 문제와 관련이 없습니다.

1
로컬에서 이미 파일을 커밋 한 다음 언급 된 명령을 실행하려고하면 어떻게됩니까? 동일한 오류 메시지가 표시됩니다. git fetch와 git fetch -p도 시도했습니다. 같은 오류를 보여주는
Morez

1

리모컨이 동기화되지 않아 업데이트해야하는 경우를 보았습니다. reset --hard또는 branch -D작동하지 않는 경우 시도하십시오

git pull origin
git reset --hard 

이 질문에 대답하지 않습니다, reset --hard이 상황에서 작동
CharlesB

1
찰스 안녕하세요 reset --hard. 그러나, 나는 때때로 분기를 올바르게 재설정하지 못하고 git pull origin리모컨을 다시 동기화하고 reset --hard기능을 올바르게 수행 할 수 있다고 지적합니다 .
Jim Clouse

0

나는해야했다 :

git checkout -b master

git가 존재하지 않는다고 말했듯이, 그것은

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