2010-12-22 3 views
10

나는 잠시 동안 달렸던 자식 프로젝트를 가지고있다. 그리고 나는 지금부터 시작하여 2 년 전부터 오래된 역사를 버리고 싶다. 던지기와 함께 나는이 시간 내에 많은 커밋들을 하나의 커밋으로 대체하는 것을 의미한다.힘내에서 오래된 역사를 평평하게한다

나는 git rebase -i을 검사했는데, git의 모든 커밋을 포함하는 다른 (전체) 기록은 삭제되지 않습니다.

여기

(변경 집합 인 D) 그래픽 표현 :

(base) -> d1 -> d2 -> d3 -> (HEAD) 

내가 원하는 것은이는 어떻게

(base) -> d1,d2 -> d3 -> (HEAD) 

을 할 수 있을까? 감사합니다. .

편집

나는 cd1e8c9 스쿼시에 시작 개정 (기본) 인 상태

git rebase -i cd1e8c9 

작업을 얻었다. 그런 다음 픽스 업을 사용하여 수정 내용을 통합했습니다. 감사.

+0

가능한 복제본 [git 저장소의 기록 숨기기] (http://stackoverflow.com/questions/250238/collapsing-a-git-repositorys-history) – Shawn

답변

10

전체 역사에 대해 정말로 신경 쓰지 않는다면,이를 수행하는 또 다른 간단한 방법은 현재 분기를 가져 와서이를 기반으로 고아 분기를 만드는 것입니다. 그런 다음 모든 파일을이 분기에 추가하고 첫 번째 커밋을 만듭니다 (모든 기록을 잃을 것입니다). 그런 다음 원격 저장소로 푸시 될 수 있습니다.

사용자가 전개하려는 지점에 있다고 가정합니다. 먼저 깨끗한 지 확인하십시오.

git status -s 

위의 명령은 아무 것도 출력하지 않습니다.

git checkout --orphan flattened 

이 모든 것이 같은 원하는 경우

git commit -m "Initial flattened commit" 

확인을 하나의 커밋 만들기 모든 파일

git add . 

추가 및 원격 (예)로 밀어 :

은 이제 고아 분기를 만들 :

git status -s 

# (original_branch being the branch with the full history) 
git diff original_branch..flattened 

# (assuming your remote is origin and the branch to overide is master) 
# Think twice before doing this! 
git push origin +flattened:master 
+0

의도 한 내용은 무엇입니까? 이것을 시도해 보았을 때 나는 위의 작업을 수행했으며 서버는 커밋을하지 않고 원래의 브랜치 (마스터)와 함께 남았습니다. 사실 하나만 더 가졌습니다. 방금 밀린 "평평한"커밋이었습니다. 지역 주인을 끌어들이는 것도 커밋을 보여주지 못했습니다. 이것은 아무것도하지 않는 것 같습니다. –

+0

위의 명령 시퀀스는 처음에 로컬 저장소가 있던 지점의 모든 파일을 포함하는 하나의 커밋으로 새 분기를 만들어야합니다. 마지막 push는 원격 커밋 브랜치를 "one commit"브랜치로 오버라이드한다. 그러면 마스터 분기에 대한 모든 내역이 제거됩니다. 이것은 나중에 공간과 대역폭을 절약하기 위해 저장소를 축소하는 데 사용할 수 있습니다. "git checkout --orphan flattened"단계를 놓치거나 잘못 입력했을 수 있습니다. – murraybo

+0

내가 혼란스러워하는 부분은 이것이 로컬에서 재생되는 곳이라고 생각합니다. 내 의견을 남긴 후에 좀 더 파헤 쳤다. 서버에서 물건을 평평하게 만든 것처럼 보였으 나, 마스터에서 로컬로 마스터를 가져 오면, 1 개의 새로운 커밋을 얻는다. 로컬 히스토리는 평평하지 않은 상태로 유지되고 이제는 서버와 크게 다르다. . 실제로 그것을 평평하게하는 것은 모든 사람이 당겨서가 아니라 새로 복제해야 할 필요가있는 것처럼 보입니다. 평평한 역사를 원했을 때 의도했던 것처럼 보이지 않으므로 여기에서 명확하게 설명해야합니다. –

4

리베이스 작업에 익숙하지 않으므로 별도의 클론에서 실제 작업 공간에서 작업하기 전에이 작업을 시도해보십시오. ,

여기 내 커밋 내가 21790602bd6c0a009899ea33e64fec63559c0a76 위에 04453f1c90ffde0574c9c8a76f154d741d7d83f4 (Added d)을합니다 (먼저 커밋) 리베이스와 그들 모두를 부수있어

[email protected]% git log --pretty=oneline 
967122e7d4e687c0707d25c62cb0d3b6a45d337f Added h 
3b82cae737d5fb3317bc7a686a2fdf0fdd9d1c7e Added g 
94d89e0455b12e1e4843e64a8f62f3ad6cdf42f3 Added f 
a30321b7a367d9b7da6369783650acadbb773cfb Added e 
04453f1c90ffde0574c9c8a76f154d741d7d83f4 Added d 
ec723a3266e56cc39967bf117154465575905e31 Added c 
f415d1f58e2f7bd4beea80ab9acd8309bf5b64e7 Added b 
7f1f8d1f903168aa929818a0eb81e0ec7743fb85 Added a 
21790602bd6c0a009899ea33e64fec63559c0a76 Added it 

하고 나는이 명령

git rebase 04453f1c90ffde0574c9c8a76f154d741d7d83f4 --onto 21790602bd6c0a009899ea33e64fec63559c0a76 

나는이를 마친 후 함께 할 로그는 다음과 같습니다.

[email protected]% git log --pretty=oneline 
c76290666c8b868d36290d8f5276b879bb78d05d Added h 
7001ce74f0837b35c0b82abbb82ad8f40801449c Added g 
051062042e56759d83258c5e90a9876aa6f52764 Added f 
fb1a62b0c0faefa0110ef7b8eee01a13f2f62034 Added e 
21790602bd6c0a009899ea33e64fec63559c0a76 Added it 

찾고 있니?

+0

어떤 버전의 git을 사용 하시나요? 나는 사용법 : git rebase ... 자식 버전 1.7.3.1.msysgit.0을 사용한다. – schoetbi

+0

나는'git version 1.7.0.4'을 사용한다. –

+0

--root 옵션을 사용하면 체크 아웃 마스터에서 오래된 기록을 볼 수있다. 다시 나타납니다. 어떻게 그것을 역사에서 제거 할 수 있습니까? – schoetbi

4

squash 각각은 git rebase --interactive을 사용하여 커밋됩니다.

+1

할 방법이 있습니다. git rebase 스쿼시 TAIL : 58c5e9? – schoetbi

+0

내가 아는 한 (그리고 문서화가 진술되어 있지 않은 것처럼), 그것은 불가능합니다. –

+1

이 자식/개체를 삭제합니까? – williamcarswell

0

이 5 월은 틀에 얽매이지 않는 것,하지만 당신은 역사에 대해 걱정하지 않는 경우, 그리고 저장소는 당신이 할 수있는 단 하나의 master 지점 및 이 Github.com 또는 다른 사이트에을 게시되지 않은 있습니다

  1. git init
  2. 커밋의 repo의 루트에 숨겨진 .git 폴더를 삭제

첫 번째 단계는 가지와 커밋을 포함한 모든 자식 데이터를 지우는 것을 기억하므로주의하십시오.