Nếu bạn đang sử dụng dạng branch
lệnh này (với điểm bắt đầu), không quan trọng bạn HEAD
đang ở đâu .
Bạn đang làm gì:
git checkout dev
git branch test 07aeec983bfc17c25f0b0a7c1d47da8e35df7af8
Đầu tiên, bạn đặt của bạn HEAD
vào chi nhánh dev
,
Thứ hai, bạn bắt đầu một nhánh mới trên cam kết 07aeec98
. Không có bb.txt tại cam kết này (theo repo github của bạn).
Nếu bạn muốn bắt đầu một chi nhánh mới tại vị trí bạn vừa kiểm tra, bạn có thể chạy chi nhánh không có điểm bắt đầu:
git branch test
hoặc như người khác đã trả lời, phân nhánh và thanh toán ở đó trong một thao tác:
git checkout -b test
Tôi nghĩ rằng bạn có thể bị nhầm lẫn bởi thực tế đó 07aeec98
là một phần của nhánh dev
. Đúng là cam kết này là tổ tiên của dev
, các thay đổi của nó là cần thiết để đạt được cam kết mới nhất trong dev
. Tuy nhiên, chúng là những cam kết khác cần thiết để đạt được điều mới nhất dev
và những cam kết này không nhất thiết phải có trong lịch sử của 07aeec98
.
8480e8ae
(nơi bạn đã thêm bb.txt) chẳng hạn như không có trong lịch sử của 07aeec98
. Nếu bạn phân nhánh từ 07aeec98
, bạn sẽ không nhận được các thay đổi được giới thiệu bởi 8480e8ae
.
Nói cách khác: nếu bạn hợp nhất nhánh A và nhánh B thành nhánh C, sau đó tạo một nhánh mới trên cam kết của A, bạn sẽ không nhận được những thay đổi được giới thiệu trong B.
Tương tự ở đây, bạn có hai nhánh master và dev song song, bạn đã hợp nhất trong dev. Việc phân nhánh từ một cam kết chính (cũ hơn so với hợp nhất) sẽ không cung cấp cho bạn những thay đổi của nhà phát triển.
Nếu bạn muốn tích hợp vĩnh viễn các thay đổi mới từ chính vào các nhánh tính năng của mình, bạn nên hợp nhấtmaster
vào chúng và tiếp tục. Tuy nhiên, điều này sẽ tạo ra các cam kết hợp nhất trong các nhánh tính năng của bạn.
Nếu bạn chưa xuất bản các nhánh tính năng của mình, bạn cũng có thể căn cứ lại chúng trên bản chính được cập nhật: git rebase master featureA
. Hãy chuẩn bị để giải quyết những xung đột có thể xảy ra.
Nếu bạn muốn một quy trình làm việc trong đó bạn có thể làm việc trên các nhánh tính năng mà không có cam kết hợp nhất và vẫn tích hợp với các thay đổi mới hơn trong tổng thể, tôi khuyên bạn nên làm như sau:
- dựa trên mọi nhánh tính năng mới dựa trên cam kết chính
- tạo một
dev
nhánh trên một cam kết chính
- khi bạn cần xem nhánh tính năng của mình tích hợp như thế nào với những thay đổi mới trong cái chính, hãy hợp nhất cả nhánh cái và nhánh tính năng vào
dev
.
Không cam kết dev
trực tiếp, chỉ sử dụng nó để hợp nhất các chi nhánh khác.
Ví dụ: nếu bạn đang làm việc trên tính năng A và B:
a---b---c---d---e---f---g -master
\ \
\ \-x -featureB
\
\-j---k -featureA
Hợp nhất các nhánh thành một dev
nhánh để kiểm tra xem chúng có hoạt động tốt với cái chính mới hay không:
a---b---c---d---e---f---g -master
\ \ \
\ \ \--x'---k' -dev
\ \ / /
\ \-x---------- / -featureB
\ /
\-j---k--------------- -featureA
Bạn có thể tiếp tục làm việc trên các nhánh tính năng của mình và tiếp tục hợp nhất các thay đổi mới từ cả nhánh chính và nhánh tính năng thành dev
thường xuyên.
a---b---c---d---e---f---g---h---i----- -master
\ \ \ \
\ \ \--x'---k'---i'---l' -dev
\ \ / / /
\ \-x---------- / / -featureB
\ / /
\-j---k-----------------l------ -featureA
Khi đã đến lúc tích hợp các tính năng mới, hãy hợp nhất các nhánh tính năng (không phải dev
!) Thành chính.