2011-02-07 6 views
29

내가 처음으로 원격 Git 저장소에 실수 한 것을 가정 해 봅시다. 저장소를 다시 초기 상태로 되돌릴 수 있도록이 방법을 되돌릴 수 있습니까? 원격 컴퓨터에 액세스 할 수 없으므로 .git 디렉터리를 삭제할 수 없습니다.원격 Git 저장소를 완전히 비울 수 있습니까?

제가 볼 수있는 한 문제는 당신이 머리를 "해제"할 수 없다는 것입니다.

는 I (또는 실제로 이것에 대해 질문 동료) 않았다 (I 여기에 로컬 "원격"REPO을 할 사람이를 테스트 할 수 있도록) 무엇을 :

mkdir git-remote 
cd git-remote 
git init --bare 
cd .. 
mkdir git-local 
cd git-local 
git clone ../git-remote . 
touch a 
git add a 
git commit -m "initial" 
git push origin master 

을 그리고이 시점에서 그는 실현 잘못된 물건을 원격 저장소로 밀어 넣었습니다. 내가 가진

유일한 생각은 자신의 repo에서 여전히 결함이 커밋 떠날 것이다 & & 자식 RM & & 자식 푸시을 모두 삭제하지만, 파일이 두 번째 푸시을 귀찮게하지 않을 것입니다.

+0

http://stackoverflow.com/questions/588414/git-rolling-back-a-remote-repository – Christian

+0

그래도 적어도 하나의 커밋이 남아있는 경우입니다. 나는 거기에 하나의 커밋을 원하지 않는다. – Makis

답변

51

당신은 XY 문제가있을 수 있습니다 생각 (FWIW,이 인터페이스는 꽤 터무니없는 생각). 다시 시작하기 위해 원격 저장소를 다시 원래 상태로 되돌릴 필요는 없습니다. 로컬로 시작한 다음 원격으로 밀어 넣기 만하면됩니다.

# create a new repository that has the initial commit that you want 
mkdir foo; cd foo; git init; ...; git commit 

# set up a remote 
git remote add origin <url-of-remote> 
git branch --set-upstream master origin/master 

# push your new history 
git push -f 

# delete obsolete remote branches 
git push origin :deprecated-branch 

원격 저장소는 결코없는 커밋 상태로 반환하지만, 당신이 그것을 원하는 위치는 끝, 그리고 그 모든 문제입니다!

(기존 저장소는 실제로 원격 저장소에 있지만 커밋되지 않은 상태로 남아 있으며 저장소를 가리키는 참조가 없습니다.어느 시점에서 git gc --auto이 푸시에 의해 트리거되면 자동으로 제거됩니다.)

실제로 어떤 이유로 든 비우려면 원격 저장소에 receive.denyDeleteCurrent을 설정하고 모든 분기를 푸시 - 삭제할 수 있습니다 , 현재 하나 포함. 나는 왜 당신이 실제로 필요로하는지 모르겠다.

+0

좋아,이 실제로 작동합니다! – Makis

+0

세 번째 명령에서'-f' 플래그가 필요한 이유는 무엇입니까? –

+2

@ 존 :'-f'는'--force'를 의미합니다. 비 순방향 푸시 (분기의 이전 위치가없는 분기를 조상으로 푸시하는 경우)가 필요합니다. – Cascabel

0

git revert 수 있습니다. git revert HEAD.

커밋 한 콘텐츠는 .git 디렉토리에 있습니다. (당신은 그것에 대해 아무것도 할 수 없습니다)

.git 디렉토리에 대한 액세스 권한없이 내역에서 커밋을 삭제하는 것은 불가능합니다.

+0

그래서 대답은 "아니오"입니다. – Makis

+1

@Makis :이 대답은 잘못되었습니다. 리모트에있는 브랜치를 삭제하고 마스터 브랜치를 맨 처음 커밋으로 강제로 되돌릴 수 있습니다. 모든 커밋 없이는 그대로 둘 수는 없지만 * 루트 커밋을 대체 할 수 있습니다. * 원래 커밋은 매달려 있으며 결국에는 자동으로 실행되는'git gc --auto'에 의해 정리됩니다 그리고. – Cascabel

+0

Jonas, git 명령 (pushing 포함)은 .git 디렉토리의 내용에 액세스하고 가능하면 수정함으로써 작동합니다. git push를 통해 원격의 .git 디렉토리에 접근 할 수 있습니다. 간접적이고 불완전하지만이 작업을 수행하기에 충분합니다. – Cascabel

0

"첫 번째 푸시"라고 말하면 분기에 대한 첫 번째 푸시를 의미합니까? 당신이 그것을 밀기 전에 거기에 코드가 전혀 없었습니다. 그런 경우 ...

당신은, 당신이 할 것 처음으로 원격 지사에 현지 지사를 foo는을 밀어 원하는 경우

위해
git push origin foo:foo 

원격 지점을 삭제 foo는, 당신은 그것을 "아무것도"밀어 넣지을 자식에게 :

git push origin :foo 

지금 당신이 그것으로 시작할 수 있지만 당신이 좋아.

실제로 실제로 서버에 물리적으로 무엇이 남아 있는지 잘 모르겠지만 분기 기록을 완전히 재설정한다는 측면에서 보면 정상적으로 작동합니다.

+0

마스터 브랜치가 유일한 브랜치 일 때 마스터 브랜치에 어떻게합니까? 위 질문에 워크 플로를 추가했습니다. – Makis

+1

'git push origin : master' - 유일한 브랜치이고 체크 아웃 한 브랜치이기 때문에 문제 해결 방법을 설명하는 몇 가지 오류가 발생합니다. (다시 - 이것은 원격 브랜치에서 모든 것을 지울 것입니다!) –

+0

(쉬운 해결 방법은'git checkout -b master_tmp; git push origin : master'입니다.) –

관련 문제