Git fetch la gi
Giới thiệuCó thể nói rằng khi bạn đã là một lập trình viên, dù là newbie hay developer,...chắc chắn bạn đã từng nghe hay thậm chí còn đang sử dụng Git. Vậy Git là gì và tại sao Git hay được nhắc đến trong các bài viết liên quan đến lập trình đến thế? Git có cần thiết cho bạn, lập trình viên thường xuyên tham gia các dự án không? Trong bài viết này, chúng ta sẽ cùng tìm hiểu và trả lời một số câu hỏi về Git để hiểu và mạnh dạn ứng dụng Git khi cần thiết. Show
Mục Lục
Git là một trong những Hệ thống Quản lý Phiên bản Phân tán, được phát triển bởi Linus Torvalds vào năm 2005, vốn được phát triển nhằm quản lý mã nguồn (source code) của Linux. Trên Git, ta có thể lưu trạng thái của file dưới dạng lịch sử cập nhật. Vì thế, có thể đưa file đã chỉnh sửa một lần về trạng thái cũ hay có thể biết được file đã được chỉnh sửa chỗ nào. 1. Thế nào là repository, branch?Repository: Repository (nhà kho) hay được gọi tắt là Repo đơn giản là nơi chứa/cơ sở dữ liệu (database) tất cả những thông tin cần thiết để duy trì và quản lý các sửa đổi và lịch sử của dự án. Tất cả dữ liệu của Repository đều được chứa trong thư mục bạn đang làm việc dưới dạng folder ẩn có tên là .git Repository có hai loại: Remote repository: Là repository để chia sẻ giữa nhiều người và bố trí trên server chuyên dụng. Local repository: Là repository bố trí trên máy của bản thân mình, dành cho một người dùng sử dụng.
Local branch: Là nhánh ở local, tồn tại trên máy local của bạn và tất nhiên chỉ bạn mới có thể nhìn thấy. Local tracking branch: Là một nhánh local để theo dõi các nhánh khác. Điều này để cam kết rằng bạn có thể push lên/pull về các commit các nhánh khác. Remote branch: là branch lưu ở remote. Branch này có thể fetch về local nhưng không tạo thêm branch ở local. Remote tracking branch: là một bản sao cục bộ (local) của một nhánh remote 2. Làm thế nào để xoá một branch ở phía local, làm thế nào để xoá một branch remote?Xóa một branch ở phía local: Cách 1: $ git branch -dCách 2: $ git branch -DCách 3: $ git branch --deletehoặc: $ git branch --delete --forceXóa một branch remote: $ git push --deletehoặc: $ git push3. Làm thế nào để push một branch ở local lên remote dưới một cái tên khác?(Ví dụ như ở local tên branch là task#1, và muốn push lên branch develop ở remote ). Local và remote cùng tên banch: $ git pushVí dụ: Bạn muốn push branch task#1 ở local lên branch task#1 trên remote $ git push origin task#1 Local và remote khác tên branch: $ git push origin Ví dụ: Bạn muốn push branch task#1 ở local lên branch develop trên remote $ git push origin task#1:develop4. Thế nào là git rebase. Phân biệt rebase với mergeThế nào là git rebase? Git rebase là tích hợp các thay đổi từ nhánh này vào nhánh khác. Thực tế, git có hai cách chính để tích hợp các thay đổi từ nhánh này vào nhánh khác: đó là merge và rebase.
Phân biệt rebase với merge git rebase Trước tiên bạn chuyển sang branch đang làm việc $ git checkoutThực hiện tích hợp branch git merge $ git merge5. Thế nào là git fetch. Phân biệt fetch với pullThế nào là git fetch? Khi thực hiện pull, merge nội dung của remote repository sẽ tự động được tiến hành. Tuy nhiên, cũng có trường hợp chỉ đơn giản muốn kiểm tra nội dung của remote repository mà không muốn merge. Những lúc như vậy hãy sử dụng fetch. Phân biệt fetch với pull
Ví dụ bạn muốn fetch từ branch develop remote về banch develop ở local của bạn $ git fetch framgia develop:develop
Ví dụ bạn muốn pull từ branch remote về branch develop ở local của bạn $ git pull framgia develop6. Thế nào là git stash?Git stash được sử dụng khi muốn lưu lại các thay đổi nhưng chưa commit, thường rất hữu dụng khi bạn muốn đổi sang 1 branch khác mà lại đang làm dở ở branch hiện tại. Một số lệnh với stash Xem danh sách stash: $ git stash list [Apply stash gần nhất và xóa stash đó: $ git stash popApply stash: $ git stash apply stash@{Xem nội dung stash: $ git stash show stash@{Xóa stash: $ git stash drop stash@{Xóa toàn bộ stash: $ git stash clearLưu toàn bộ nội dung công việc đang làm dở, sử dụng lệnh: hoặc $ git stash7. Làm thế nào xoá bỏ trạng thái của một vài commit gần đâyCó 2 cách để thực hiện công việc này: Cách 1: Sử dụng git revert $ git revertLệnh này tạo commit đảo ngược commit có commit đã chọn, commit chỉ định bị xoá bỏ, các commit mới hơn vẫn được giữ nguyên. Cách 2: Sử dụng git reset --hard $ git reset --hardLệnh này sẽ xoá toàn bộ các commit trước đó và đưa branch về trạng thái của commit có commit_id đã chọn. 8. Làm thế nào để gộp một vài commit thành 1 commit duy nhất?Để gộp nhiều commit thành 1 commit duy nhất, ta có thể sử dụng câu lệnh: $ git rebase -ihoặc $ git rebase -i HEAD~9. Phân biệt git reset, git reset --hard, git reset --softGit reset $ git resetDi chuyển con trỏ về vị trí commit reset và vẫn giữ nguyên tất cả các thay đổi của file, nhưng loại bỏ các thay đổi khỏi stage. Git reset --hard $ git reset --hardKhi dùng --hard, commit sẽ được bỏ đi và bỏ cả những thay đổi chưa được commit trong working space. Khi này môi trường sẽ hoàn toàn "sạch sẽ" như thời điểm trước khi commit. Git reset --soft $ git reset --softKhi dùng --soft, commit sẽ được bỏ đi nhưng giữ nguyên những thay đổi chưa được commit trong working space. Lệnh này hữu dụng khi bạn muốn giữ lại những thay đổi chưa commit cho lần commit tiếp theo. 10 . Thế nào là cherry-pick, khi nào thì dùng cherry-pickGiả sử bạn có 2 branches khác nhau cho 2 khách hàng khác nhau, tạm gọi là branch A và branch B. Và bạn đang fix một bug nghiêm trọng cùng tồn tại trên hệ thống của cả 2 khách hàng, bạn muốn chỉ commit một lần nhưng có thể apply vào luôn cả 2 branches. Bạn có thể dùng lệnh cherry-pick của Git để giải quyết, như sau:
cherry-pick sẽ lấy commit cuối cùng ở branch A merge vào branch B. Ngoài ra, bạn còn có thể chỉ định danh sách các commit cần "bốc" từ A để "bỏ" vào B nếu cần thiết. 11. Git Flow) Git Flow là một tập các thao tác mở rộng của git nhằm cung cấp các thao tác repository (kho mã nguồn) ở mức cao dựa trên mô hình phân nhánh của Vincent Driessen.
Môi trường:
Khởi tạo: Sau khi di chuyển tới thư mục dự án, chạy lệnh sau để khởi tạo git-flow. $ git flow initBạn sẽ cần trả lời một số câu hỏi cho việc thiết lập git-flow sau câu lệnh khởi tạo. Chúng tôi khuyên bạn nên sử dụng các giá trị [mặc định]. Các tính năng: Bắt đầu một tính năng Phát triển tính năng mới bắt đầu từ nhánh phát triển 'develop'. Ví dụ với tính năng MYFEATURE: $ git flow feature start MYFEATURELệnh này sẽ tạo ra một nhánh mới dựa trên nhánh 'develop' và chuyển sang nhánh mới này. Kết thúc một tính năng Sau khi phát triển xong một tính năng, lệnh kết thúc tính năng sẽ thực hiện các thao tác:
Công bố tính năng Khi bạn làm việc với những người khác trên cùng một tính năng, bạn sẽ cần công bố phần mã nguồn của bạn cho tính năng đó lên remote để những người khác có thể cập nhập được. $ git flow feature publish MYFEATURELấy về tính năng Pull mã nguồn của tính năng được cập nhập bởi những thành viên khác. $ git flow feature pull REMOTE_NAME MYFEATURETạo một bản release
Bắt đầu release Để bắt đầu release, sử dụng lệnh release của git flow. Lệnh này sẽ tạo ra nhánh 'release' từ nhánh 'develop'. $ git flow release start RELEASE [BASE]Tùy chọn [BASE] cho phép commit được một giá trị hash sha-1. Trường hợp không chỉ định tùy chọn này thì HEAD sẽ được sử dụng. Để công bố phần code 'release' của mình cho các thành viên khác, ta có thể làm tương tự như với công bố tính năng bằng lệnh sau: $ git flow release publish RELEASEBạn có thể theo dấu remote 'release' bằng lệnh git flow release track RELEASEKết thúc release
Sửa đổi nóng - hotfix Bắt đầu hotfix Giống như các lệnh khác của git flow, hotfix bắt đầu với: $ git flow hotfix start VERSION [BASENAME]Tham số VERSION ở đây chỉ định tên của phiên bản release hotfix này. Còn tham số tùy chọn basename sẽ chỉ định tên nhánh cơ bản thay cho hotfix thay vì nhánh 'master' Kết thúc hotfix Kết thúc hotfix sẽ merge lại nội dung thay đổi vào nhánh 'develop' và 'master'. Ở nhánh 'master' sẽ được gắn tag là phiên bản của hotfix. $ git flow hotfix finish VERSIONTổng hợp các lệnh Kết luậnQua bài viết chắc hẳn mọi người cũng phần nào hiểu thêm về git, và sẵn sàng dùng nó cho công việc của mình. Hy vọng bài viết mang lại cho mọi người nhiều kiến thức, cũng như kinh nghiệm bổ ích cho lập trình viên. |