2009-04-07 26 views
158

Tôi đã sử dụng Git khoảng một năm nay và nghĩ nó thật tuyệt vời, nhưng tôi mới bắt đầu phiên bản thứ hai của dự án và bắt đầu một nhánh mới cho nó. Tôi đang đấu tranh một chút với cách tốt nhất để xử lý mọi thứ trong tương lai.git - bỏ qua các cam kết cụ thể khi hợp nhất

Tôi có hai nhánh được gọi là master10 (cho v1) và master20 (cho v2). Tôi đã sửa lỗi trong v1 trên nhánh master10 và phát triển nội dung mới của master20. Bất cứ khi nào tôi thực hiện một sửa lỗi, tôi hợp nhất nó vào v2 bằng cách kiểm tra master20 và làm git merge master10. Càng xa càng tốt.

Tuy nhiên, tôi đã thực hiện thay đổi trong v1 mà tôi không muốn trong v2, nhưng tôi muốn tiếp tục hợp nhất các bản sửa lỗi khác. Làm thế nào để tôi nói với Git bỏ qua cam kết cụ thể đó (hoặc một loạt các cam kết), nhưng điều đó tiếp tục tôi vẫn muốn hợp nhất các sửa lỗi khác.

Tôi nghĩ git rebase có thể là những gì tôi cần nhưng đọc tài liệu và đầu của tôi gần như phát nổ.

Tôi nghĩ rằng những gì tôi muốn là một cái gì đó giống như lệnh "git sync" cho git biết rằng hai nhánh hiện đang đồng bộ hóa và trong tương lai chỉ hợp nhất các cam kết từ điểm đồng bộ hóa này.

Bất kỳ trợ giúp đánh giá cao.

Trả lời

234

Nếu bạn muốn hợp nhất nhiều nhất nhưng không phải tất cả các cam kết trên nhánh "maint" thành "master", ví dụ, bạn có thể làm điều này. Nó đòi hỏi một số công việc ---- như đã đề cập ở trên, trường hợp sử dụng thông thường là hợp nhất tất cả mọi thứ từ một nhánh --- nhưng đôi khi nó xảy ra mà bạn đã thực hiện thay đổi cho một phiên bản phát hành không nên tích hợp lại (có thể mã đó đã được superceded trong chủ đã), vậy làm thế nào để bạn đại diện cho điều đó? Ở đây đi ...

Vì vậy, giả sử đã có 5 thay đổi được áp dụng và một trong những thay đổi đó (maint ~ 3) không được hợp nhất lại thành chính, mặc dù tất cả những thứ khác phải là. Bạn làm điều này trong ba giai đoạn: thực sự hợp nhất tất cả mọi thứ trước đó, nói git để đánh dấu maint ~ 3 như sáp nhập ngay cả khi nó không phải là, và sau đó hợp nhất phần còn lại. Sự kỳ diệu là:

bash <master>$ git merge maint~4 
bash <master>$ git merge -s ours maint~3 
bash <master>$ git merge maint 

Lệnh đầu tiên kết hợp tất cả mọi thứ trước Maint phiền bạn cam kết lên thạc sĩ. Thông báo nhật ký hợp nhất mặc định sẽ giải thích bạn đang hợp nhất "branch 'maint' (phần đầu)".

Lệnh thứ hai kết hợp các phiền phức maint ~ 3 cam kết, nhưng tùy chọn "-s ours" cho git sử dụng "chiến lược hợp nhất" đặc biệt, trên thực tế, hoạt động đơn giản bằng cách giữ cây bạn đang hợp nhất và bỏ qua (các) cam kết mà bạn đang hợp nhất hoàn toàn. Nhưng nó vẫn làm cho một hợp nhất mới cam kết với HEAD và maint ~ 3 là cha mẹ, do đó, đồ thị sửa đổi bây giờ nói rằng maint ~ 3 được sáp nhập. Vì vậy, trong thực tế, bạn có thể muốn sử dụng tùy chọn -m để 'git merge' là tốt, để giải thích rằng maint ~ 3 cam kết thực sự bị bỏ qua!

Lệnh cuối cùng chỉ cần hợp nhất phần còn lại của maint (maint ~ 2..maint) vào chính để bạn được đồng bộ hóa lại.

+0

Tôi tự hỏi nếu điều đó không phải là một chút nguy hiểm: mast ~ 3 là gì không được bỏ qua nhưng chỉ đơn giản là hoãn lại? Với giải pháp của bạn, bất kỳ git merge nào tiếp theo sẽ không hợp nhất lại cột ~ 3. – VonC

+1

Đối với cam kết hoãn, tôi sẽ tạo ra một "nhánh phụ", làm chính xác những gì bạn mô tả (bao gồm git merge -s của chúng ta maint ~ 3), sau đó hợp nhất tất cả mọi thứ từ nhánh con để làm chủ. Tôi tin rằng một tương lai "git merge maint" lần này sẽ hợp nhất "mast ~ 3" – VonC

+2

Tôi nghĩ rằng nếu bạn cần hoãn hợp nhất, bạn có ít lựa chọn nhưng bỏ qua (hợp nhất -súng ta) và sau đó áp dụng nó lệnh cherry-pick. Một khi cam kết có thể truy cập từ master, nó không thể được sáp nhập lại - tránh việc sáp nhập cùng một thay đổi hai lần là một trong những mục tiêu git chính. – araqnid

0

Tạo nhánh thứ ba cho các thay đổi bạn muốn trong master10 nhưng không phải trong master20. Luôn coi master10 là "master" của bạn, nhánh ổn định nhất của tất cả. Nhánh mà tất cả các nhánh khác muốn giữ đồng bộ với mọi lúc.

+0

Tôi đoán điều đó có thể hiệu quả, nhưng tôi đã tự đặt mình vào trạng thái này và chi nhánh thứ ba có thể sẽ làm tôi bối rối hơn nữa. :) –

15

Cam kết bao gồm tổ tiên. Bạn không thể hợp nhất một cam kết mà không hợp nhất các cam kết trước đó.

Bạn có thể chọn tất cả các món anh đào. Đó là một dòng chảy tốt khi bạn có một chi nhánh đang ở chế độ bảo trì.

+1

Cảm ơn, lựa chọn anh đào sẽ thực hiện công việc. Không tốt như những gì tôi đã hy vọng nhưng nó sẽ làm. –

26

IMHO, điều hợp lý nhất cần làm là để hợp nhất mọi thứ và sau đó sử dụng git revert (commit_you_dont_want) để xóa nó.

Ví dụ:

git merge master 
git revert 12345678 

Nếu bạn có nhiều "to-phớt lờ" cam kết, hoặc muốn chỉnh sửa trở lại thông điệp:

git merge master 
git revert -n 123456 
git revert -n abcdef 
git commit -m "... Except commits 123456 and abcdef" 

Sau đó, lịch sử của bạn có thể trông giống như:

| ... Except 123456 and abcdef 
|\ Merge branch 'master' into 'your_branch' 

Nếu bạn có xung đột liên quan đến CHỈ các cam kết "bỏ qua" này, bạn có thể sử dụng:

git merge master -X ours 

Vì vậy, phiên bản của bạn sẽ vẫn tồn tại trên phiên bản khác. Ngay cả khi không có thông báo lỗi, bạn vẫn có thể "hoàn nguyên" những cam kết không mong muốn đó, vì chúng có thể có những thay đổi khác không xung đột và bạn vẫn không muốn chúng.

Nếu bạn có xung đột không chỉ là cam kết "bỏ qua", bạn nên giải quyết chúng theo cách thủ công và có thể bạn sẽ phải giải quyết chúng một lần nữa trong khi hoàn nguyên.

+1

Nếu sau đó bạn muốn hợp nhất các cam kết hoàn nguyên đó vào chi nhánh thành câu hỏi, Git sẽ vẫn bỏ qua chúng? –

+0

@ AnriëtteMyburgh Bạn có thể hoàn nguyên các cam kết đảo ngược để sau đó hợp nhất chúng trong một cái gì đó bạn thực sự không thể làm một cách dễ dàng với chiến lược "hợp nhất -s chúng ta". – ikdc

2

Một loại quảng cáo cho số project của tôi về cơ bản bao bọc quá trình được mô tả bởi @araqnid.

Đó là loại helper giới thiệu dòng GIT sau:

  • có một/thông báo hàng tuần hàng ngày trên cấp phát hòa trộn từ các chi nhánh bảo trì vào dev/chi nhánh chủ
  • kiểm tra chi nhánh duy trì cho tình trạng và quyết định anh/cho dù tất cả các cam kết là bắt buộc và chặn một số hoặc yêu cầu các nhà phát triển chặn chính họ. Trong chi nhánh bảo trì cuối cùng được sáp nhập vào upsteam.

Một trích dẫn từ trang dự án:

Tùy thuộc vào công việc nó có thể có bảo trì hay chi nhánh khách hàng cụ thể cùng với các chi nhánh chủ. Các chi nhánh này còn được gọi là chi nhánh LTS.

Thông thường các bản sửa lỗi nóng đi vào các nhánh nơi lỗi được báo cáo là và sau đó cam kết được sáp nhập lại vào nhánh chính.

thực hành chung là phải có tất cả các chi nhánh hoàn toàn đồng bộ với thuyền trưởng, ví dụ bạn muốn xem một tam giác rõ ràng giữa một chi nhánh và tổng thể đặc biệt để hiểu xem chủ chứa tất cả tính năng và sửa lỗi.

Tuy nhiên đôi khi bạn không muốn cam kết cụ thể vì chúng là dành riêng cho khách hàng và sẽ không được hiển thị bởi những người dùng khác. Hoặc chi nhánh chính của bạn phân kỳ nhiều đến nỗi nó đòi hỏi cách tiếp cận hoàn toàn khác nhau để khắc phục sự cố hoặc thậm chí tốt hơn, vấn đề không còn nữa hiện diện ở đó.

Ngoài ra trong trường hợp anh đào chọn từ chủ vào chi nhánh bảo trì cam kết kết quả sẽ bị chặn trong chính.

Các vấn đề liên quan