Giải pháp chủ đề
Lệnh chính xác để trả lời câu hỏi được đăng có thể là bất kỳ câu nào sau đây (giả sử chi nhánh topic
đã được kiểm tra):
git rebase --onto B master
git rebase --onto master~1 master
git rebase --onto B A
git rebase --onto B C
git rebase --onto B
Nếu topic
không được kiểm tra, bạn chỉ cần thêm topic
vào lệnh (ngoại trừ lệnh cuối cùng) như vậy:
git rebase --onto B master topic
Ngoài ra, hãy kiểm tra chi nhánh đầu tiên với:
git checkout topic
Khởi động lại bất kỳ chuỗi cam kết nào đối với một cam kết đích
Hình thức cơ bản của lệnh chúng ta cần, được lấy từ tài liệu, là:
git rebase --onto <Target> [<Upstream> [<Branch>]]
<Branch>
là tùy chọn và tất cả những gì nó làm là kiểm tra nhánh được chỉ định trước khi thực hiện phần còn lại của lệnh. Nếu bạn đã kiểm tra chi nhánh bạn muốn bắt đầu, thì bạn không cần điều này. Lưu ý rằng bạn phải có chỉ định <Upstream>
để chỉ định <Branch>
hoặc git sẽ nghĩ rằng bạn đang chỉ định<Upstream>
.
<Target>
là cam kết chúng tôi sẽ đính kèm chuỗi cam kết của chúng tôi. Khi cung cấp một tên chi nhánh, bạn chỉ cần xác định cam kết đầu của chi nhánh đó. <Target>
có thể là bất kỳ cam kết nào sẽ không được chứa trong chuỗi các cam kết được di chuyển. Ví dụ:
A --- B --- C --- D master
\
\-- X --- Y --- Z feature
Để di chuyển toàn bộ chi nhánh tính năng, bạn không thể chọn X
, Y
, Z
, hoặc feature
là<Target>
vì những tất cả đều cam kết bên trong nhóm được di chuyển.
<Upstream>
là đặc biệt bởi vì nó có thể có nghĩa là hai điều khác nhau. Nếu đó là một cam kết là tổ tiên của nhánh đã kiểm tra, thì nó đóng vai trò là điểm cắt. Trong ví dụ tôi cung cấp, đây sẽ là bất cứ điều gì đó là không C
, D
hoặc master
. Tất cả các cam kết sau<Upstream>
cho đến khi người đứng đầu chi nhánh kiểm tra là những người sẽ được di chuyển.
Tuy nhiên, nếu <Upstream>
không phải là tổ tiên, thì hãy sao lưu chuỗi từ cam kết đã chỉ định cho đến khi tìm thấy tổ tiên chung với nhánh đã kiểm tra (và hủy bỏ nếu không thể tìm thấy chuỗi). Trong trường hợp của chúng tôi, một <Upstream>
số B
, C
, D
, hoặc master
tất cả sẽ kết quả trong cam kết B
phục vụ như là điểm cắt. <Upstream>
bản thân nó là một lệnh tùy chọn và nếu nó không được chỉ định, thì git nhìn vào cha mẹ của nhánh đã kiểm tra, tương đương với việc nhậpmaster
.
Bây giờ git đã chọn các cam kết nó sẽ cắt và di chuyển, nó áp dụng chúng để <Target>
bỏ qua bất kỳ cái nào đã được áp dụng cho mục tiêu.
Ví dụ và kết quả thú vị
Sử dụng điểm bắt đầu này:
A --- B --- C --- D --- E master
\
\-- X --- Y --- Z feature
git rebase --onto D A feature
Sẽ áp dụng cam kết B
, C
, X
, Y
, Z
cam kết D
và kết thúc bỏ qua B
và C
vì họ đã có được áp dụng.
git rebase --onto C X feature
Sẽ áp dụng các cam kết Y
và Z
để cam kết C
, xóa hiệu quả cam kếtX
git checkout B
trước khi chạygit rebase
chưa?