Giới thiệu GIT
So sánh sự khác nhau giữa GIT và SVN (subversion)
– Centralize (SVN): 1 server lưu trữ các thông tin
– Distribute (GIT): Cơ chế P2P
Các trạng thái khi làm việc với GIT
– Working directory
– Git Index/ Staging Storage: sau khi thực hiện câu lệnh git add, git rm…, code sẽ được lưu
trong staging storage.
– Repository: sau khi thực hiện câu lệnh git commit, code sẽ được lưu trong repository.
Cách GIT lưu trữ
Trong một project làm việc với GIT, chỉ có 1 folder git: “.git” tại thư mục gốc của repository.
Basic work: hầu hết thực hiện trên local, không cần internet
Login to GIT
Chọn project bên tay phải (Có dạng groupname/repositoryname)
Ví dụ ở đây group name là Telema và repository name là Android
Màn hình quản lý nội dung trong repository hiện ra, muốn clone về máy thì chép đường dẫn
của project và thêm đuôi .git vào, như ở trên sẽ là https://10.88.17.102/telema/android.git
Git ở đây sẽ dùng HTTPS để giao tiếp thay vì SSH
Ta có thể dùng command line để sử dụng GIT nhưng ở đây để cho trực quan ta dùng 1 tool
của Atlassian là SourceTree cho phép thao tác với GIT, available cho Windows và Mac
Sau khi đã cài đặt xong SourceTree, chọn Clone/New và nhập một số thông tin như Source
Path (Remote repository) – chính là repository mà ta đã thấy trên GIT web tool:
https://10.88.17.102/telema/android.git và Destination Path (Local repository) – là repository
mà ta sẽ làm việc trên máy
Login bằng của account vào, tùy loại account mà sẽ có quyền hạn khác nhau (Administrator,
Master, Developer, Reporter…)
Chọn remember password để lưu lại cho những lần sau (Vì mỗi lần thực hiện 1 thao tác với
remote repository thì phải sử dụng account, ví dụ pull, push…)
Muốn đổi lại account đã lưu thì vào Tools > Options > Authentication
Việc sử dụng account nào để thao tác với GIT là khung Default User Names
Ví dụ trong khung Saved Passwords đang lưu 2 account:
- luongtest1: account này là account với quyền developer, có quyền push code lên 1 branch
đang open, tạo ra 1 request yêu cầu merge code từ branch vào master.
- luongtest: account này là account với quyền master, có quyền push code lên 1 branch đã
được đánh dấu protected), có quyền accept request merge code từ luongtest1, và ….
Sau khi clone, mặc định việc clone sẽ lấy dữ liệu từ branch master (là branch mặc định, là
main branch của 1 repository), ở khung “Branches” sẽ liệt kê branch mà ta đang có tại máy
local là master, và khung “Remotes” (được ký hiệu bởi từ origin – đây là tên remote
repository được đặt mặc định lúc clone – tốt nhất là để tên này không nên thay đổi) sẽ liệt kê
các branch hiện có trên server, lưu ý thực ra trên server lúc này chỉ có branch master, còn
HEAD là tự động để hiển thị revision mới nhất mà thôi.
Ngoài ra ta nên để ý branch mà ta hiện đang làm việc, khung bên trái sẽ cho biết điều đó,
trong trường hợp này là HotFix.
Giả sử ta thay đổi 1 file trong branch master (file này nằm trong diện tracked, chứ không phải
untracked – cấu hình trong file git ignore), ngay lập tức SourceTree sẽ phát hiện ra sự thay
đổi và hiện ra 1 dòng Uncommited changes, ta cần phải check cho file này là Staged files và
commit nó (Khái niệm commit ở đây không giống bên SVN là commit trực tiếp lên remote
repository, mà chỉ đơn giản là commit vào local repository trên máy, vì GIT có local
repository còn SVN thì không) vào local repository.
Khung liệt kê những file đã bị thay đổi và chi tiết nội dung thay đổi bên trong file
Ở tab File status ta sẽ điền vào mục message ghi nội dung commit, sau đó commit thì file
này sẽ được commit vào local repository.
Có một mục chọn là Push change immediately… mục này sẽ thực hiện 2 thao tác, sẽ
“commit” file changes vào local repository như trên, và sau đó thực hiện “push” file này lên
remote repository trên server luôn.
Nếu ta không chọn mục Push change immediately… thì sau khi commit vào local repository,
ta phải push lên remote repository hoặc để đó, tiếp tục change file, commit local…. Đến một
lúc nào đó push lên remote cũng được.
Chọn local branch sẽ push và remote branch sẽ được push.
Mỗi lần commit, GIT sẽ quản lý sự thay đổi theo mã băm SHA-1 chứ không phải revision
bằng số như SVN, và để phân biệt lượt commit này là lượt commit sau của lần commit khác
sẽ có thuộc tính “parents”
Phần label nêu ra rõ lượt commit này đã available trên những branch nào, ví dụ HEAD nghĩa
là lượt commit mới nhất, origin/master là đã có trên branch master của remote repository,
master là đã có trên branch master của local repository
Quay trở lại GIT web tool, bấm vào tab Commits, ta sẽ thấy những lượt commit trên remote
repository (Nếu chỉ commit trên local repository thì sẽ không thể thấy ở đây).
Nếu muốn tạo ra 1 branch mới (thường tạo branch khi ta bắt đầu implement một function
mới, fix bug, …. Để sau đó merge lại vào master để tạo ra một bản hoàn chỉnh), vào tab
Branches trong tab hiện tại Commits
Đặt tên branch, và có thể chỉ định ra nó được tạo từ “Base” nào, ví dụ ở đây tạo từ base là
master thì khi branch này mới tạo ra, nó sẽ có content giống content hiện tại của master
Xem nội dung commit bằng cách chọn branch tương ứng
Giống như SVN, GIT cũng cho phép tạo ra các tags để đánh dấu một mốc đáng chú ý
Hoặc tạo tags bằng tool, nhưng sau đó phải push tag này lên remote repository thì mới có
trên remote – GIT web tool (do lúc này nó chỉ có ở local)
Trên web tool, để compare 2 branch với nhau, mặc định chế độ view là Inline Diff
Hoặc chọn cách tạo ra 2 bên như SVN bằng tách bấm tab Side-by-side Diff
Khi 2 branch này có sự khác nhau, GIT web tool cung cấp mục Make a merge request để tạo
ra 1 request nhằm merge code từ 2 branch này lại để cho thống nhất với nhau
Điền những mục tương ứng, Phần “From…” into là để chỉ code từ branch nào sẽ được merge
vào branch nào, ở đay là HotFix sẽ được merge vào master
Hãy nhớ chỉ định người có thẩm quyền để merge (thường là user với permission là master)
Khi request đã được tạo ra, ai cũng có thể vào để discuss về việc merge này có ổn hay
không
Có thể comment trên một đoạn code merge bất kỳ, để người khác có thể theo dõi và sửa
đổi, rút kinh nghiệm.
Người được assign việc merge sẽ có nút Accept merge request (Nếu không xảy ra Conflict –
Đối với GIT conflict là xảy ra khi 2 branch cùng edit trên một line of code chứ không phải trên
cùng 1 file như SVN, ở đây do 2 branch không edit trên cùng 1 line nên không conflict, và GIT
sẽ cho nút Accept như trên)
Và sau khi accept
Sau khi merge code xong, ta có thể remove branch Hot fix đi hoặc set permission cho nó là
protected, developer sẽ không thể push code lên branch này được nữa, chỉ ở dạng readonly – chỉnh trong Project Settings > Protected branches
Sau khi merge code vào master trên remote (tên đầy đủ là origin/master trên SourceTree
tool) thì chắc chắn lúc này master trên local đã bị lỗi thời do ta chưa pull mới nhất về.
Lúc này ta cũng thấy Commit Graph minh họa đã thay đổi, đường HotFix tách ra từ master,
thực hiện hot fix, rồi sau đó merge vào master lại.
Để xem trực quan hơn, ta nên xem commit graph trên web tool, nên để branch là master (lấy
master làm trung tâm)
Khi 2 branch cùng edit ít nhất 1 line of code, conflict sẽ xảy ra, lúc đó merge request sẽ như
sau. Ta phải làm nó bằng tay bằng cách pull code từ remote về local, sau đó merge bằng tay
trên text file
Những phần code nào không bị conflict sẽ được GIT merge tự động, còn phần nào conflict
thì GIT sẽ thông báo như hình dưới, phải edit bằng tay, save lại, commit vào local, push lên
remote.
Sau đó vào lại merge request như trước đó và F5 refresh lại, ta sẽ thấy GIT báo đã merge OK
Nhìn lại Graph trên web tool
Nên chọn branch là master để dễ nhìn hơn