git에서 첫 번째 커밋을 제거하는 방법이 궁금합니다.
커밋하기 전에 개정 된 내용은 무엇입니까? 이 개정판에 이름이나 태그가 있습니까?
git rebase -i --root
. 자세한 내용은 다음 SO 답변을 참조하십시오. stackoverflow.com/questions/2246208/…
git filter-branch --parent-filter "sed 's/-p <the_commit>//'" HEAD
git에서 첫 번째 커밋을 제거하는 방법이 궁금합니다.
커밋하기 전에 개정 된 내용은 무엇입니까? 이 개정판에 이름이나 태그가 있습니까?
git rebase -i --root
. 자세한 내용은 다음 SO 답변을 참조하십시오. stackoverflow.com/questions/2246208/…
git filter-branch --parent-filter "sed 's/-p <the_commit>//'" HEAD
답변:
나에게 가장 안전한 방법은 다음 update-ref
명령 을 사용하는 것입니다 .
git update-ref -d HEAD
명명 된 참조를 삭제 HEAD
하므로 현재 분기의 모든 커밋 이 재설정됩니다 (부드럽게 작업을 잃지 않습니다) .
원하는 것은 첫 번째 커밋을 두 번째 커밋과 병합하는 것입니다 rebase
.
git rebase -i --root
마지막 방법은 컨텐츠가 동일하지만 커밋 히스토리가없는 분기 인 고아 브랜치를 작성하고 새 컨텐츠를 커미트하는 것입니다.
git checkout --orphan <new-branch-name>
모든 커밋이 부모 커밋을 참조하기 때문에 첫 번째 커밋 전에는 아무것도 없습니다. 이렇게하면 첫 번째 커밋이 특별 해 지므로 (고아 커밋) 이전 "상태"를 참조 할 방법이 없습니다.
커밋을 수정하려면 간단히 git commit --amend
다음을 수행하십시오. 다른 커밋을 만들지 않고 커밋을 수정합니다.
모든 것을 다시 시작하려면 .git
리포지토리를 삭제하고git init
--amend
또한 그것이 처음에 잘못 된 제대로 경우 저자를 업데이트하지 않습니다. 그것이 내가 필요한 것이므로 받아 들인 대답을 사용하고 대신 새로운 커밋을했습니다.
# Check out to a temporary branch:
git checkout --orphan TEMP_BRANCH
# Add all the files:
git add -A
# Commit the changes:
git commit -am "Initial commit"
# Delete the old branch:
git branch -D master
# Rename the temporary branch to master:
git branch -m master
# Finally, force update to our repository:
git push -f origin master
git repo에 항상 첫 번째 커밋이 있기 때문에 첫 번째 커밋을 편집하고 싶을 수도 있습니다. git commit --amend --reset-author
평소 대신 사용 을 고려하십시오 git commit --amend
.
나는 결코 일어나지 않은 것처럼 리포지토리에서 모든 자식 커밋을 취소하는 방법을 찾고있었습니다.
리베이스는 한 지점까지 작동합니다. 그러나 첫 번째 (시간순으로 가장 오래된 git commit)는 부모가 없기 때문에 항상 문제가 될 것이므로 오류가 발생합니다.
이 답변들 중 어느 것도 나를 위해 그것을 해결하지 못했습니다. 그러나 많은 수색과 시행 착오 끝에 이것이 효과가 있음을 알았습니다!
git update-ref -d HEAD
git push origin master -f
이것이 도움이되기를 바랍니다. 좋은 하루 보내세요
당신이 할 수있는 또 다른 방법은 다음과 같습니다
git checkout dev
git branch -D master
git checkout --orphan master
물론,이 모든 것은 사용 사례에 따라 다르지만 분기가 둘 이상인 경우 .git
디렉토리를 삭제하는 것은 의미가 없습니다.
다른 브랜치를 유지하고 싶지만 예를 들어 다른 브랜치에 대한 master
공통 히스토리없이 브랜치를 새로 시작 하게하려면 이를 수행하는 한 가지 안전한 방법은 새 저장소를 작성하고 이전 저장소에서 해당 컨텐츠를 푸시하는 것입니다.
cd ..
git init newrepo
cd newrepo
# make some initial commits
git push ../oldrepo master:newmaster
이렇게하면 newmaster
이전 리포지토리에 분기가 만들어 지고 다른 분기와 공통되지 않은 기록이 있습니다. 물론, 당신은 단지를 덮어 쓸 수 있습니다 master
와 함께뿐만 아니라 git push -f
.
모든 브랜치와 모든 기존 컨텐츠를 삭제하려면 다음을 실행하십시오.
rm -rf .git/
git rebase --root
아마 OP가 원했던 것에 동의 하지만이 답변에 두 개의 공감대 가 있다고 생각하면 누군가가 여전히 관련성을 발견하면 삭제하지 않는 것이 좋습니다.
방금 커밋했지만 푸시하지 않은 경우 .git 디렉토리를 제거 하고 git init
다시 ...
질문에 대한 답변은 다음 여부에 따라 다릅니다.
분기에서 첫 번째 만 커밋을 제거하려고합니다 (다른 분기를 그대로 두는 동안).
후속 커밋 (및 다른 분기)을 '제자리에두고'있는 동안 일부 브랜치에서 첫 번째 커밋을 제거하려고합니다.
이 중 두 번째는 비교적 간단합니다. 본질적으로 루트에 기반을 두어야합니다. 여기에있는 대부분의 답변은이를 수행하는 방법에 대한 것입니다.
두 번째를 수행하는 것은 (첫 번째 지점을 제거하고 다른 지점을 내버려두고 지점에서만 커밋하는 것) 더 어렵습니다. 또는 GitHub 또는 Bitbucket에 변경 사항이 반영되기를 원할 경우 특히 어렵습니다. Git에는 커밋없이 분기를 푸시하거나 강제로 푸시 할 수있는 방법이 없습니다. 그리고 GitHub 또는 Bitbucket에서 커밋이없는 새로운 빈 분기를 만들 수있는 방법이 없습니다 (다시 볼 수있는 한). 따라서 완전히 빈 분기를 만들려면 기본적으로 새 리포지토리를 만든 다음 @ user1338062의 답변에 따라 원하는 커밋을 포함하여 원하는 분기를 다시 추가해야합니다.
필요가 취해야 할 것이 두 가지 방법이 있다는 것을, 두 개의 서로 다른 (더 많거나 적은 합리적인) 시나리오 - 나는 분명되지 않았 어떤이 응답 관계를 설명하겠습니다 그래서 모두 당신이 할 수 있도록 할 수 있습니다 일들이 순서를 OP가 요구하는 것을 완전히 마스터합니다.