source

초기 git commit을 되돌리는 방법

ittop 2023. 4. 17. 22:29
반응형

초기 git commit을 되돌리는 방법

처음으로 git 저장소에 커밋을 했습니다.그러면 커밋을 후회하고 되돌리고 싶습니다.나는 노력한다

# git reset --hard HEAD~1

다음과 같은 메시지를 받습니다.

fatal: ambiguous argument 'HEAD~1': unknown revision or path not in the working tree.

이 커밋은 저장소의 첫 번째 커밋입니다.첫 번째 약속을 어떻게 취소할지 아세요?

현재 브랜치를 삭제하기만 하면 됩니다. 하면 안 요.git branch -D이치하시면 됩니다.update-ref이 일을 하기 위해서.

git update-ref -d HEAD

사용 안 함rm -rf .git리셋하려는 브랜치뿐만 아니라 다른 모든 브랜치를 포함한 저장소 전체를 완전히 삭제합니다.

HEAD를 삭제하고 저장소를 새 상태로 복원할 수 있습니다. 여기서 새 초기 커밋을 생성할 수 있습니다.

git update-ref -d HEAD

새로운 커밋을 작성한 후 이미 리모트로 푸시된 경우 이전 초기 커밋을 덮어쓰기 위해 강제로 리모트로 커밋해야 합니다.

git push --force origin

이 질문은 이 블로그 투고에서 링크되어 Git의 새로운 버전에 대한 대체 솔루션이 제안되었습니다.

git branch -m master old_master
git checkout --orphan master
git branch -D old_master

이 솔루션에서는 다음 사항을 상정하고 있습니다.

  1. .master
  2. 것은 .old_master는 그 할 수

을 '지점 이름 변경하다'로 변경합니다.old_master된 브런치를 만듭니다.master (새로운 저장소를 위해 작성된 것처럼) 그 후 자유롭게 삭제할 수 있습니다.old_master...그렇지 않으면.너한테 달렸어.

주의: git 브랜치를 이동 또는 복사하면 reflog( 코드 참조)가 유지되고 삭제 후 새 브랜치를 생성하면 삭제됩니다.기록이 없는 원래 상태로 되돌아가고 싶기 때문에 분기를 삭제할 수도 있지만 다른 사용자는 이 작은 메모를 고려할 수도 있습니다.

질문에 명시된 조건:

  • 커밋은 저장소 내의 첫 번째 커밋입니다.
  • 이는 실행된 명령어가 매우 적음을 의미합니다.
    • a git init ,
    • 어느 정도일 것이다git add 편집,
    • a. a. a.git commit ,
    • 그게 다예요!

이러한 전제조건이 충족되면 첫 번째 커밋을 취소하는 가장 간단한 방법은 다음과 같습니다.

rm -fr .git

git init 할 수 git initGit 저장소를 다시 만들고, 처음 하지 않은 것을 후회하는 변경으로 추가 작업을 다시 수행하고, 초기 커밋을 다시 실행합니다.

위험! 그러면 Git 저장소 디렉터리가 제거됩니다.

어딘가에 백업이 없는 한 Git 저장소 디렉토리를 영구적으로 복구 불가능하게 제거합니다.전제 조건에서는 저장소에 보관하고 싶은 것이 없으므로 손실되는 것이 없습니다.추가한 모든 파일은 아직 수정하지 않았거나 삭제하지 않은 경우 등 작업 디렉토리에서 사용할 수 있습니다.그러나 이 작업은 저장소에 다른 항목이 전혀 없는 경우에만 안전합니다.'저장소를 처음 커밋한 후 후회' 질문에 설명된 상황에서는 안전합니다.하지만, 매우 자주, 그것은 안전하지 않다.

이렇게 하면 복제 원본 저장소에 손상을 주지 않고 원치 않는 복제 저장소를 제거할 수도 있습니다.복사본에서 수행한 작업은 모두 삭제되지만, 그렇지 않으면 원래 저장소에 영향을 미치지 않습니다.

그러나 전제 조건이 충족될 때 안전하고 효과적입니다.

저장소에서 보존하고 싶은 다른 작업을 수행한 경우에는 적절한 기술이 아닙니다.저장소가 적절한 전제 조건을 충족하지 못합니다.

나는 결국 나에게 효과가 있는 것을 투입할 것이다.검역된 데이터가 잘못 배치되어 있고 이미 커밋이 푸시되어 있기 때문에 저장소의 초기 커밋을 삭제해야 했습니다.

현재 올바른 지점에 있는지 확인합니다.

git checkout master

git update-ref -d HEAD

git commit -m "Initial commit

git push -u origin master

이것으로 문제를 해결할 수 있었습니다.

중요한

이 파일은 공개적으로 액세스할 수 없는 내부 저장소에 있습니다. 리포지토리에 공개적으로 액세스할 수 있는 경우 복구해야 할 항목이 이미 다른 사용자에 의해 제거되었다고 가정하십시오.

하나의 옵션은 저장소를 삭제하고 새 저장소를 만드는 것입니다.

rm -rf .git
git init

초기 커밋을 되돌리려면 다음 명령을 사용합니다.

git update-ref -d HEAD

작업이 완료되면 커밋되지 않은 파일이 스테이징 영역에 있게 됩니다.는 「」로 할 수 .git status명령어를 실행하면 아래 링크된 스크린샷과 유사한 결과가 나타납니다.

스테이징 영역에서 커밋되지 않은 파일이 노란색입니다.

Git은 문제의 파일을 분리하기 위한 명령어 구문을 제안합니다(위 그림 참조).즉, 다음 명령을 사용합니다.

git rm --cached . -r

.이 의 )는 현재 현재 """"""""""""""""""""""""""""""""""""""를 나타냅니다.-r는 각 파일에 대한 확인을 요구하지 않고 파일을 재귀적으로 분할합니다.

해서 할 수 되었습니다.git status스테이징 영역이 비어 있는지 확인합니다.

파일을 리모트 레포에 이미 푸시하고 있는 경우는, 다음의 순서에서는, 이러한 변경을 리모트 레포에 푸시 해, 양쪽(로컬과 리모트)간의 패리티를 복원합니다.

푸시하기 에 「」, 「」를 합니다..gitignore불필요한 파일을 파일화하여 입력합니다.을 확인하다.gitignore파일링 합니다.

입니다.git push ★★★★★★★★★★★★★★★★★」git push -f(단, 힘을 가하는 것은 위험하다는 것을 항상 기억하십시오 - 여기를 읽으십시오).

그러나 이러한 두 푸시 명령어는 모두 오류를 반환할 수 있으며, 이를 통해 병합 충돌을 풀어서 해결해야 할 수 있습니다.따라서 이 문제를 피하기 위해 리모트 리포트 전체를 삭제하고(이러한 설명과 함께 GitHub에서) 같은 이름으로 다시 작성해야 할 수도 있습니다.

추가 정보:

  • repo를 사용하여 합니다.rm -rf .git ,
  • 을 로ize로 하다.git init ,
  • 합니다.git add -A ,
  • 에게 를 지우다git commit -m "<commit message>" ,
  • 에 「」URL 를 합니다.git remote add origin <repo url> ,
  • 로컬 을 한 번 더.git push -u origin main.

PS:

첫 번째 커밋을 되돌리는 데는 많은 이유가 있습니다.을 준 중 는 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아..gitignore불필요한 파일을 커밋에서 제외하는 파일.이 오류는 의도하지 않게 node_modules 디렉토리를 리모트저장소로 푸시한 것을 의미합니다.

좀 더 조사를 한 결과, 이전에 커밋된 파일을 무시하기 위한 간단한 방법을 설명하는 기술 문서를 발견했는데, 이는 커밋을 해제하고 리모트 리포를 삭제해야 하는 번거로운 과정을 거치지 않아도 된다는 것입니다.

왜 "수정"이 제안되지 않고 @damkrat에 의해 배제되었는지 궁금합니다.왜 수정은 잘못된 커밋을 수정하는 가장 효율적인 근본적인 문제를 해결하는 방법이라고 생각되기 때문입니다.처음에는 커밋을 하지 않는 목적이 없기 때문입니다.일부에서 강조했듯이 아무도 보고서를 복제하지 않은 경우에만 마스터처럼 "퍼블릭" 브랜치를 수정해야 합니다.

git add <your different stuff>
git commit --amend --author="author name <author.name@email.com>"-m "new message"

내 경우:

git update-ref -d HEAD
git rm --cached . -r

첫 번째 은 CB Bailey가 제안한 대로입니다(두 번째 행이 필요한 이유는 확실하지 않지만 git은 내가 그것을 할 때까지 파일을 언커밋하지 않았습니다) - 실행함으로써 알 수 있었습니다.git status두 줄)를 참조해 주세요.

git reset --hard 변경 후 실행

git add -A
git commit --amend --no-edit 

또는

git add -A
git commit --amend -m "commit_message"

그리고 나서.

git push origin master --force

--force는 첫 번째 단계에서 리셋한 커밋을 다시 씁니다.

VCS 시스템 및 특히 git에 대한 전체 아이디어에 역행할 수 있으므로 이 작업을 수행하지 마십시오.적절한 방법은 새로 생성하여 불필요한 브랜치를 삭제하는 것뿐입니다. 것은, 을 참조하십시오.git help branch를 참조해 주세요.

기술적으로는, 최초의 커밋을 되돌리려면 , 다음의 조작을 실시합니다.

git revert HEAD

단, 이전 커밋의 효과를 되돌리는 새로운 커밋을 기록하기 때문에 첫 번째 커밋에서 발생한 문제를 수정하는 새로운 커밋을 직접 작성하는 것이 좋습니다.이렇게 하면 (특히 이미 공유 저장소에 푸시된 경우) 원하는 초기 약속(즉, 이력을 변경하지 않고)을 유지할 수 있습니다.그렇지 않으면 처음부터 다시 시작하는 것이 더 나을 수 있습니다.즉, 저장소를 삭제하고 새 저장소를 만듭니다.

언급URL : https://stackoverflow.com/questions/6632191/how-to-revert-initial-git-commit

반응형