Nếu tôi git checkout phát triển - A, sẽ không phải là cũng gây ra một cuộc xung đột nhập khó chịu trong Tương lai?
Không, không phải bản thân nó sẽ không. Hợp nhất hoạt động bằng cách so sánh từng mẹo với cơ sở hợp nhất và sau đó so sánh hai tập hợp thay đổi. Nếu cả hai nhánh thực hiện các thay đổi tương tự, không có xung đột.
Khác thay đổi, trên một trong hai nhánh, đến hoặc quá gần các đường thay đổi chung trên cả hai nhánh, có thể xuất hiện dưới dạng xung đột. Cách để ngăn chặn những người đó là cho git một cơ sở hợp nhất chính xác bằng cách ghi lại một hợp nhất từ nội dung chung.
# merging master and develop, but there are common changes and
# also changes that conflict only with those common changes.
# supply git's merge with the common changes as part of the base,
# so it will see that it needs to resolve only those other changes
# check out the current merge base
git checkout $(git merge-base master develop)
# make the changes you're merging
git checkout develop -- file_A
git commit -m "cherrypicking file_A as of develop @ $(git rev-parse develop)"
# (for ensuite)
base=$(git rev-parse HEAD)
# record that both branches have those changes
git checkout develop
git merge -s ours $base -m "recording common content from previous cherry-picks"
git checkout master
git merge -s ours $base -m "recording common content from previous cherry-picks"
# and now this merge will get an accurate base:
git merge develop
Bây giờ là: tác dụng duy nhất của những $base
sáp nhập là để ghi lại những nội dung phổ biến như tổ tiên để cả hai lời khuyên chi nhánh, cho việc hợp nhất develop
-master
một căn cứ chính xác từ đó để giải quyết những thay đổi khác.
mới cam kết được lịch sử lại phù hợp với thực tiễn được đưa ra trong một sử dụng rộng rãi successful git branching model.
Nếu, về cách nhóm của bạn diễn giải cam kết, để lại nguồn gốc của nội dung phổ biến đó chỉ được ghi trong văn bản của thư cam kết là thích hợp hơn, git cũng đã được đề cập đến. Thay vì ghi nhận tổ tiên vĩnh viễn, qua kiểm xuất và sáp nhập sau khi chuyển nhượng base
trên, bạn cũng
echo $(git rev-parse master master~) $base > .git/info/grafts
echo $(git rev-parse develop develop~) $base >>.git/info/grafts
git checkout master
git merge develop
# later, whenever you want -- the ancestry above is strictly repo-local
rm .git/info/grafts
Tổ tiên có thể được ghi trong .git/info/grafts
là repo địa phương. Các lệnh hợp nhất của bạn sẽ thấy nó và kết quả sẽ chính xác. Nhược điểm duy nhất cho điều này là vì các cơ sở không thực sự được ghi lại những người khác sẽ có cùng một rắc rối lặp đi lặp lại nó - rất khó trừ khi bạn đang làm criss-cross merges hoặc cũng cherrypicking đến các chi nhánh khác.
Tôi nghĩ rằng bạn có thể tạo 'temp' chi nhánh từ thạc sĩ, cherry-đỉnh cam kết từ 'develop' (hoặc chỉ cần sao chép các tập tin bạn cần), hơn sáp nhập' temp' và' master'. Nhưng tôi không chắc chắn. – gomons
Bạn cũng có thể cân nhắc tạo bản vá mặc dù đó là một kỹ thuật nâng cao hơn. Đây là một hướng dẫn ngắn gọn: http://makandracards.com/makandra/2521-git-how-to-create-and-apply-patches – neontapir