30/09/2019, 08:28

Một số câu hỏi về Git cho người mới tập tành

Bạn là một người mới học Git hay xưa nay chỉ dùng mới biết dùng vài câu lệnh cơ bản của Git để đẩy code lên repo cá nhân của mình. Hẳn là bạn sẽ có nhiều điều băn khoăn, thắc mắc khi thật sự tham gia vào một dự án, cùng code với những người khác. Mình cũng đã từng như thế, trải qua bao nhiêu ...

Bạn là một người mới học Git hay xưa nay chỉ dùng mới biết dùng vài câu lệnh cơ bản của Git để đẩy code lên repo cá nhân của mình. Hẳn là bạn sẽ có nhiều điều băn khoăn, thắc mắc khi thật sự tham gia vào một dự án, cùng code với những người khác. Mình cũng đã từng như thế, trải qua bao nhiêu lần mất code, phải gõ lại ???? hay lúng túng vì bị conflict mà không biết cách sửa. Tự nhận thấy kiến thức về Git của bản thân còn chưa vững vàng, mình viết bài này nhằm mục đích chia sẻ quá trình "ngáo" Git của bản thân và cũng mong rằng những chia sẻ trong bài viết có thể sẽ hữu ích với một số bạn ????

1. Cấu hình SSH

Sao cứ mỗi lần tôi push code lại phải nhập username và password vậy, mỏi cả tay ????. Có cách lẹ hơn không vậy ?


Trả lời:

Bạn hoàn toàn có thể bỏ qua bước nhập username và password bằng việc dùng SSH.

SSH sử dụng cặp khóa private-public để xác thực tài khoản push lên repo thay vì username, password như HTTPS. Bạn chỉ cần tạo cặp khóa ở máy local và đăng ký public key với dịch vụ lưu trữ mã nguồn (ví ở đây là github.com) là xong.

Các bước thực hiện:
  1. Tạo public-private key Chạy lệnh:
ssh-keygen -t rsa -b 4096
  1. Mở xem file public key
cat ~/.ssh/id_rsa.pub
  1. Sau đó copy public key
  2. Đăng ký public key với github
  • Bạn truy cập đường link sau: https://github.com/settings/keys
  • Ấn vào nút New SSH key
  • Phần Title bạn đặt tên tùy thích
  • Paste public key vào mục Key
  • Hoàn tất bằng cách ấn Add Key SSH

Tèn tén ten ???? Vậy là bạn đã thiết lập xong SSH key cho tài khoản của mình. Giờ bạn có thể clone 1 repo cá nhân của mình về với đường dẫn SSH (bạn clone về bằng HTTPS thì vẫn phải nhập username, password đấy ). Nếu muốn sử dụng SSH với repo đang có trên máy thì bạn hãy đổi url remote bằng lệnh: Dễ thế mà mình dùng git cả năm trời mới biết có cái này ????

git remote set url [tên-remote] [đường dẫn SSH]

2. Commit --amend

Tôi vừa thay đổi file trong dự án và đã commit, bây giờ tôi lại phát hiện ra một lỗi nhỏ và muốn sửa file mà không phải thêm một commit nữa không ?


Trả lời:

Rất đơn giản, bạn chỉ cần dùng lệnh git commit --amend là cách thay đổi mới sẽ vẫn được lưu trong commit cũ. Thế mà ngày xưa mình cứ thay đổi một lần lại commit một cái, first commit, second commit, ... ????

3. Fork repo

Tôi làm việc trên một repo, clone về và checkout sang một branch khác. Khi có ai đó thay đổi và push lên master, tôi chỉ việc git pull origin master về, fix conflict rồi lại push lên branch đó. Sao tôi thấy nhiều người cứ phải lằng nhằng fork repo, rồi add remote, rebase các thứ các thứ nhờ ? Sao phải phức tạp, rối rắm vậy ?


Trả lời:

Đúng là làm việc trên một repo như thế thì đơn giản hơn nhiều so việc fork repo. Nhưng đó là khi bạn có quyền push lên repo đó, trong trường hợp không có quyền push lên repo, ví dụ trường hợp các bạn muốn contribute cho các open source chẳng hạn, cách duy nhất là fork repo về, sửa đổi và sau đó push lên repo đã fork và gửi pull request. Các bạn có thể tham khao quy trình dùng git với fork repo tại đây.

4. Git stash

Tôi đã thay đổi code trên branch, bây giờ tôi muốn checkout sang branch khác nhưng git thì không có phép nếu chưa commit thay đổi trên branch hiện tại. Tôi thì chưa muốn commit, lỡ lần sau quên là đã commit rồi mà quên dùng git commit --amend thì sao ? 1 tính năng nên chỉ có 1 commit.


Trả lời:

Thật ra bạn có thể checkout sang branch khác mà chưa commit với cờ -f ở lệnh checkout (tuy nhiên code của bạn vừa thay đổi sẽ nhảy sang branch checkout luôn). Nếu chưa muốn commit thì bạn có thể dùng câu lệnh git stash save để lưu trữ những thay đổi sẽ xảy ra, code của branch sẽ trở về trạng thái của commit gần nhất và bạn có thể checkout. Sau khi quay lại branch, muốn phục hồi lại thì bạn hãy dùng lệnh git stash pop [email protected]{0}.

5.

0