저는 GitHub에서 많은식이 요법을하고 싶습니다. 프로젝트가 진행되는 현재 방향과 본질적으로 관련이없는 프로젝트 역사 초기에 만들어진 고대의 커밋을 폐기해야합니다.git rebase. 어떻게 그것을 사용하여 고대의 커밋을 무너 뜨릴 수 있습니까?
나는이 개인 레포의 유일한 사용자이며 언제나 그 사용자가 될 것입니다.
자식부터-출생의-REPO-까지 - 한 달 전에
감사를 리베이스
더그에게
저는 GitHub에서 많은식이 요법을하고 싶습니다. 프로젝트가 진행되는 현재 방향과 본질적으로 관련이없는 프로젝트 역사 초기에 만들어진 고대의 커밋을 폐기해야합니다.git rebase. 어떻게 그것을 사용하여 고대의 커밋을 무너 뜨릴 수 있습니까?
나는이 개인 레포의 유일한 사용자이며 언제나 그 사용자가 될 것입니다.
자식부터-출생의-REPO-까지 - 한 달 전에
감사를 리베이스
더그에게
사실, 나는 지루한 오래된 git rebase -i HEAD ~ Number를 사용한다. 여기서 Number는 나를 머리부터 원래의 커밋으로 되돌아 갈 것이다. 더 많은 시간을 필요로하지만 최소한 나는 그것이 무엇을하는지 모호하게 이해하고있다. 모든 제안을 주셔서 감사합니다.
, 여기 조리법은 것입니다 :
처럼 이상적으로 뭔가를 할 수 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
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 master
및
git 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
실행되므로 곧 절약 몇 공간을 볼 수 ...
이것은 매력처럼 작동했습니다 - Thanks Mark! – Itay
[가능한 한 Git 저장소의 처음 두 커밋을 결합하려면 어떻게합니까?] (http://stackoverflow.com/questions/435646/how-do-i-combine-the-first-two-commits- of-a-git-repository) 여기에 링크 된 질문은 단지 두 개의 커밋을 결합하는 것에 대해 이야기하지만, 거기에 설명 된 방법은 더 많은 커밋을 위해 작동합니다. –
감사 파벨. 나는 그것을 조사 할 것이다. – dugla
모든 커밋을 한 커밋으로 스쿼시하려고합니까, 아니면 실제로 도입 된 변경 사항을 취소 하시겠습니까? "폐기"하고 프로젝트가 다른 방향으로 가고 있다는 의견에 따라, 그것은 나에게 분명하지 않습니다. – masonk