Tìm hiểu có mang về phân nhánh (branch) cùng gộp nhánh (merge, rebase) vào Git, chuyển nhánh làm cho việc, con trỏ HEAD và những lệnh quản lý nhánh
Mục lục Git - GitHub
Khái niệm về nhánh branch và con trỏ HEAD
Trong Git nhánh branch là hướng rẽ trở nên tân tiến code, mới mục tiêu không có tác dụng rối hướng cách tân và phát triển chính, kế tiếp một nhánh rất có thể tích hòa hợp nhập vào nhánh chính. Nói bình thường trong Git luôn thao tác làm việc với những nhánh, mang định khi nào cũng gồm một nhánh chính tên là master
Nhánh thiết yếu master
1 Khởi tạo dự án với 3 commit
Giả sử các bạn khởi tạo ra một Local Repo bắt đầu (Lưu nghỉ ngơi thư mục c:localmyproject), thời điểm đó mang định sẽ thao tác làm việc trên nhánh chính có tên master, tiến hành sửa thay đổi với 3 commit thì như vẫn biết các lần commit thì Git lưu lại dữ liệu là một trong những snapshot (ảnh chụp). Tác dụng là nhánh master tất cả 3 snapshot (ký hiệu là C0, C1, C2 như hình mặt và đoạn lệnh git đưới

$ git init #khởi tạo nên Repo$ cảm biến 0.txt #Tạo một file mới trong thư mục làm việc$ git địa chỉ . #đưa vào stage$ git commit -m"C0" #commit$ touch 1.txt$ git địa chỉ cửa hàng .$ git commit -m"C1"$ cảm ứng 2.txt$ git địa chỉ .$ git commit -m"C2"2 Lịch sử commit
Xem lại lịch sử vẻ vang commit: nó cho thấy thêm đang thao tác làm việc trên nhánh mang tên master, cùng đang ở phần commit cuối cùng với mã hash là 0d7ae45 C2
$ git log --pretty=oneline0d7ae45f93922e40c2c8dfdd14721e77476f6d01 (HEAD -> master) C2927163bd31669a7651621e91982afbdf6f30cc1f C1efab635085727cefd2b0271e7b72b9fd37a62614 C0Ví trí bây giờ bạn đang thao tác ở nhánh nào, làm việc commit cuối nào thể hiện bởi một bé trỏ có tên là HEAD
3 Xem danh sách các nhánh - branch
$ git branch* masterCó một nhánh là master, cam kết hiệu * cho thấy đây là nhánh hiện nay tại
Các Video: sử dụng Git, GitHub
Tạo nhánh mới, gửi nhánh làm cho việc
4 Tạo một nhánh mới
Giờ đã ở nhánh master nhỏ trỏ HEAD vẫn thấy ở commit C2, nếu muốn tại đây tất cả một nhánh bắt đầu tên alpha gõ lệnh sau:
$ git branch alpha Nhánh mang tên alpha đã được tạo, gõ lệnh git branch đang thấy Repo gồm 2 nhánh master cùng alpha nhưng con trỏ HEAD vẫn cho biết làm vấn đề ở nhánh master. Nhánh alpha bắt đầu từ commit C2 (kế quá master từ bỏ C2 trở về trước), hình biểu diễn đạt như hình bên

5 Chuyển nhánh làm việc mới
Giờ chuyển sang thao tác trên cấp tốc alpha thì gõ lệnh như sau
$ git checkout alpha Cả master và alpha hiện tại đang trỏ mang lại commit C2 nhưng bé trỏ HEAD cho thấy thêm đang làm việc với nhánh alpha, coi hình bên, hoàn toàn có thể dùng lệnh git branch kiểm tra

5 Thực hiện nay commit bên trên nhánh mới
Đang trên nhánh alpha thực hiện đổi khác và commit
$ cảm ứng 3.txt #Tạo một file new trong thư mục làm cho việc$ git showroom . #đưa vào stage$ git commit -m"C4" #commit6 Xem lại lịch sử commit của nhánh alpha
git log --pretty=onelinec7d81e3771b61c97c1b6e661acdb9b25ec9cb199 (HEAD -> alpha) C30d7ae45f93922e40c2c8dfdd14721e77476f6d01 (master) C2927163bd31669a7651621e91982afbdf6f30cc1f C1efab635085727cefd2b0271e7b72b9fd37a62614 C0Thấy nhánh alpha bao gồm một commit C4, và kế thừa những commit cũ của master ban đầu từ C2.
Bạn đang xem: Tạo nhánh mới trong git

Nhìn hình trên thấy nhánh master dừng lại ở commit cuối C2, với các commit cũ rộng C1, C0. Nhánh đang thao tác làm việc là alpha bao gồm một commit bắt đầu là C3, và những commit cũ kế thưa trường đoản cú nhánh cha master C2, C1, C0
7 Tiếp tục chế tạo sự đổi khác và commit trên nhánh alpha
$ echo "Update new nội dung to file" > 1.txt #thêm nội dung new vào file 1.txt$ git add .$ git commit -m"C4"

8 Chuyển về thao tác với nhánh master
git checkout masterTrong thư mục thao tác làm việc đã quay về trạng thái sinh hoạt commit cuối của nhánh master: 0.txt, 1.txt, 2.txt còn tệp tin 1.txt chưa update nội dung gì. Con trỏ HEAD tiếng cũng trỏ vào nhánh master

9 Tạo sự thay đổi và commit mang lại nhánh master
$ touch 4.txt$ echo "Update code" > 0.txt$ git showroom .$ git commit -m"C5"Trạng thái bây giờ như hình dưới, dùng lệnh git log nhằm xem lịch sử vẻ vang commit bên trên master

10 Tiếp tục tạo nên nhánh mới rẽ tự master
Hiện giờ đang đứng ở master và phát triển code theo kế hoạch, dẫu vậy code vào master yêu cầu sửa và đánh giá ngay, với ước ao muốn quá trình sửa thay đổi code và kiểm lỗi không có tác dụng rối các dòng code đang làm cho với master hoàn toàn có thể tạo ra tức thì một nhánh bắt đầu đặt thương hiệu sualoigap, ngay sau đó chuyển sang nhánh sualoigap để gia công việc
$ git branch sualoigap #tạo nhánh$ git checkout sualoigap #chuyển nhánhGiờ đang thao tác làm việc trên nhánh sualoigap (con trỏ HEAD), các snapshot và những nhánh trên toàn bộ Repo như hình: master cùng sualoigap đang cùng trỏ mang đến commit C5

11 Tạo sự thay đổi và commit trên nhánh sualoigap
$ echo "Sua loi tren 2.txt" > 2.txt$ git showroom .$ git commit -m"C6"12 Xem lại lịch sử dân tộc commit sualoigap
$ git log --pretty=onelineeda207ba7b5a02f3687eb0c71f08b627ce98a7ca (HEAD -> sualoigap) C62c3fa4d3fe0035844314c232324afca9ffc1a288 (master) C50d7ae45f93922e40c2c8dfdd14721e77476f6d01 C2927163bd31669a7651621e91982afbdf6f30cc1f C1efab635085727cefd2b0271e7b72b9fd37a62614 C0Nhìn vào thấy nhánh sualoigap thừa kế master kể từ C5, và bao gồm thêm một commit C6, hình ảnh các snapshot bên trên Repo bây giờ như sau:

Tương tự rất có thể thực hiện nay thêm các commit bên trên sualoigap thì về logic trên Repo tương tự, ví dụ cho thêm commit nữa
$ echo "Sua loi tren 1.txt" > 1.txt$ git địa chỉ cửa hàng .$ git commit -m"C7"Giờ con trỏ HEAD cho thấy thêm đang ở commit C7 bên trên nhánh sualoigap

Branch Merge
13 Trộn nhánh sualoigap vào nhánh master
Khi đã dứt nhiệm vụ trên nhánh sualoigap nếu như muốn các hiệu quả của nhánh này tích hợp thay đổi vào master thì triển khai gộp 2 nhánh lại call là merge. Để thao tác làm việc đó bắt buộc chuyển về thao tác làm việc trên nhánh master bằng lệnh checkout rồi mang lại nhánh sualoigap gộp vào master bởi lệnh merge:
$ git checkout master #tạo nhánh$ git merge sualoigap #hợp nhấtHiện giờ sẽ đứng nghỉ ngơi master và nhánh sualoigap đang gộp vào master, và cả 2 nhánh những đang trỏ vào commit C7, hình hình ảnh snapshot như dưới

Xóa nhánh
14 xóa nhánh sualoigap
Khi nhánh sualoigap đã gộp vào master, nếu không thể nhu cầu thao tác làm việc trên nhánh này thì rất có thể xóa nó đi như sau:
$ git branch -d sualoigap$ git branch alpha* masterĐã xóa, lệnh git branch liệt kê chỉ còn hai nhánh alpha với master với đang thao tác trên master. Xem xét lại log master thấy như sau:
$ git log --pretty=oneline89b19cb2a226bf609bb8330dc1e2312f76bffd0e (HEAD -> master) C7eda207ba7b5a02f3687eb0c71f08b627ce98a7ca C62c3fa4d3fe0035844314c232324afca9ffc1a288 C50d7ae45f93922e40c2c8dfdd14721e77476f6d01 C2927163bd31669a7651621e91982afbdf6f30cc1f C1efab635085727cefd2b0271e7b72b9fd37a62614 C0Vậy nhánh master có những snapshot C0, C1, C2, C5, C6, C7 với hình hình ảnh snapshot trên Repo lúc này như sau

Xử lý xung bỗng nhiên khi gộp nhánh
Bây giờ mang sử có nhu cầu gộp code tại nhánh alpha vào nhánh master, trường thích hợp này không dễ dàng như biện pháp gộp nhánh sualoigap sống trên. Do cả hai nhánh có khá nhiều commit kể từ thời điểm rẽ nhánh nên những khi gộp nó sẽ chăm chú sự thay đổi trên cả hai nhánh tại ba điểm (three-way), thời khắc commit cuối của các nhánh và thời khắc rẽ nhánh, kia là các commit cùng với snapshot C2, C4, C7 như hình dưới:

Như hình phía trên, Repo có 2 nhánh, điểm rẽ là nghỉ ngơi snapshot C2 (có mã hash: 0d7ae45), nghĩa là sinh hoạt thời đặc điểm này master và alpha giống nhau, hãy trở về thời gian snapshot C2 bằng lệnh git checkout
$ git checkout 0d7ae45f #0d7ae45f là hash của commit C2HEAD is now at 0d7ae45 C2Mở thư mục thao tác làm việc ra, thì bây giờ đang có những file: 0.txt, 1.txt, 2.text với văn bản trống bên trong.
Kiểm tra nhánh alpha ngơi nghỉ commit cuối với snapshot C4:
$ git checkout alphaMở thư mục làm việc ra ta thấy bây giờ có các file: 0.txt, 1.txt, 2.txt, 3.txt file 1.txt có nội dung Update new nội dung to tệp tin còn những file khác rỗng.
Xem thêm: Đề Cương Ôn Tập Tiếng Anh Lớp 6 Học Kì 2 Môn Tiếng Anh Lớp 6 Năm 2020
Kiểm tra nhánh master sinh hoạt commit cuối cùng với snapshot C7:
$ git checkout masterMở thư mục làm việc ra ta thấy lúc này có những file: 0.txt, 1.txt, 2.txt, 4.txt tệp tin 0.txt gồm nội dung Update code, file 1.txt có nội dung Sua loi tren 1.txt, 2.txt gồm nội dung Sua loi tren 2.txt còn tệp tin 4.txt rỗng
Tổng kết lại có bảng sau, bảng này là kết quả so sánh nhánh với thời điểm snapshot C2, phần đa ô gồm nền xanh là phiên bản giữ lại sau khoản thời gian merge, mọi ô màu đỏ là triệu chứng xung đội nếu merge
0.txt | có sửa đổi: Update code | không sửa đổi | không xung đột: mang theo phiên bản tại master (vì sửa đổi tại đây) |
1.txt | có sửa đổi: Sua loi tren 1.txt | có sửa đổi: Update new content to file | xung tự dưng vì đắn đo lấy bạn dạng sửa thay đổi nào: tại master xuất xắc alpha |
2.txt | có sửa đổi: Sua loi tren 2.txt | không sửa đổi | không xung đột: lấy theo phiên bản master |
3.txt | không sửa đổi | có sửa đổi: tạo new file | không xung đột: lấy theo bản alpha (vì tạo ra file mới tại đây) |
4.txt | sửa đổi: tạo mới file | không sửa đổi | không xung đột: lấy bạn dạng master |
Bảng so sánh trên cho biết thêm sẽ có một xung đột xẩy ra nếu gộp nhánh alpha vào master, đó đó là nội dung của tệp tin 1.txt, Git băn khoăn là giữ lại lại phiên bản nào. Ở triệu chứng này rất cần được xử lý những xung đột sau khi merge
15 gộp nhánh alpha vào master
$ git checkout master$ git merge alpha #gộp nhánhAuto-merging 1.txtCONFLICT (content): Merge conflict in 1.txtAutomatic merge failed; fix conflicts and then commit the result.Dòng thông báo cho thấy vẫn đang trong quá trình merge, nhưng gồm một xung bất chợt về câu chữ trong file 1.txt chờ chúng ta xử lý nó. Không phải như trường hợp không có xung hốt nhiên nào, trường phù hợp này khi gộp (merge) Git không tự động hóa tạo ra commit mới và nó tạm dừng để chúng ta xử lý từng file có xung bất chợt và tạo nên ta 1 commit sau khoản thời gian xử lý không còn xung đột.
Xem lại trạng thái
git statusOn branch masterYou have unmerged paths. (fix conflicts & run "git commit") (use "git merge --abort" to lớn abort the merge)Changes to lớn be committed: new file: 3.txtUnmerged paths: (use "git địa chỉ cửa hàng ..." to mark resolution) both modified: 1.txtNó đã cho thấy có tệp tin 3.txt sinh hoạt sẵn trong stage đa số 1.txt không được merge
16 xử trí xung bất chợt khi gộp nhánh
Có bao nhiêu file xung chợt thì xuất hiện để quyết định lấy nội dung nào trong tệp tin đó. Ở phía trên file xung hốt nhiên là 1.txt, mở ra thấy văn bản như sau:
Update new content to fileSau khi cách xử lý hết các xung bỗng trong từng file bằng cách như vậy, thì thực hiện đưa file vào stage và tạo ra một commit để kết thúc việc gộp nhánh
$ git add .$ git commit -m"C8"Xem lại lịch sử vẻ vang commit trên nhánh master cùng alpha bởi lệnh:
$ git checkout alpha$ git log --onelinebbc3757 (HEAD -> alpha) C4c7d81e3 C30d7ae45 C2927163b C1efab635 C0$ git checkout master$ git log --onelinea252058 (HEAD -> master) C889b19cb C7eda207b C62c3fa4d C5bbc3757 (alpha) C4c7d81e3 C30d7ae45 C2927163b C1efab635 C0Từ đó dựng lên các hình ảnh snapshot trên Repo

16 xử trí xung bỗng với mergetool
Ngoài biện pháp mở từng file để quyết định giữ câu chữ nào, thì Git gồm sẵn một quy định trực quan để triển khai nhanh hơn. Chúng ta chỉ vấn đề gõ lệnh
$ git mergetoolMột giao diện đồ họa mở những file xung tự dưng xuất hiện, hãy sửa từng file. Khi sẽ trong đồ họa đó ao ước giữ câu chữ từ local (master) thì gõ :diffg LO, ao ước giữ ngôn từ từ remote (alpha) :diffg RE, tiếp nối thoát mergetool gõ lệnh :wqa. Sau thời điểm thoát thì chúng ta đã chuẩn bị sẵn sàng để commit

Trộn gộp nhánh Rebase
Ta đã thực hiện tạo ra một nhánh mới, tiếp nối gộp lại nhưng tất cả dùng đến một số loại lệnh git rebase
17 chế tác nhánh bắt đầu từ 1 thời điểm trong kế hoạch sư commit
Ở nhánh master gõ lệnh sau rước một phiên bản sao thời điểm snapshot C5 (có mã hash: 2c3fa4d)
$ git checkout 2c3fa4dYou are in "detached HEAD" ...HEAD is now at 2c3fa4d C5Dòng thông tin HEAD is now at 2c3fa4d C5 cho thấy con trỏ HEAD bị bóc tách khỏi tất cả các nhánh hiện bao gồm và nó ở phần một nhánh tạm thời phát sinh ra mang tên là 2c3fa4d từ thời đặc điểm này bạn đang thao tác trên nhánh trong thời điểm tạm thời đó, còn nếu như không tạo nhánh mới tại đây thì nhánh tạm thời và các commit trên nó sẽ mất khi gửi nhánh. Giờ đồng hồ ta sẽ tạo nên ra nhánh mới với tên là beta với câu lệnh:
$ git checkout -b beta #Tạo nhánh mới$ git branch #Danh sách các nhánh alpha* beta masterTa đã bao gồm nhánh mới beta thư mục thao tác làm việc có câu chữ như commit cuối C5
18 tạo ra sự chuyển đổi thực hiện nay 2 commit bên trên beta
$ touch 5.txt #Tạo một file bắt đầu trong thư mục làm việc$ git add .$ git commit -m"C9" #commit$ echo "Modify from Beta" > 2.txt #thay ngôn từ file 2.txt vẫn có$ git showroom .$ git commit -m"C10" #commitXem lại lịch sử dân tộc commit
$ git log --oneline9e101b7 (HEAD -> beta) C10d391bde C92c3fa4d C50d7ae45 C2927163b C1efab635 C0

Có thể gộp nhánh beta vào master bởi merge sống trên, nếu như vậy nó sẽ tạo nên ra một commit như là điểm gộp nhánh bằng cách kết thích hợp C10, C8 có đối chiếu với C5 (three-way). Tuy nhiên đôi khi bạn có nhu cầu việc gộp kia lại tiến hành theo cách cập nhật những gì biến đổi trên C10 của beta vào C8 của master nhưng mà không phải tạo nên một commit - snapshot nối tiếp, để làm điều kia thì dùng đến rebase
Với rebase thì gần như commit trên nhánh này sẽ có trong một nhánh khác. Lấy ví dụ chạy lệnh reabase để các thứ trong master áp dụng vào beta:
$ git checkout beta$ git rebase masterQuá trình rebase rất có thể tạm giới hạn do hoàn toàn có thể có xung bất chợt phiên bản, chúng ta xử lý như trên, mở file gồm xung đột ra sửa gìn giữ nội dung nào, sửa dứt gõ lệnh sau để liên tiếp rebase
$ git địa chỉ .$ git rebase --continueNếu rebase đang tạm dừng để chờ xử trí xung đột, hoàn toàn có thể gõ lệnh git rebase --abort nhằm hủy, phục sinh lại tâm trạng khi không gõ lệnh rebase
Xem lại lịch sử commit sau thời điểm rebase
$ git checkout beta$ git log --oneline544511a (HEAD -> beta) C10be103d9 C91a90428 (master) C889b19cb C7eda207b C62c3fa4d C5bbc3757 (alpha) C4c7d81e3 C30d7ae45 C2927163b C1efab635 C0

$ git checkout master$ git merge beta$ git log --oneline544511a (HEAD -> master, beta) C10be103d9 C91a90428 C889b19cb C7eda207b C62c3fa4d C5bbc3757 (alpha) C4c7d81e3 C30d7ae45 C2927163b C1efab635 C0

Vài lệnh làm chủ nhánh
$ git branch #Liệt kê những nhánh$ git branch -v #Liệt kê nhánh + commit cuối$ git branch --merged #Các nhánh merge với nhánh hiện nay tại$ git branch --no-merged #Các nhánh không merge cùng với nhánh hiện tại tại$ git branch -d branchname #xóa nhánh
Xóa commit cũ, viết lại lịch sử commit
Nếu cần thay đổi N commit cuối cùng, gồm là xóa, ghi đè ... Thì sử dụng lệnhgit rebase -i HEAD~NTrong list commit có thể chọn các tùy chỉnh thiết lập như sau rồi giữ gìn để thực hiện
p hay pick thì commit đó lưu lại s tuyệt squash thì sẽ áp dụng nội dung commit này mà lại đè vào commit phía đằng trước r giỏi reword sẽ giữ lại được lại commit nhưng cho phép viết lại nội dung thông điệpCập nhật lên Remote
git push origin +masterRemote đã xóa một commit cũ nào đó, ước ao local cập nhật theo