Các --squash
tùy chọn để có thể git merge
hữu ích, và có sẵn trong git 1.4.1 và sau đó. Giai đoạn này ảnh hưởng của việc hợp nhất, nhưng không tạo ra một cam kết. Vì vậy, nếu 143eff
là lâu đời nhất hành bạn muốn bao gồm trong bị đè nén cam kết, chi nhánh hiện tại của bạn là master
và "một tháng trước" cam kết là dcb7e5
, bạn có thể làm:
# 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.)
Bây giờ bạn có thể kiểm tra với git diff dcb7e5 new-master
rằng chúng thực sự giống nhau.
Tiếp theo, bạn muốn rebase phần còn lại của công việc của bạn lên mới bị Thạc sỹ:
$ git rebase --onto new-master dcb7e5 master
Điều đó sẽ để lại cho bạn trên rebased master
mà cần phải có lịch sử bạn muốn. lịch sử (Một lần nữa, bạn có thể kiểm tra điều này với git diff old-master master
và git log
Khi đẩy tổng thể để GitHub bạn sẽ cần phải thêm --force
kể từ khi bạn đã viết lại:.
# Push master to github, with "--force", since you've rewritten history:
$ git push --force origin master
Bây giờ bạn có thể loại bỏ new-master
, mà là ở squash cam kết, với:
git branch -d new-master
Rõ ràng github chạy git gc --auto
trên push, vì vậy bạn sẽ thấy một số không gian tiết kiệm sớm ...
Nguồn
2010-07-28 11:55:10
bản sao có thể có của [Làm cách nào để kết hợp hai cam kết đầu tiên của kho lưu trữ Git?] (Http://stackoverflow.com/questions/435646/how-do-i-combine-the-first-two-commits- of-a-git-repository) Trong khi câu hỏi được liên kết ở đây cho biết về việc kết hợp chỉ hai cam kết, các công thức nấu ăn được mô tả ở đó cũng làm việc cho nhiều cam kết hơn. –
Cảm ơn Pavel. Tôi sẽ kiểm tra. – dugla
Bạn có muốn đè bẹp tất cả các cam kết đó thành một lần commit hay không, hoặc bạn có thực sự muốn loại bỏ các thay đổi mà mỗi lần giới thiệu không? Dựa trên ý kiến của bạn rằng bạn muốn "loại bỏ" và dự án đang đi theo một hướng khác, nó không hoàn toàn rõ ràng với tôi. – masonk