Git là gì?

$ man git
Câu lệnh huyền thoại này chắc chắn sẽ giải đáp không ít thắc mắc về vấn đề này. Tuy nhiên khi áp dụng vào thực tế, có những vấn đề sẽ nảy sinh và bài viết dưới dây liệt kê ra 1 số tình huống và cách giải quyết. Chúc các bạn tìm được điều gì đó lạ mà quen ở đây :D

Một số vấn đề trong Git

  • Thế nào là repository, branch.
  • Làm thế nào để xoá một branch ở phía local, làm thế nào để xoá một branch remote
  • 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 task#2 ở remote)
  • Thế nào là git rebase. Phân biệt rebase với merge
  • Thế nào là git stash
  • Làm thế nào xoá bỏ trạng thái của một vài commit gần đây
  • Làm thế nào để gộp một vài commit thành 1 commit duy nhất
  • Phân biệt git reset, git reset --hard, git reset --soft

Giải đáp

Thế nào là repository, branch?

Repository:

Repository được hiểu là một kho chứa toàn bộ project bao gồm thông tin chi tiết, source code, lịch sử thay đổi và nội dung thay đổi của từng cá nhân đến project.
Dữ liệu của repository được lưu trong thư mục .git. Nếu như bạn muốn theo dõi một dự án cũ trong Git, việc đầu tiên là bạn cần ở trong thư mục của project đó và gõ lệnh:
$ git init
Hoặc bạn có thể tạo một bản sao của một repository có sẵn bằng lệnh:
$ git clone [url]

Branch:

Branch được hiểu là nhánh của repository, mỗi nhánh hoạt động riêng biệt và không ảnh hưởng đến các nhánh khác. Tuy nhiên tuỳ thuộc nhu cầu của người dùng, việc gộp các nhánh lại có thể thưc hiện được bằng thao tác merge.

Làm thế nào để xoá một branch ở phía local, làm thế nào để xoá một branch remote?

Trước tiên, ta cần hiểu remote và local là gì :v
remote: lưu trữ từ xa
local: lưu trữ cục bộ

  • remote repository được lưu ở server sẽ lưu trữ những remote branch. Ta có thể kiểm tra danh sách những remote branch hiện có bằng lệnh:
    $ git branch -r
  • local repository được lưu tại máy cá nhân sẽ lưu trữ những local branch. Tương tự, việc kiểm tra những local branch hiện có cũng được thực hiện như sau:
    $ git branch
    Sự khác biệt đến từ -r hay --remote để thể hiện là thao tác đang thực hiện với remote branch. Tuy nhiên thao tác xoá ở đây sẽ nói đến việc xoá local branch, remote branch lưu ở local và remote branch. Cụ thể:

Xoá local branch và remote branch lưu ở local:

Được thực hiện khi đang ở branch khác.

  • Nếu đã được merge với branch hiện tại và push lên remote nếu liên kết với remote branch:
    $ git branch -d <branch_name>
    $ git branch -d -r <branch_name>
  • Xoá thẳng tay không cần lý do:
    $ git branch -D <branch_name>
    $ git branch -D -r <branch_name>

Xoá remote branch:

Được thực hiện khi đang ở branch cùng tên với remote branch muốn xoá.
$ git push <remote_name> -d <branch_name>

Làm thế nào để push một branch ở local lên remote dưới một cái tên khác?

Bình thường, việc push một branch ở local lên remote branch được thực hiện bằng cách:
$ git push <remote_name> <branch_name>
Tuy nhiên việc push dưới một tên khác sẽ có khác biệt, cụ thể:
$ git push <remote_name> <local_branch_name>:<remote_branch_name>

Thế nào là git rebase? Phân biệt rebase với merge?

git rebase

Rebase là việc tích hợp các thay đổi từ nhánh này vào nhánh khác.
Trong Git, có 2 cách để thực hiện công việc này đó là rebasemerge

rebase

$ git checkout <branch_name>
$ git rebase <rebase_branch_name>

  • Lấy code từ rebase_branch_name sau đó từ những commit ở đó tạo ra những commit tương tự lên branch_name.
    Thực hiện rebase thì các commit đã tồn tại bị bỏ đi và tái tạo lại các commit tương tự nhưng thực ra là khác biệt. Điều này làm lịch sử commit ở local và remote khác nhau.
  • Đặc điểm: các commit của nhánh được tạo mới sẽ nằm liền mạch, và các commit của rebase-branch sẽ là các commit mới nhất.

merge

$ git checkout <branch_name>
$ git merge <branch_2_name>

  • git dùng 2 bản commit cuối cùng của từng nhánh rồi tích hợp lại với nhau tạo thành 1 commit mới theo kiểu hình thoi.
    Thực hiện merge thì các commit đã tồn tại không bị thay đổi, chỉ tạo ra 1 commit mới tích hợp của 2 commit mới nhất.
  • Đặc điểm: các commit của 2 nhánh được sắp xếp theo thời gian tạo commit.

Thế nào là git stash

Việc đang làm dở ở branch này và muốn chuyển sang branch khác xảy ra thường xuyên, tuy nhiên bạn muốn lưu lại thay đổi mà chưa commit thì git stash sẽ giúp bạn. Chỉ cần thực hiện câu lệnh:
$ git stash save # hoặc chỉ cần "git stash"
Hãy thử kiểm tra bằng cách git status, việc chuyển sang branch khác đã được chấp nhận.
Ngoài ra, có 1 số tuỳ chọn như:

  • Xem lại lịch sử thay đổi:
    $ git stash list
  • Xem lại lịch sử thay đổi cùng nội dung của nó:
    $ git stash list -p
  • Xem lại lịch sử thay đổi:
    $ git stash list
  • Xem lại lịch sử thay đổi cụ thể của lần 1:
    $ git stash show stash@{1}
  • Apply thay đổi của lần 1:
    $ git stash apply stash@{1}
  • Xoá thay đổi:
    $ git stash drop stash@{1}
  • Xoá toàn bộ:
    $ git stash clear

Làm thế nào xoá bỏ trạng thái của một vài commit gần đây?

Có 2 cách để thực hiện công việc này:

  • Cách 1: Sử dụng git revert
    $ git revert <commit_id>
    Lệnh này tạo commit đảo ngược commit có commit_id đã 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 --hard <commit_id>
    Lệ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.

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 -i <id_commit_end>
Ta có các lựa chọn pick|squash|fixup các commit trước khi save.

Phân biệt git reset, git reset --hard, git reset --soft

git reset

$ git reset <commit_id>
Sử dụng câu lệnh git reset <commit_id> khi ta muốn di chuyển HEAD đến commit reset và giữ nguyên tất cả thay đổi của file đến vị trị hiện tại. Tuy nhiên sẽ loại bỏ thay đổi khỏi stage.

git reset --hard

$ git reset --hard <commit_id>
Việc thêm --hard đã thể hiện sự mạnh mẽ :3 khi nó vẫn di chuyển HEAD đến commit reset nhưng sẽ loại bỏ tất cả thay đổi của file sau commit reset.

git reset --soft

$ git reset --soft <commit_id>
Câu lệnh này được khuyến khích sử dụng khi muốn di chuyển HEAD đến commit reset do có ưu điểm là sẽ giữ nguyên tất cả thay đổi của file và các thay đổi ở stage.

Kết bài

Bài viết khá dài dòng, mong các bạn thông cảm và có thể tìm được thông tin cần thiết cho bản thân. Chúc vui!