git bare 저장소에서 마지막 커밋을 어떻게 해제 할 수 있습니까? (베어 리포지토리는 인덱스를

베어 리포지토리에서 의미가없는 여러 git 명령이 있다는 점을 고려하면 (베어 리포지토리는 인덱스를 사용하지 않고 작업 디렉토리가 없기 때문에),

git reset --hard HEAD^

이러한 저장소에서 마지막 변경 사항을 커밋 해제하는 솔루션이 아닙니다.

인터넷을 통해 검색하면 주제와 관련하여 찾을 수있는 것은 이것 뿐입니다.이 작업을 수행하는 세 가지 방법이 있습니다.
1. “수동으로 참조 업데이트 (배관 관련)”;
2. ” git push -f베어가 아닌 저장소에서”;
3. ” git branch -f this $that“.

어떤 솔루션이 더 적절하다고 생각하거나이를 수행하는 다른 방법이 있습니까? 불행히도 git bare 저장소에 대해 찾은 문서는 상당히 열악합니다.



답변

git update-ref명령을 사용할 수 있습니다 . 마지막 커밋을 제거하려면 다음을 사용합니다.

$ git update-ref HEAD HEAD^

또는 마지막 커밋을 제거 할 수없는 분기에 있지 않은 경우 :

$ git update-ref refs/heads/branch-name branch-name^

원하는 경우 sha1을 전달할 수도 있습니다.

$ git update-ref refs/heads/branch-name a12d48e2

git-update-ref 명령에 대한 문서를 참조하십시오 .


답변

베어 저장소에서 다음을 사용하는 경우 :

git reset --soft <commit>

그러면 베어 레포에없는 것을 변경하려고하지 않기 때문에 베어 레포에서 사용하는 문제 --hard--mixed옵션 (예 : 작업 트리 및 인덱스)이 발생하지 않습니다. 귀하의 경우에는 (베어 레포에서) 사용하고 싶을 것입니다.

git reset --soft HEAD^

원격 저장소에서 분기전환 하려면 다음을 수행하십시오.

git symbolic-ref HEAD refs/heads/<branch_name>

현재 선택된 지점을 보려면 다음을 사용하십시오.

git symbolic-ref HEAD

https://mirrors.edge.kernel.org/pub/software/scm/git/docs/git-symbolic-ref.html


답변

git push -f잘 작동합니다 :
당신이 베어의 repo를 복제하는 경우, 마지막 커밋 제거 ( git reset --hard HEAD^(당신이 언급으로, 그러나 로컬이 아닌 베어 REPO)에 푸시 백 -f) :

  • 제거하는 커밋 이전의 다른 커밋에 대해서는 SHA1을 변경하지 않습니다.
  • 베어 리포지토리의 정확한 내용에서 추가 커밋을 뺀 내용을 푸시 백 할 수 있습니다 (먼저 복제했기 때문입니다).


답변

git refspec 표기법을 사용하여 다음과 같이 할 수도 있습니다.

git push -f origin +<commit you want to revert to>:<destination_head | branch_name>

이렇게하면 대상 분기 (ref로 표시됨)가 +<object ref>부분 으로 표시된대로 소스 커밋으로 업데이트됩니다 .


답변