Git tương tác rebase không cam kết chọn


105

Tôi là chủ và tôi đã làm rebase -i <my_branch>

Hiểu rồi:

noop

# Rebase c947bec..7e259d3 onto c947bec
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x <cmd>, exec <cmd> = Run a shell command <cmd>, and stop if it fails
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

Tôi muốn chọn một số cam kết không phải tất cả vì một số trong số chúng không được chào đón. Ngoài ra, bạn làm việc như thế nào khi muốn giữ một số tệp hoặc thay đổi luôn 'cục bộ' đối với một số nhánh? Có một số người trợ giúp như thế .gitignorenào?

Câu trả lời:


85

Giống như một rebase không tương tác, bạn phải rebase vào một cam kết cụ thể.

Với rebase không tương tác, nếu bạn cung cấp tổ tiên trực tiếp của commit hiện tại thì bạn sẽ không thay đổi bất cứ điều gì; với một rebase tương tác, bạn có thể chỉnh sửa các cam kết sau khi cam kết mà bạn đang khôi phục, ngay cả khi cam kết là tổ tiên trực tiếp của cam kết hiện tại của bạn nhưng bạn phải chỉ định cam kết này mà bạn muốn chỉnh sửa trở đi.

Tôi không biết chi tiết về tình huống của bạn nhưng bạn có thể muốn một cái gì đó như thế này:

# Opportunity to edit or prune commits between origin/master and current branch
git rebase -i origin/master

hoặc là

# Edit some of the last ten commits
git rebase -i HEAD~10 # Note that ~10 uses a tilde("~") not a dash("-"_) !

Tôi sử dụng HEAD~*cú pháp nhưng cú pháp đầu tiên thì không.
Dev Yego

25

rebase -ikhông có phạm vi cam kết sẽ không hiển thị bất kỳ cam kết nào. để căn cứ lại lần cuối cùng, giả sử, 7 lần cam kết sử dụng như sau:

git rebase -i HEAD~7

hãy cẩn thận, rằng điều này sẽ viết lại lịch sử. đừng làm điều đó, nếu các cam kết đã được đẩy


cho câu hỏi thứ hai của bạn: có một nhánh với những thay đổi của bạn (về cơ bản là một nhánh cấu hình) và thường xuyên hợp nhất các nhánh khác vào đó. bằng cách này, các thay đổi sẽ không chuyển sang các nhánh khác


9

Khi bạn đang sử dụng git rebase -i, bạn thường phải chỉ định, bạn muốn thực hiện cam kết nào để thực hiện rebase. Vì vậy, nếu, ví dụ, bạn muốn xóa một số cam kết trong số 10 lần cuối cùng với nhánh hiện tại, bạn sẽ làm như sau:

git rebase -i HEAD~10

6

Như những người khác đã đề cập, bạn cần chỉ định một phạm vi cam kết.

git rebase -i <latest-commit-to-be-retained>

(Giả sử rằng bạn ở cùng nhánh với cam kết được chỉnh sửa) -

Để chỉ định các cam kết, bạn có thể sử dụng phím tắt HEAD ~ 5 hoặc sử dụng tổng kiểm tra (mà bạn có thể nhận được bằng cách sử dụng git log)

Trong thực tế, bất kỳ cam kết nào cũng sẽ thực hiện nếu nó là trước / tổ tiên của các cam kết mà bạn muốn xóa / chỉnh sửa / từ khóa trong cây. Điều này sẽ liệt kê tất cả các cam kết kể từ <latest-commit-to-be-retained>trong trình chỉnh sửa (được xác định trong cấu hình git của bạn). Từ danh sách, để xóa một cam kết, chỉ cần xóa dòng cụ thể đó, lưu và thoát (vi habbits :)) tệp + trình chỉnh sửa và thực hiệngit rebase --continue

Đối với câu trả lời thứ hai, tôi đồng ý với

có một nhánh với những thay đổi của bạn (về cơ bản là một nhánh cấu hình) và thường xuyên hợp nhất các nhánh khác vào đó. bằng cách này, các thay đổi sẽ không chuyển sang các nhánh khác

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.