Sử dụng git v1.7.1 Tôi đang cố thực hiện rebase với cả hai tính năng --preserve-merges
và --onto
cùng một lúc. Kết quả cuối cùng dường như không có các cam kết hợp nhất, và do đó xuất hiện tuyến tính. Tôi muốn giữ lại các cam kết hợp nhất, vì lý do tương tự mà mọi người thường sử dụng --preserve-merges
(dễ dàng hơn để xem nhóm các cam kết đã được một cách hợp lý một tính năng riêng biệt và phát triển trong chi nhánh riêng của nó).git rebase "--preserve-merges --onto" không bảo toàn việc hợp nhất
ngành thạc sĩ của tôi (điểm đến cho rebase) là nhàm chán:
A-B-C
Nhánh tính năng tôi muốn đi từ có một chi nhánh phụ tính năng đã được sáp nhập vào nó. Giống như:
X - Y
/ \
V-W ------ Z
Trường hợp Z là cam kết hợp nhất là người đứng đầu nhánh tính năng cần lấy, và X và Y ở trên nhánh phụ.
Tôi đang sử dụng: git rebase --preserve-merges --onto C V Z
Tôi muốn kết thúc với:
X - Y
/ \
A-B-C-W ------ Z
Nhưng thay vào đó tôi nhận được:
A-B-C-W-X-Y
Từ Z là một conflict- hợp nhất miễn phí, trạng thái cuối cùng của mã là chính xác, nhưng lịch sử không phải là biểu cảm như tôi muốn.
Có cách nào để có được những gì tôi muốn không?
chỉnh sửa địa chỉ @Bombe: Tôi đã viết một tập lệnh bash để xây dựng ví dụ của tôi. Trên hệ thống của tôi (RHEL 6.2 với git 1.7.1) điều này chứng tỏ vấn đề của tôi.
#! /bin/bash
# start a new empty repo
git init
# make some commits on the master branch
git checkout master
touch A.txt; git add A.txt; git commit -m "add A.txt"; git tag Atag
touch B.txt; git add B.txt; git commit -m "add B.txt"; git tag Btag
touch C.txt; git add C.txt; git commit -m "add C.txt"; git tag Ctag
# now build the feature branch
# start at Btag (more or less arbitrary; point is it's before C)
git checkout Btag
git checkout -b feature
touch V.txt; git add V.txt; git commit -m "add V.txt"; git tag Vtag
touch W.txt; git add W.txt; git commit -m "add W.txt"; git tag Wtag
# now a subfeature
git checkout -b subfeature
touch X.txt; git add X.txt; git commit -m "add X.txt"; git tag Xtag
touch Y.txt; git add Y.txt; git commit -m "add Y.txt"; git tag Ytag
# merge the subfeature into the feature
# preserves branch history with --no-ff
git checkout feature
git merge --no-ff subfeature
# the merge commit is our Z
git tag Ztag
# one more commit so that merge isn't the tip (for better illustration of Z missing later)
touch postZ.txt; git add postZ.txt; git commit -m "add postZ.txt"; git tag postZtag
# now do the rebase
git rebase --preserve-merges --onto Ctag Vtag
# optionally move the master branch forward to the top of feature branch
git checkout master
git merge feature
Trước rebase tôi nhận được:
X-Y
/ \
V-W-----Z-postZ
/
A-B-C
Sau rebase tôi nhận được:
X-Y
/ \
V-W-----Z-postZ
/
A-B-C-W'-X'-Y'-postZ'
Note thiếu Z 'giữa Y' và postZ'.
Tôi đã chỉnh sửa bài đăng gốc để cung cấp các bước để tái tạo sự cố của mình. Tôi chắc chắn bạn đã đúng, nhưng tôi không thấy những gì tôi đang làm sai. – RaveTheTadpole
Và tôi thực sự có một phiên bản lớn hơn 1.7.5.2. :) – Bombe