Bạn có thể dùng nhiều tool để thao tác với git nhưng theo thói quen thì mình đang dùng Sourcetree là chủ yếu, review code trước khi push lên remote rất tiện. Bạn có thể dùng bất cứ cái nào mà thấy quen thuộc, và tuyệt vời nhất là biết kết hợp cả hai để mang lại hiệu quả cao nhất cho công việc của bạn.
Kết nối tới bitbucket hoặc github
Tạo ssh key với mail của bạn:
ssh-keygen -t rsa -C “[email protected]”
hoặc tạo với tên xác định nào đó:
ssh-keygen -t rsa -f ~/.ssh/dotrinh_file_pub -C “[email protected]”
Thêm ssh key bằng agent
ssh-agent
và
ssh-add ~/.ssh/id_rsa
Thêm ssh key vào tài khoản bitbucket hoặc github thông qua Web UI trong mục SSH Keys nữa là xong.
Liệt kê key đã tạo
ls -al ~/.ssh
Copy key đã tạo vào clipboard
clip < ~/.ssh/id_rsa.pub
Có 2 cách lấy source để bắt đầu với dự án mới
Chúng ta sẽ có 2 phương thức ssh và https khi checkout dự án mới. Lời khuyên của mình đó là nên dùng phương thức ssh.
Để pull push mà không cần đăng nhập mỗi lần pull push với tài khoản trên github hay bitbucket chỉ cần:
・ Thêm ssh key vào tài khoản trên github hay bitbucket. (copy nội dung file này trên MacOS: Macintosh HD/Users/ten_cua_ban/.ssh/id_rsa.pub)
・ Và sau đó checkout dự án về bằng phương thức ssh (không phải https).
・ Làm xong thì tha hồ pull push
Các câu lệnh git cơ bản và hay dùng
- Thêm một file vào để chuẩn bị commit: git add đường_dẫn_đến_file
- Hoặc thêm tất cả file vào để commit: git add .
- Commit lên: git commit -m ” nội dung đặt trong đây”
- Đẩy tất cả thay đổi lên repo: git push
Các bước đẩy source có sẵn lên repo (repo đang rỗng)
- Vào thư mục source: cd /path/to/your/repo
- Tạo thư mục .git: git init
- Xác định đích cho thư mục hiện tại: git remote add origin [email protected]:dotrinh_use/tenrepo.git
- Đẩy file này lên trước đã: git add .gitignore
- Commit lên: git commit -m “them .gitignore”
- Đẩy .gitignore lên repo: git push –set-upstream origin master
- Thêm toàn bộ source: git add .
- Commit lên: git commit -m “comment”
- Đẩy tất cả thay đổi lên repo: git push
Các bước đẩy source có sẵn lên repo (repo không rỗng)
- Vào thư mục source: cd /path/to/your/repo
- Tạo thư mục .git: git init
- Xác định đích cho thư mục hiện tại: git remote add origin [email protected]:dotrinh_use/tenrepo.git
- Lấy các file trên repo về trước: git pull [email protected]:dotrinh_use/tenrepo.git master
- Sau đó đẩy local source lên remote repo như bình thường
- Thêm toàn bộ source: git add .
- Commit lên: git commit -m “comment”
- Đẩy tất cả thay đổi lên repo: git push
Các câu lệnh git thao tác với nhánh
Lấy toàn bộ các nhánh trên remote về local:
git fetch --all
Xem tất cả branch đang có cả ở local và remote
Lệnh này không chỉ rõ nhánh nào ở local và nhánh nào ở remote: git branch
idleTimerDisabled makeVersionFlag * master official_improvement temp_improvement
2. Xem tất cả branch đang có cả ở local và remote
Lệnh này chỉ rõ nhánh nào ở local và nhánh nào ở remote: git branch -a
idleTimerDisabled
makeVersionFlag
* master
official_improvement
temp_improvement
remotes/origin/HEAD -> origin/master
remotes/origin/idleTimerDisabled
remotes/origin/makeVersionFlag
remotes/origin/master
remotes/origin/official_improvement
Xem tất cả branch đang có cả ở remote:
origin/HEAD -> origin/master
origin/idleTimerDisabled
origin/makeVersionFlag
origin/master
origin/official_improvement
Total 0 (delta 0), reused 0 (delta 0)
remote:
remote: Create pull request for official_improvement:
remote: https://xxxxx.xxxxx/tennguoidungxxxx/tenrepo/pull-requests/new?source=official_improvement&t=1
remote:
To bitbucket.org:tennguoidung/tenrepo.git
* [new branch] official_improvement -> official_improvement
Deleted branch temppp (was 10066df).
git push origin :<branch_name>
To bitbucket.org:tennguoidung/ten repo.git - [deleted] official_improvement
Reset nhánh
Khi muốn reset toàn bộ source của nhánh về trạng thái lúc tạo nhánh (lúc copy source từ master hay nhánh bất kỳ, trường hợp này mình copy từ master)
git branch --force master origin/master
Thay đổi tên nhánh
Thay đổi tên nhánh từ feature-2 thành feature/feature-2 (mục đích việc thêm cái feature vào đằng trước nhằm gom các chức năng nhỏ thành 1 thư mục) Câu lệnh này áp dụng khi bạn đang ở nhánh khác và kể cả đang ở nhánh hiện tại:
git branch -m feature-2 feature/feature-2
Sau khi đổi xong thì xoá nhánh cũ trên remote đi (tham khảo mục bên trên): git push origin :<branch_name>
Cuối cùng push (đẩy) nhánh vừa đổi tên lên remote là xong.
Những commit cũ vẫn được lưu lại nên bạn cứ yên tâm. Làm đến đây thấy mấy bạn tây làm ra cái tool này tuyệt vời thật 🙂
Khôi phục nhánh đã xoá
Thôi lỡ tay xoá mất nhánh trên remote thì làm thế nào? Yên tâm chưa mất hẳn đâu, có thể lấy lại được bằng cách tìm mã sha của thao tác xoá đó và tạo ra nhánh mới từ cái thao tác ấy.
git reflog chạy câu lệnh này để lấy mã sha cần khôi phục về
git checkout -b <tên_nhánh_sẽđược_tạo_mới_từ_nhánhđã_xoá> <mã_sha>
Ex: git checkout -b menu 458da6d
Tên nhánh mới của mình là menu. Đây rồi từ đây cuộc đời sẽ nở hoa.
Xem danh sách nhánh xem đã có nhánh mới vừa tạo chưa: git branch -a
Sau khi tạo ra nhánh mới nếu cần phải đẩy lên remote thì chạy câu lệnh:
git push -u origin <tên_nhánh>
Luôn luôn nghe ngóng và cập nhật source từ nhánh mẹ
Hãy dùng git rebase khi muốn lấy source mới nhất từ nhánh mà mình đã tách ra.
Cái này thì cực kỳ hữu ích rồi. Chú ý xem trên repo nó sửa những file nào rồi backup file của mình lại sau đó mới rebase không thì conflict vỡ mặt (thời gian backup mình cho là nhanh hơn ngồi resolve conflict). Khi rebase thành công xong thì copy ngược lại cái mà mình đã backup nếu cần thiết.
Cú pháp:
git rebase <nhánh_hiện_tại> <nhánh_mẹ>
HOẶC
git rebase <nhánh_mẹ>
Sau khi chạy câu lệnh trên thì cần phải đẩy những cái thay đổi lên trên kho hay gọi là remote với lệnh git push (Không cần add/commit vì mình đã thay đổi nội dung của nhánh mà)
Đây là ví dụ:
git rebase feature/MyMenuDataReceiveFull feature/MenuDataReceiveFull HOẶC git rebase feature/MenuDataReceiveFull First, rewinding head to replay your work on top of it... Fast-forwarded feature/MyMenuDataReceiveFull to feature/MenuDataReceiveFull.
Nhìn thấy những msg này là thấy hạnh phúc rồi.
Chẳng may bị conflict thì phục hồi lại nhánh đó bằng cách: git rebase –abort
Chú ý: khi muốn rebase phải pull src của các nhánh về, đảm bảo nó phải là src mới nhất!
Merge và Rebase khác nhau như thế nào?
Merge: Khi merge thì 1 commit “Merge branch abc into master” sẽ được tạo tự động và xuất hiện trong lịch sử – danh sách các commit, bạn đã merge nhánh nào với nhánh nào
Rebase: Còn rebase thì âm thầm ghép 2 mã nguồn lại với nhau mà không để lại dấu vết.
Giải quyết khi bị conflict
Khi làm việc nhóm chúng ta hay tạo nhiều nhành để phát triển các chức năng khác nhau và khi merge hay rebase lại với nhau thì thuường xuyên xảy ra conflict. Vậy để giải quyết thì chúng ta cần phải mở cái file mà nó báo là conflict ra và chọn đoạn code mà bạn muốn giữ, sau đó lại đẩy lên repo. Như vậy là xong.
Ví dụ cụ thể:
Ở đây ta pull source về thì xảy ra lỗi conflict như thế này:
git pull Auto-merging /Controllers/NavigationController.m CONFLICT (content): Merge conflict in /Controllers/NavigationController.m Auto-merging Controllers/Menu/Version/NewUpdate/NewVersionViewController.h CONFLICT (add/add): Merge conflict in /Controllers/Menu/Version/NewUpdate/ZRNewVersionViewController.h Automatic merge failed; fix conflicts and then commit the result.
file thứ nhất bị conflict:
Auto-merging /Controllers/NavigationController.m
CONFLICT (content): Merge conflict in /Controllers/NavigationController.m
file thứ hai bị conflict:
Auto-merging Controllers/Menu/Version/NewUpdate/NewVersionViewController.h
CONFLICT (add/add): Merge conflict in /Controllers/Menu/Version/NewUpdate/ZRNewVersionViewController.h
Giải quyết xong thì commit lên.
Automatic merge failed; fix conflicts and then commit the result.
B1: Mở 2 files trên ra và tìm đoạn có conflict, thường thì bắt đầu bằng >>>>>
B2: Xoá code hoặc giữ lại cả 2 đoạn code. Xong thì commit lên như bc 3.
B3: git add -> git commit như bình thường.
B4: Done
Cách sử dụng stash – khi lỗi chuyển nhánh
Mình gặp vấn đề khi chuyển qua lại giữa cách nhánh. Vấn đề đó là khi nhánh hiện tại có thay đổi thì chưa commit hay chưa stash thì nó không cho mình chuyển sang nhánh khác. Vậy giải quyết thế nào?
Please commit your changes or stash them before you switch branches
Trường hợp này chúng ta sử dụng stash (nghĩa là giấu đi). Khi dùng câu lệnh này nó sẽ cất tạm thời các đoạn code thay đổi vào 1 chỗ và cho ta chuyển qua lại thoải mái các nhánh khác. Khi trở lại chỉ việc lấy ra và làm tiếp.
Các câu lệnh cần thiết:
git stash // Cất hoặc giấu tạm vào chỗ nào đó
git stash pop // khi trở lại nhánh thì pop lấy ra và code tiếp
git stash list // Xem mình đã giấu gì
git stash clear // Xoá luôn cái đã giấu đi
Xoá nhiều Tag cùng lúc
- Liệt kê tất cả các nhánh:
git tag -l
2. Xoá nhiều nhánh cùng lúc:
git tag -d TAG1 TAG2 TAG3
Ví dụ: git tag -d 0.1.10 0.1.11 0.1.12 0.1.13 0.1.18 0.1.19 0.1.20 0.1.7 0.1.8 0.1.9 0.2.0 1.0.4
3. Sau khi xoá nhánh cần push lên remote:
git push origin -d TAG1 TAG2 TAG3
vd: git push origin -d 0.1.10 0.1.11 0.1.12 0.1.13 0.1.18 0.1.19 0.1.20 0.1.7 0.1.8 0.1.9 0.2.0 1.0.4
Các câu lệnh git thao tác với file và commit
Revert 1 file bất kỳ khi chưa commit
git checkout file_path
Revert 1 file bất kỳ khi đã commit và push
Khi bạn lỡ commit và push 1 vài file không mong muốn thì bạn cần revert cái commit mà đã push lên bằng cách
git revert mã_commit
sau đó lại đẩy lên repo là ok
VÍ dụ: cái commit mới nhất cũng là cái đẩy nhầm là 3490f6d
vậy thì ta chạy lệnh: git revert 3490f6d
sau đó nó hiển thị ra editor tên là vi chỉ cần nhập: :wq
Và push lên là ok
Tham khảo thêm: https://stackoverflow.com/questions/927358/how-to-undo-the-most-recent-commits-in-git
Khôi phục 1 file đã xoá và đã push lên remote
Dùng nhiều cách nhưng mình thấy cáchs này là dễ nhất, bạn chỉ việc tạo ra 1 file y hệt tên và đường dẫn sau đó copy lại nội dung file đã xoá vào là được. git nó vẫn lưu lại lịch sử của file đó.
Để lấy nội dung file đã xoá thì dùng source tree hoặc trên browser tại thời điểm đã xoá là được.
Khi gặp lỗi với SSL
SSL certificate problem: self signed certificate :
git -c http.sslVerify=false clone https://118.103.xxx.xx/gitbucket/git/sdasdb.git git config http.sslVerify false
Thay đổi chủ sở hữu 1 repo
Một url trong ssh nó có dạng [email protected]:username/tenduan.git vậy khi thay đổi chủ sở hữu cái url này cũng thay đổi vậy nên ta cần làm 2 việc:
1. Thay đổi owner trên giao diện web
Setting của repo > chọn Transfer repository > Nhập tên người dùng mới sẽ sở hữu repo, ở bước này họ cũng cảnh báo mình luôn.
2. Đồng ý
Việc còn lại là bạn vào tài khoản email sẽ được chuyển đến và Accept là xong. Tài khoản cũ refresh. sẽ ra trang 404 vì hiện không còn sở hữu nữa.
3. Cập nhật lại url cho dự án
Vì URL dự án đã thay đổi nên cần cập nhật lại, để làm việc đó ta cần thay đổi url cho dự án như thế này:
git remote set-url origin [email protected]:username/tenduan.git
Nếu ngại như tên mập thì bạn có thể clone mới cũng được, nhưng mà các nhánh đang tạo ở local sẽ mất.
Tham khảo thêm https://confluence.atlassian.com/bitbucket/change-the-remote-url-to-your-repository-794212774.html
Export lịch sử git
git log --pretty=format:"%ad - %an: %s" --after="2021-08-01" --until="2021-12-29" > git_log.txt
Kiểm tra sự thay đổi trong 1 commit
Kiểm tra bao nhiêu file thay đổi, bao nhiêu dòng đc thêm vào, bao nhiêu dòng được xoá đi.
git show 6462181 --shortstat
Với 6462181 là commit hash
Các tool liên quan
Nếu như bạn đang dùng Windows có thể cài thêm tortoisegit: https://tortoisegit.org/download/ cho tiện vì phần mềm này giúp chúng ta có thể thao tác được nhiều hơn với file và thư mục. Sau khi cài bạn có thể click chuột phải và tìm hiểu thêm.
*Bài này còn được cập nhật thường xuyên
VỀ CHÚNG TÔI:
Đô Trịnh là một thương hiệu uy tín trên mạng xã hội.
Chúng tôi tự hào đây là nơi cung cấp dịch vụ phần mềm tốt trên toàn thế giới (phục vụ chủ yếu các thị trường Việt Nam, Đông Nam Á, Châu Á, Bắc Mỹ, Châu Âu).
🌟 Fanpage: https://fb.com/dotrinhofficial
🌟 Website chính thức: https://dotrinh.com
🌟 Zalo: dotrinhcom
🌟 Email: [email protected]
🌟 Telegram: dotrinhcom
🌟 Xem đánh giá của KH khác: https://dotrinh.com/danh-gia-cua-khach-hang-rat-quan-trong/
Các bài viết không xem thì tiếc:
- Advanced Sourcetree – dùng git hiệu quả để nâng cao chất lượng công việc
- Sau khi merge có nên xoá nhánh?
- Tại sao đã thêm vào file gitignore rồi mà không có tác dụng?
- Làm sao đánh giá một dự án phần mềm thành công?
- Các lệnh phải biết khi làm việc với Linux
- Thêm nhiều domain trong Apache – Web Server
- Danh sách bluetooth profiles
- Fragment và Activity trong android cơ bản
- Siêu tổng hợp android code snippets (cập nhật thường xuyên)
- Cảm hứng làm sản phẩm
- SSL certificate problem: self signed certificate
- Cách dump data trong Ruby
- Cổng USB đa năng cho Macbook Pro 16 inch
- Siêu tổng hợp iOS code snippets – Objective C
- Show Indicator trong Android | Hiển thị indicator trong Android
4 Comments