Lệnh rebase có một số tùy chọn tuyệt vời có sẵn trong chế độ --interactive
(hoặc -i
) của nó và một trong những cách được sử dụng rộng rãi nhất là khả năng xóa các cam kết. Điều này làm là thực hiện các cam kết nhỏ hơn và kết hợp chúng thành những cam kết lớn hơn, điều này có thể hữu ích nếu bạn đang hoàn thành công việc trong ngày hoặc nếu bạn chỉ muốn đóng gói các thay đổi của mình theo cách khác. Chúng ta sẽ xem xét cách bạn có thể làm điều này một cách dễ dàng.
Một lời cảnh báo: Chỉ thực hiện việc này đối với các cam kết chưa được đẩy ra kho lưu trữ bên ngoài. Nếu những người khác làm việc dựa trên các cam kết mà bạn sẽ xóa, nhiều xung đột có thể xảy ra. Chỉ cần không viết lại lịch sử của bạn nếu nó đã được chia sẻ với những người khác.
Vì vậy, giả sử bạn vừa thực hiện một vài cam kết nhỏ và bạn muốn thực hiện một cam kết lớn hơn trong số chúng. Lịch sử của kho lưu trữ của chúng tôi hiện như sau:
4 cam kết cuối cùng sẽ hạnh phúc hơn nhiều nếu chúng được kết hợp với nhau, vì vậy hãy thực hiện điều đó thông qua phục hồi tương tác:
$ git rebase -i HEAD~4
pick 01d1124 Adding license
pick 6340aaa Moving license into its own file
pick ebfd367 Jekyll has become self-aware.
pick 30e0ccb Changed the tagline in the binary, too.
# Rebase 60709da..30e0ccb onto 60709da
#
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
Vì vậy, một vài điều đã xảy ra ở đây. Trước hết, tôi đã nói với Git rằng tôi muốn căn cứ lại bằng cách sử dụng bốn cam kết cuối cùng từ vị trí HEAD với HEAD ~ 4. Git hiện đã đưa tôi vào một trình soạn thảo với văn bản trên trong đó và một chút giải thích về những gì có thể được thực hiện. Bạn có rất nhiều tùy chọn có sẵn cho bạn từ màn hình này, nhưng ngay bây giờ chúng tôi sẽ chỉ thu gọn mọi thứ vào một cam kết. Vì vậy, thay đổi bốn dòng đầu tiên của tệp này sẽ thực hiện thủ thuật:
pick 01d1124 Adding license
squash 6340aaa Moving license into its own file
squash ebfd367 Jekyll has become self-aware.
squash 30e0ccb Changed the tagline in the binary, too.
Về cơ bản, điều này yêu cầu Git kết hợp tất cả bốn cam kết vào cam kết đầu tiên trong danh sách. Khi điều này được thực hiện và được lưu, một trình chỉnh sửa khác sẽ xuất hiện với nội dung sau:
# This is a combination of 4 commits.
# The first commit's message is:
Adding license
# This is the 2nd commit message:
Moving license into its own file
# This is the 3rd commit message:
Jekyll has become self-aware.
# This is the 4th commit message:
Changed the tagline in the binary, too.
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# Explicit paths specified without -i nor -o; assuming --only paths...
# Not currently on any branch.
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: LICENSE
# modified: README.textile
# modified: Rakefile
# modified: bin/jekyll
#
Vì chúng tôi đang kết hợp rất nhiều cam kết, nên Git cho phép bạn sửa đổi thông điệp của cam kết mới dựa trên phần còn lại của các cam kết liên quan đến quy trình. Chỉnh sửa tin nhắn khi bạn thấy phù hợp, sau đó lưu và thoát. Sau khi hoàn tất, các cam kết của bạn đã được xử lý thành công!
Created commit 0fc4eea: Creating license file, and making jekyll self-aware.
4 files changed, 27 insertions(+), 30 deletions(-)
create mode 100644 LICENSE
Successfully rebased and updated refs/heads/master.
Và nếu chúng ta nhìn lại lịch sử…
Vì vậy, điều này là tương đối dễ dàng cho đến nay. Nếu bạn gặp xung đột trong quá trình rebase, chúng thường khá dễ giải quyết và Git sẽ hướng dẫn bạn nhiều nhất có thể. Điều cơ bản của việc này là khắc phục xung đột được đề cập, git add
tệp và sau đó git rebase --continue
sẽ tiếp tục quá trình. Tất nhiên, thực hiện a git rebase --abort
sẽ đưa bạn trở lại trạng thái trước đây nếu bạn muốn. Nếu vì lý do nào đó mà bạn bị mất cam kết trong rebase, bạn có thể sử dụng reflog để lấy lại.
Chi tiết có thể được tìm thấy liên kết này .