git에서 첫 번째 커밋을 제거하는 방법은 무엇입니까?


179

git에서 첫 번째 커밋을 제거하는 방법이 궁금합니다.

커밋하기 전에 개정 된 내용은 무엇입니까? 이 개정판에 이름이나 태그가 있습니까?


2
git으로 시작하려면 개정판이 의미가 없다는 것을 알아야합니다. 커밋 또는 상대 SHA에 대해 이야기 할 수 있습니다. 또한 왜 이것을하고 싶습니까? 첫 번째 커밋은 모든 것이 구축 된 것입니다. 첫 번째 커밋을 포함하여 몇 가지 커밋을 함께 스쿼시 할 수 있습니다. 첫 번째 커밋은 새로운 첫 번째 커밋이되지만 첫 번째 커밋을 삭제하거나 마지막 커밋을 제외한 모든 커밋을 삭제한다는 것은 무엇을 의미합니까?
Shahbaz

@Shahbaz 네, 그게 가장 좋은 방법입니다, 예를 들어보십시오 : ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one
timaschew

5
사용할 수 있습니다 git rebase -i --root. 자세한 내용은 다음 SO 답변을 참조하십시오. stackoverflow.com/questions/2246208/…
MKroehnert


이 답변 에는 현재 지점의 루트 커밋을 삭제하는 올바른 솔루션이 있습니다.git filter-branch --parent-filter "sed 's/-p <the_commit>//'" HEAD
Jody Bruchon

답변:


320

나에게 가장 안전한 방법은 다음 update-ref명령 을 사용하는 것입니다 .

git update-ref -d HEAD

명명 된 참조를 삭제 HEAD하므로 현재 분기의 모든 커밋재설정됩니다 (부드럽게 작업을 잃지 않습니다) .

원하는 것은 첫 번째 커밋을 두 번째 커밋과 병합하는 것입니다 rebase.

git rebase -i --root

마지막 방법은 컨텐츠가 동일하지만 커밋 히스토리가없는 분기 인 고아 브랜치를 작성하고 새 컨텐츠를 커미트하는 것입니다.

git checkout --orphan <new-branch-name>

7
이것이 받아 들여지지 않는 것이 너무 나쁩니다. 구글에서 가장 많은 히트가 "첫 번째 커밋을 취소 할 수 없다"고 말하는 것도 나쁘다. 이것은 나를 위해 속임수를했다. 감사!
danielpops

1
귀하의 지원에 감사합니다 @danielpops! 3 년 후이 질문에 대답했습니다. Git은 그동안 발전했다.
tzi

rebase를 사용하고 두 번째 커밋을 "스쿼시"로 표시 한 다음 --force to origin을 수행했습니다. 감사!
Philip Atz

1
git update-ref -d HEAD는 초기 커밋뿐만 아니라 모든 기록을 제거하는 가장 안전한 방법입니다.
user1767316

나는 그것을했고 그것은 첫 번째 커밋에 추가 한 모든 파일을 삭제했습니다. 슬퍼. 적어도 많지 않았다
Vyacheslav Tsivina

42

모든 커밋이 부모 커밋을 참조하기 때문에 첫 번째 커밋 전에는 아무것도 없습니다. 이렇게하면 첫 번째 커밋이 특별 해 지므로 (고아 커밋) 이전 "상태"를 참조 할 방법이 없습니다.

커밋을 수정하려면 간단히 git commit --amend다음을 수행하십시오. 다른 커밋을 만들지 않고 커밋을 수정합니다.

모든 것을 다시 시작하려면 .git리포지토리를 삭제하고git init


7
이 답변은 잘못되었습니다. 첫 번째 커밋 전에 상태로 되돌릴 수있는 방법이 있습니다. 아래의 tzi의 답변을 참조하십시오 .
David Nelson

2
--amend또한 그것이 처음에 잘못 된 제대로 경우 저자를 업데이트하지 않습니다. 그것이 내가 필요한 것이므로 받아 들인 대답을 사용하고 대신 새로운 커밋을했습니다.
Mark Edington

11
# 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

3
답이 아님 : 질문은 "첫 번째 커밋을 제거하는 방법"이었고 "마지막 커밋을 제외한 모든 것을 삭제하는 방법"이었습니다.
peterh-Reinstate Monica

1
나는 이것을 정확하게 찾고있었습니다. 감사!
Krzysztof Tomaszewski

6

git repo에 항상 첫 번째 커밋이 있기 때문에 첫 번째 커밋을 편집하고 싶을 수도 있습니다. git commit --amend --reset-author평소 대신 사용 을 고려하십시오 git commit --amend.


1
답이 아닙니다. 질문은 첫 번째 커밋을 삭제하고 마지막 커밋의 속성을 수정하지 않으려 고했습니다.
peterh-복원 모니카

@ peterh-ReinstateMonica 설명을 위해 : 대화식 rebase 중에 커밋을 수정하여 내용을 완전히 변경할 수 있지만 작성자를 변경하려면 --reset-author도 제공해야합니다. 이를 통해 첫 번째 커밋을 원하는대로 완전히 바꿀 수 있습니다. CharlesB의 답변도 참조하십시오.
Max Beikirch

3

나는 결코 일어나지 않은 것처럼 리포지토리에서 모든 자식 커밋을 취소하는 방법을 찾고있었습니다.

리베이스는 한 지점까지 작동합니다. 그러나 첫 번째 (시간순으로 가장 오래된 git commit)는 부모가 없기 때문에 항상 문제가 될 것이므로 오류가 발생합니다.

이 답변들 중 어느 것도 나를 위해 그것을 해결하지 못했습니다. 그러나 많은 수색과 시행 착오 끝에 이것이 효과가 있음을 알았습니다!

git update-ref -d HEAD
git push origin master -f

이것이 도움이되기를 바랍니다. 좋은 하루 보내세요


1
이 답변을 읽는 사람에게는 분명합니다. 이렇게하면 모든 커밋이 삭제되지만 OP는 리포지토리에 대한 첫 번째 커밋 만 삭제하려고합니다. 모든 커밋이 삭제되므로 첫 번째 커밋을 삭제하기 위해 이것을 실행하지 마십시오.
조디 브루 숑

2

당신이 할 수있는 또 다른 방법은 다음과 같습니다

  1. 유지하려는 지점에 체크 아웃 (예 : 개발자) git checkout dev
  2. 이제 재설정하려는 지점을 삭제하십시오. git branch -D master
  3. 이제 같은 이름으로 빈 지점을 만듭니다. git checkout --orphan master

물론,이 모든 것은 사용 사례에 따라 다르지만 분기가 둘 이상인 경우 .git디렉토리를 삭제하는 것은 의미가 없습니다.


3
이 작업을 수행 한 후 푸시하기 전에 원격에서 분기를 삭제해야합니다. 그렇지 않으면 푸시하려고 할 때 다음 오류가 발생합니다.! [거부 됨] master-> master (비 빨리 감기)-오류 : 일부 참조를 'git@github.com : r1 / r2.git'으로 푸시하지 못했습니다.-힌트 : 현재 분기의 끝이 업데이트되어 거부되었습니다. 뒤에-힌트 : 원격 상대방. 다시 밀기 전에 원격 변경 사항 (예 : 힌트 : 'git pull ...')을 통합하십시오 ...-git pull을 수행하면 모든 커밋이 다시 나타납니다.
dxvargas

2

다른 브랜치를 유지하고 싶지만 예를 들어 다른 브랜치에 대한 master공통 히스토리없이 브랜치를 새로 시작 하게하려면 이를 수행하는 한 가지 안전한 방법은 새 저장소를 작성하고 이전 저장소에서 해당 컨텐츠를 푸시하는 것입니다.

cd ..
git init newrepo
cd newrepo
# make some initial commits
git push ../oldrepo master:newmaster

이렇게하면 newmaster이전 리포지토리에 분기가 만들어 지고 다른 분기와 공통되지 않은 기록이 있습니다. 물론, 당신은 단지를 덮어 쓸 수 있습니다 master와 함께뿐만 아니라 git push -f.

모든 브랜치와 모든 기존 컨텐츠를 삭제하려면 다음을 실행하십시오.

rm -rf .git/

1
답이 아님 : OP는 첫 번째 커밋을 제거하고 현재 작업 트리를 초기 커밋으로 사용하여 새 자식 리포지를 시작하지 않았습니다.
peterh-Reinstate Monica

@ peterh git rebase --root아마 OP가 원했던 것에 동의 하지만이 답변에 두 개의 공감대 가 있다고 생각하면 누군가가 여전히 관련성을 발견하면 삭제하지 않는 것이 좋습니다.
user1338062

먼저 일부 지점에서 커밋 삭제하려면, 거기 -이 대답은 정확하게에게 관련되어 있다고 생각 입니다 하나의 커밋! (하지만 다른 커밋을 다른 브랜치에 유지하고 싶을 수도 있습니다. 변경 사항은 로컬뿐만 아니라 Bitbucket 또는 Github으로 변경되기를 원합니다.)이 답변은 이것을 수행하는 한 가지 방법이라고 생각합니다. 나는 이것이 유일한 방법 일 것이라고 생각합니다. (그 때문에 - 또한 최대한 멀리 볼 수 -. 일부 커밋 원격 지점에 대해 아무런 커밋으로 로컬 브랜치를 밀어 강제 할 방법이 없음)
MikeBeaton

0

방금 커밋했지만 푸시하지 않은 경우 .git 디렉토리를 제거 하고 git init다시 ...


@ peterh 그렇습니다. OP의 질문은 첫 번째 커밋을 삭제하고 후속 커밋을 유지하려는 것입니다. 또 다른 가능성 (I 완벽하게 잘 OP의 질문을 일치 생각 - 그리고 어떤이 답변이 있습니다 에 대한 답변) 첫 번째 삭제 만 다시 비우고 다시 완전히에 다시 복귀하는 지점에서 커밋하고자한다.
MikeBeaton

@MikeBeaton 당신이 맞아요. 내 의견을 삭제하지만 질문을 명확하지 않게하려면 투표해야합니다. 참고 로이 의견에 대해서만 답변했지만 내 뒤에는 40000 명의 방문자가 있으며 상당수의 사람들이 Google 에서이 질문을 발견했으며 원하는 것을 얻지 못했습니다.
peterh-복 직원 모니카

극단적 인 것 같습니다. 질문을 삭제 하시겠습니까? 완벽하게 합리적인 질문이 무엇인지에 대한 완전한 대답은 ... 등에 따라 취해야 할 두 가지 다른 접근법이 있다는 것이 (완벽하게 잘) 논증 될 수 없는가? (나는, 하나, 의미하는 것이 그렇지 않은 유일한의 커밋, 또한이 때 먼저 커밋 제거하는 방법을 때 첫 번째 커밋을 제거하는 방법을 알고 싶은 것입니다 의존 않습니다 확실히 그것은 확실히 분명 아니다. (가)에만 투입하고, 구현 고유의 세부 사항에, 그것은 그 사실에 정말 아니라 서로 다른 접근 방식이 각각의 경우에 필요한 것으로 나타났다).
MikeBeaton

0

질문에 대한 답변은 다음 여부에 따라 다릅니다.

  • 분기에서 첫 번째 만 커밋을 제거하려고합니다 (다른 분기를 그대로 두는 동안).

  • 후속 커밋 (및 다른 분기)을 '제자리에두고'있는 동안 일부 브랜치에서 첫 번째 커밋을 제거하려고합니다.

이 중 두 번째는 비교적 간단합니다. 본질적으로 루트에 기반을 두어야합니다. 여기에있는 대부분의 답변은이를 수행하는 방법에 대한 것입니다.

두 번째를 수행하는 것은 (첫 번째 지점을 제거하고 다른 지점을 내버려두고 지점에서만 커밋하는 것) 더 어렵습니다. 또는 GitHub 또는 Bitbucket에 변경 사항이 반영되기를 원할 경우 특히 어렵습니다. Git에는 커밋없이 분기를 푸시하거나 강제로 푸시 할 수있는 방법이 없습니다. 그리고 GitHub 또는 Bitbucket에서 커밋이없는 새로운 빈 분기를 만들 수있는 방법이 없습니다 (다시 볼 수있는 한). 따라서 완전히 빈 분기를 만들려면 기본적으로 새 리포지토리를 만든 다음 @ user1338062의 답변에 따라 원하는 커밋을 포함하여 원하는 분기를 다시 추가해야합니다.

필요가 취해야 할 것이 두 가지 방법이 있다는 것을, 두 개의 서로 다른 (더 많거나 적은 합리적인) 시나리오 - 나는 분명되지 않았 어떤이 응답 관계를 설명하겠습니다 그래서 모두 당신이 할 수 있도록 할 수 있습니다 일들이 순서를 OP가 요구하는 것을 완전히 마스터합니다.

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