2012-08-03 25 views
6

Tôi có hai nhánh A và B. Điều tôi muốn làm là tạo một cam kết mới (hợp nhất) trên A với trạng thái hiện tại của A làm cha mẹ liên quan đến cây tệp được mô tả bởi B loại bỏ bất cứ điều gì từ A. Về cơ bản lịch sử của B nên được đè bẹp thành một cam kết duy nhất.Tạo Commge Commit thay thế chúng ta bằng số

Trạng thái lưu trữ bê tông bao gồm hai nhánh độc lập, không có tổ tiên chung (đến từ hai kho độc lập cũ), nhưng mô tả cùng một nội dung. Bây giờ tôi muốn tìm một "git" -way để mang chúng lại với nhau. Một giải pháp cơ bản (không có git) sẽ là checkout A và chỉ sao chép nội dung của B vào cây đang hoạt động và thực hiện git commit. Đó là cơ bản những gì tôi đã làm trước đó để tuyên truyền nội dung của kho thứ hai vào kho thứ nhất.

Để làm điều đó với git Tôi đã thử

git checkout A 
git merge --squash B 

Nhưng Unforunately nó tạo ra xung đột nhập cho tất cả các file khác nhau giữa A và B, những gì là chắc chắn không phải những gì tôi mong đợi.

Về cơ bản giống như

git merge --squash -s theirs 

nên thực hiện công việc, nhưng chiến lược hợp nhất theirs không tồn tại. Đọc docu lãm khả năng sử dụng một cái gì đó giống như

git merge -X theirs 

đó là một lựa chọn chiến lược hợp nhất recursive. Nhưng điều này vẫn hợp nhất các đoạn không xung đột. Chỉ các đoạn xung đột được lấy trực tiếp từ theirs.

+0

Would một trong những 'hợp nhất chiến lược --their' thể hữu ích ở đây? http://stackoverflow.com/questions/4911794/git-command-for-making-one-branch-like-another/4912267#4912267 – VonC

+0

Mô phỏng được đề cập # 2 nên thực hiện công việc. Tôi chỉ sử dụng nó lên đến 'merge --squash'. Sau đó trong lịch sử của B có một hợp nhất từ ​​A, nhưng điều này là OK. Nếu không muốn, B có thể được đặt lại lần nữa. –

+0

Ok, tôi đã thêm # 2 làm câu trả lời. – VonC

Trả lời

2

Như bạn nhận xét, từ tất cả các chiến lược --theirs merge tôi liệt kê trong "git command for making one branch like another", tùy chọn thứ hai là gần với những gì bạn cần:

lãm như một hợp nhất, với chúng ta như cha mẹ đầu tiên .
(được đề xuất bởi jcwenger)

git checkout -b tmp upstream 
git merge -s ours thebranch   # ignoring all changes from downstream 
git checkout downstream 
git merge --squash tmp    # apply changes from tmp but not as merge. 
git rev-parse upstream > .git/MERGE_HEAD #record upstream 2nd merge head 
git commit -m "rebaselined the branch from upstream" # make the commit. 
git branch -D tmp     # deleting tmp 
Các vấn đề liên quan