Làm thế nào để giữ một nhánh git đồng bộ với chủ


275

Tại thời điểm git đang làm tôi suy nghĩ, tôi không thể đưa ra giải pháp tốt nhất cho việc sau.

Có hai nhánh, một nhánh gọi là master và một nhánh gọi là mobiledevicesupport . Tôi muốn giữ hỗ trợ mobiledevices như một nhánh liên tục sẽ được hợp nhất / đồng bộ hóa với nhánh chính bất cứ khi nào hỗ trợ mobiledevices ổn định. Điều này sẽ hợp nhất các thay đổi từ hỗ trợ mobiledevices thành master nhưng cũng mang tất cả các thay đổi từ master thành mobiledevicesupport để chi nhánh có thể tiếp tục được xử lý và các tính năng được cải thiện hoặc sửa đổi. Điều này cần phải làm việc với một kho lưu trữ trung tâm và nhiều nhà phát triển.

Xin một ví dụ về quy trình công việc tương tự mà người khác sử dụng hoặc chỉ cho tôi biết ý tưởng này có ngu ngốc không và tôi nên xem xét các lựa chọn khác. Hiện tại quy trình làm việc có vẻ âm thanh, nhưng tôi không biết làm thế nào tôi có thể làm cho git hoạt động theo cách này.

Cảm ơn, tất cả giúp đỡ nhiều đánh giá cao.

Cập nhật 1: Nếu tôi hợp nhất chủ nhân vào hỗ trợ mobiledevices và hỗ trợ mobiledevice thành chủ, tôi có nhận được các cam kết nhân rộng trên cả hai chi nhánh không. Hoặc git đủ thông minh để tìm ra rằng tôi đã kéo các thay đổi mới nhất từ ​​nhánh A sang nhánh B và thêm cam kết hợp nhất C vào nhánh B. Và tôi đã kéo các thay đổi mới nhất từ ​​nhánh B sang nhánh A và thêm cam kết hợp nhất D vào nhánh A?

Tôi sẽ đăng một hình ảnh nhưng tôi không có đủ danh tiếng cho nó, vì vậy tôi đoán hình minh họa sau đây sẽ phải làm. Hai nhánh liên tục chạy với sự hợp nhất đi cả hai hướng thường xuyên. Điều quan trọng tôi không chắc chắn là git sẽ thực hiện các cam kết như thế nào và nó sẽ lấp đầy một trong hai nhánh với các cam kết từ nhánh khác khi sáp nhập hay nó sẽ giữ sạch. Tôi đã sử dụng rebase trước đây nhưng nó dường như kết thúc nhánh và đặt tất cả các cam kết vào chủ, hoặc tôi đã làm sai. Cảm ơn sự giúp đỡ cho đến nay.

master
A--B--C-----H--I--J--M--N
       \   /    \
mobile  \ /      \
D--E--F--G--------K--L

1
Nếu bạn cũng như tôi, tìm kiếm cách thực hiện với ứng dụng khách GitHub : help.github.com/articles/merging-branches
cregox

1
Câu hỏi này đã cứu cuộc đời tôi trong nhiều thế kỷ; Cảm ơn những nỗ lực tuyệt vời trong việc dành thời gian để đặt câu hỏi tuyệt vời này @Mr. Ezekiel
DJphy

Trong trường hợp bạn đang làm việc trên một ngã ba, bạn phải theo dõi help.github.com/articles/syncing-a-fork
koppor

Câu trả lời:


416

vâng chỉ cần làm

git checkout master
git pull
git checkout mobiledevicesupport
git merge master

để giữ hỗ trợ mobiledevices đồng bộ với chủ

sau đó khi bạn sẵn sàng đưa hỗ trợ mobiledevices vào master, trước tiên hãy hợp nhất trong master như trên, sau đó ...

git checkout master
git merge mobiledevicesupport
git push origin master

và đó là nó.

giả định ở đây là Mobilexxx là một nhánh chủ đề với công việc chưa sẵn sàng để đi vào nhánh chính của bạn. Vì vậy, chỉ hợp nhất thành chủ khi hỗ trợ mobiledevices ở một nơi tốt


Điều này nghe có vẻ hợp lý với tôi, tôi đoán tôi không chắc điều này sẽ làm bẩn lịch sử cam kết như thế nào, tôi sẽ cập nhật câu hỏi của mình với một ví dụ về những gì tôi nghĩ sẽ xảy ra.
Ông EZEKIEL

1
Bạn sẽ có khá nhiều "cam kết hợp nhất", về cơ bản là git cố gắng giải quyết sự khác biệt giữa các chi nhánh của bạn. nếu bạn lo lắng về điều đó VÀ bạn là người duy nhất sử dụng chi nhánh thì hãy thực hiện "git rebase master" thay vì "git merge master" VÀ KHÔNG ĐƯA RA CÁC CAM KẾT ĐẾN CHI NHÁNH XÓA. Nếu bạn thực sự thấy mình đang thực hiện nhiều động tác đẩy (git đẩy - lực lượng) để hỗ trợ nguồn gốc / mobiledevices vì ​​bạn sẽ (có thể) luôn gửi cho mình một lịch sử cam kết không khớp với những gì các chi nhánh từ xa có. biết thêm chi tiết tại đây git-scm.com/book/en/Git-Branching-Rebasing
concept47

Tôi tin rằng đây là câu trả lời chính xác, nó nghe giống như những gì tôi muốn. Tôi đã thêm một minh họa ở trên để làm cho nó rõ ràng hơn một chút nhưng nếu những gì bạn đang nói là đúng, thì điều này sẽ diễn ra chính xác như tôi muốn. Cảm ơn bạn.
Ông EZEKIEL

2
Đọc này để hiểu lý do tại sao đây không phải là lời khuyên đặc biệt tốt: kentnguyen.com/development/visualized-git-practices-for-team/ trộm . Điều đó được viết bởi người duy trì Git, vì vậy có lẽ công bằng khi nói anh ấy biết những gì anh ấy nói về chủ đề đặc biệt này.
Dan

2
Điều này nhận được lịch sử cam kết lộn xộn, xem câu trả lời của tôi làm điều đó thông qua rebase.
Yêu tinh

43

Bất cứ khi nào bạn muốn nhận được các thay đổi từ chủ vào nhánh công việc của bạn, hãy làm a git rebase <remote>/master. Nếu có bất kỳ xung đột. giải quyết chúng.

Khi nhánh công việc của bạn đã sẵn sàng, hãy rebase lại và sau đó làm git push <remote> HEAD:master. Điều này sẽ cập nhật nhánh chủ trên remote (repo trung tâm).


3
Những ưu / nhược điểm của việc làm theo cách này thay vì như trong câu trả lời được chấp nhận là gì?
Hampus Ahlgren

33
Sane cho đến khi bạn dành 5 giờ trong địa ngục
nổi loạn

21
Điều này chỉ đúng nếu chi nhánh của bạn nằm trên một kho lưu trữ riêng. Không bao giờ nổi loạn một cái gì đó đã được đẩy lên thượng nguồn. Đây là lý do tại sao: git-scm.com/book/en/v2/ Hãy
Kleag

3
Vấn đề với việc nổi loạn là viết lại lịch sử là các SHA của cam kết bị từ chối bị thay đổi và do đó bạn không thể dựa vào đầu ra của (ví dụ) git branch --contains <commit>.
jnns

13

Cách tiếp cận của Concept47 là cách đúng đắn để làm điều đó, nhưng tôi khuyên bạn nên hợp nhất với tùy chọn --no-ff để giữ cho lịch sử cam kết của bạn rõ ràng.

git checkout develop
git pull --rebase
git checkout NewFeatureBranch
git merge --no-ff master

9

Vâng, tôi đồng ý với cách tiếp cận của bạn. Để hợp nhất hỗ trợ mobiledevices vào master, bạn có thể sử dụng

git checkout master
git pull origin master //Get all latest commits of master branch
git merge mobiledevicesupport

Tương tự, bạn cũng có thể hợp nhất chủ trong hỗ trợ mobiledevices.

Q. Nếu sáp nhập chéo có phải là một vấn đề hay không.

A. Vâng, nó phụ thuộc vào các cam kết được tạo trong nhánh di động * và nhánh chính từ lần cuối chúng được đồng bộ hóa. Lấy ví dụ này: Sau lần đồng bộ hóa cuối cùng, các cam kết sau xảy ra với các nhánh này

Master branch: A -> B -> C [where A,B,C are commits]
Mobile branch: D -> E

Bây giờ, giả sử cam kết B đã thực hiện một số thay đổi đối với tệp a.txt và cam kết D cũng thực hiện một số thay đổi đối với a.txt. Bây giờ chúng ta hãy xem tác động của từng hoạt động sáp nhập,

git checkout master //Switches to master branch
git pull // Get the commits you don't have. May be your fellow workers have made them.
git merge mobiledevicesupport // It will try to add D and E in master branch.

Bây giờ, có hai loại hợp nhất có thể

  1. Hợp nhất chuyển tiếp nhanh
  2. Hợp nhất thực sự (Yêu cầu nỗ lực thủ công)

Đầu tiên Git sẽ cố gắng tạo FF hợp nhất và nếu nó tìm thấy bất kỳ xung đột nào không thể giải quyết được bằng git. Nó không hợp nhất và yêu cầu bạn hợp nhất. Trong trường hợp này, một cam kết mới sẽ xảy ra, chịu trách nhiệm giải quyết xung đột trong a.txt.

Vì vậy, dòng dưới cùng là hợp nhất chéo không phải là một vấn đề và cuối cùng bạn phải làm điều đó và đó là ý nghĩa của việc đồng bộ hóa. Hãy chắc chắn rằng bạn làm bẩn tay trong việc sáp nhập các chi nhánh trước khi làm bất cứ điều gì trong sản xuất.


1
Vì vậy, sáp nhập chéo như thế này không phải là một vấn đề?
Ông EZEKIEL

Hợp nhất chéo là những gì chúng ta nói đồng bộ hóa và không phải là một vấn đề trừ khi các cam kết trong cả hai nhánh không gây ra bất kỳ xung đột nào. Xin vui lòng xem câu trả lời cập nhật của tôi.
sachinjain024

3

Câu trả lời được chấp nhận thông qua git merge sẽ hoàn thành công việc nhưng để lại một dấu hiệu cam kết lộn xộn, cách chính xác là 'rebase' thông qua các bước sau (giả sử bạn muốn giữ nhánh tính năng của mình trong vòng tuần hoàn trước khi bạn thực hiện cú đẩy cuối cùng trước khi PR ).

1 git fetchtừ nhánh tính năng của bạn (đảm bảo nhánh tính năng bạn đang làm việc được cập nhật cho đến ngày)

2 git rebase origin/develop

3 nếu có bất kỳ xung đột nào phát sinh, hãy giải quyết từng cái một

4 sử dụng git rebase --continuemột khi tất cả các xung đột được giải quyết

5 git push --force


1
Điều này vừa khó đọc vừa khó hiểu. Vui lòng cập nhật câu trả lời của bạn và sử dụng đánh dấu mã thích hợp, để tách ý kiến ​​của bạn khỏi các lệnh.
not2qubit

2

Bạn đang suy nghĩ đúng hướng. Hợp nhất chủ với mobiledevices hỗ trợ liên tục và hợp nhất hỗ trợ mobiledevices với master khi hỗ trợ mobiledevices ổn định. Mỗi nhà phát triển sẽ có chi nhánh riêng của mình và có thể hợp nhất với và từ hỗ trợ chính hoặc di động tùy thuộc vào vai trò của họ.

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.