“Các câu lệnh git thông dụng” cực cần thiết cho developer

4.9/5 - (8 votes)

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

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

  1. Thêm một file vào để chuẩn bị commit: git add đường_dẫn_đến_file
  2. Hoặc thêm tất cả file vào để commit: git add .
  3. Commit lên: git commit -m ” nội dung đặt trong đây”
  4. Đẩ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)

  1. Vào thư mục source: cd /path/to/your/repo
  2. Tạo thư mục .git: git init
  3. Xác định đích cho thư mục hiện tại: git remote add origin [email protected]:dotrinh_use/tenrepo.git
  4. Đẩy file này lên trước đã: git add .gitignore
  5. Commit lên: git commit -m “them .gitignore”
  6. Đẩy .gitignore lên repo: git push –set-upstream origin master
  7. Thêm toàn bộ source: git add .
  8. Commit lên: git commit -m “comment”
  9. Đẩ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)

  1. Vào thư mục source: cd /path/to/your/repo
  2. Tạo thư mục .git: git init
  3. Xác định đích cho thư mục hiện tại: git remote add origin [email protected]:dotrinh_use/tenrepo.git
  4. Lấy các file trên repo về trước: git pull [email protected]:dotrinh_use/tenrepo.git master
  5. Sau đó đẩy local source lên remote repo như bình thường
  6. Thêm toàn bộ source: git add .
  7. Commit lên: git commit -m “comment”
  8. Đẩ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: 

git branch -r
 origin/HEAD -> origin/master
  origin/idleTimerDisabled
  origin/makeVersionFlag
  origin/master
  origin/official_improvement
Tạo nhánh mới và checkout luôn sang nhánh mới đó: 
git checkout -b temp_improvement
Tạo nhánh mới và đứng im ở nhánh hiện tại:
git branch tên_nhánh
Đẩy nhánh mới lên repo:
git push origin tên_nhánh
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
Xoá nhánh ở local: 
git branch -d tên_nhánh
Deleted branch temppp (was 10066df).
Xoá nhánh trên repo:
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

  1. 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:

4 Comments

Thảo luận

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Xem thêm
Về cơ bản kết nối đến các thiết bị đều…
 
 
 
 
Facetime iPhone

Main Menu