2010-07-25 1 views
5

저는 GitHub에서 많은식이 요법을하고 싶습니다. 프로젝트가 진행되는 현재 방향과 본질적으로 관련이없는 프로젝트 역사 초기에 만들어진 고대의 커밋을 폐기해야합니다.git rebase. 어떻게 그것을 사용하여 고대의 커밋을 무너 뜨릴 수 있습니까?

나는이 개인 레포의 유일한 사용자이며 언제나 그 사용자가 될 것입니다.

자식부터-출생의-REPO-까지 - 한 달 전에

감사를 리베이스
더그에게

+0

[가능한 한 Git 저장소의 처음 두 커밋을 결합하려면 어떻게합니까?] (http://stackoverflow.com/questions/435646/how-do-i-combine-the-first-two-commits- of-a-git-repository) 여기에 링크 된 질문은 단지 두 개의 커밋을 결합하는 것에 대해 이야기하지만, 거기에 설명 된 방법은 더 많은 커밋을 위해 작동합니다. –

+0

감사 파벨. 나는 그것을 조사 할 것이다. – dugla

+0

모든 커밋을 한 커밋으로 스쿼시하려고합니까, 아니면 실제로 도입 된 변경 사항을 취소 하시겠습니까? "폐기"하고 프로젝트가 다른 방향으로 가고 있다는 의견에 따라, 그것은 나에게 분명하지 않습니다. – masonk

답변

2

사실, 나는 지루한 오래된 git rebase -i HEAD ~ Number를 사용한다. 여기서 Number는 나를 머리부터 원래의 커밋으로 되돌아 갈 것이다. 더 많은 시간을 필요로하지만 최소한 나는 그것이 무엇을하는지 모호하게 이해하고있다. 모든 제안을 주셔서 감사합니다.

1

, 여기 조리법은 것입니다 :

처럼 이상적으로 뭔가를 할 수 Git 1.7.2 이상에서 작동 :

 
start=$starting_sha1 
git checkout --orphan new_master $start 
git commit -m 'new root' 
git rebase --onto new_master $start master 
git checkout master 
git reset --hard new_master 
git push -f origin master 

더 이상 참조하지 않는 오래된 객체를 삭제하는 것은 더 많은 작업입니다. 한 번 여러분과 함께 확인 reflogs 등 은닉, 태그, 다른 지점,에 의해 지적 울드이 다음 중 하나 이상은 도움이 될 것입니다, 고정 또는 제거 :

 
git prune 
git gc 
git repack -ad 
7

git merge--squash 옵션이있을 수 있습니다 유용하며 git 1.4.1 및 이후 버전에서 사용할 수 있습니다. 이것은 병합의 효과를 단계적으로 나타내지 만 커밋을 생성하지는 않습니다.

# Save the old position of "master" by creating a branch old-master: 
$ git checkout master 
$ git branch old-master 

# Create and checkout a branch called "new-master" that's at the old commit: 
$ git checkout -b new-master 143eff 

# Stage the effects of merging the "one month ago" commit: 
$ git merge --squash dcb7e5 
Updating 143eff3..dcb7e5b 
Fast-forward 
Squash commit -- not updating HEAD 
[... status output showing the staged changes ..] 

# Create the squashed commit: 
$ git commit -m "A commit squashing history up to a month ago" 
# (You could use --amend if you want them to be squashed into 143eff 
# instead of being a commit after that.) 

이제 git diff dcb7e5 new-master으로 확인할 수 있습니다 143eff 경우 그래서, 가장 오래된 당신이 숙청 현재 분기 master하고 커밋 "전 1 개월"당신이 할 수있는, dcb7e5이며, 커밋에 포함 할 커밋 그들은 실제로 동일합니다.

다음, 당신은 새로운 마스터에 작업의 나머지 부분을 리베이스하려면 :

$ git rebase --onto new-master dcb7e5 master 

원하는 역사를 가지고해야으로 업데이트 master에 당신을 떠날 것이다. . GitHub의에 마스터를 밀어 넣을 때 (다시 말하지만, 당신이 git diff old-master mastergit log으로이를 확인할 수는 --force를 추가해야합니다 당신이 다시 한 이래 역사 :

# Push master to github, with "--force", since you've rewritten history: 
$ git push --force origin master 

이제 제거 할 수 있습니다 new-master, 스쿼시 커밋에있다, 로 :

git branch -d new-master 

은 분명히 GitHub의이 푸시에 git gc --auto 실행되므로 곧 절약 공간을 볼 수 ...

+0

이것은 매력처럼 작동했습니다 - Thanks Mark! – Itay