95 điểm bởi xguru 2025-02-26 | 7 bình luận | Chia sẻ qua WhatsApp
  • Scott Chacon, tác giả của "Pro Git", giải thích một số thiết lập Git mà anh ấy đã bật trên phạm vi toàn cục và lý do tại sao
  • Nhiều thiết lập trong số đó thực tế được học từ những nhà phát triển đang làm việc trên codebase lõi của Git
  • Dưới đây là cấu hình ~/.gitconfig giúp Git trở nên tốt hơn
    [column]  
    ui = auto  
    [branch]  
    sort = -committerdate  
    [tag]  
    sort = version:refname  
    [init]  
    defaultBranch = main  
    [diff]  
    algorithm = histogram  
    colorMoved = plain  
    mnemonicPrefix = true  
    renames = true  
    [push]  
    default = simple  
    autoSetupRemote = true  
    followTags = true  
    [fetch]  
    prune = true  
    pruneTags = true  
    all = true  
    
    # Có lý do gì để không dùng?  
    
    [help]  
    autocorrect = prompt  
    [commit]  
    verbose = true  
    [rerere]  
    enabled = true  
    autoupdate = true  
    [core]  
    excludesfile = ~/.gitignore  
    [rebase]  
    autoSquash = true  
    autoStash = true  
    updateRefs = true  
    
    # Thiết lập theo sở thích cá nhân (bỏ chú thích để dùng khi cần)  
    
    [core]  
    # fsmonitor = true  
    # untrackedCache = true  
    [merge]  
    # (nếu phiên bản Git thấp hơn 2.3 thì dùng ‘diff3’)  
    # conflictstyle = zdiff3  
    [pull]  
    # rebase = true  
    

Các nhà phát triển lõi Git cấu hình Git như thế nào?

  • Trên mailing list của Git, Felipe Contreras từng đề xuất đội ngũ lõi hãy xóa toàn bộ cấu hình và alias để thử dùng Git mặc định
  • Kết quả của thử nghiệm này là 9 thiết lập và 3 alias đã được đề xuất làm giá trị mặc định mới
    merge.conflictstyle = zdiff3  
    rebase.autosquash = true  
    rebase.autostash = true   
    commit.verbose = true  
    diff.colorMoved = true  
    diff.algorithm = histogram  
    grep.patternType = perl  
    feature.experimental = true  
    branch.sort = committerdate  
    
  • Những thiết lập này vẫn chưa được chấp nhận làm mặc định
  • Nhưng điều thú vị là nhiều nhà phát triển Git gặp khó khăn khi dùng Git nếu không bật một vài thiết lập trong số này
  • Điều còn thú vị hơn là phần lớn các bạn có lẽ hoàn toàn không biết chúng có ý nghĩa gì
  • Bài viết sẽ giải thích chúng theo ba nhóm
    • Những thứ rõ ràng làm Git tốt hơn (Clearly Makes Git Better)
    • Có lý do gì để không dùng? (Why the Hell Not?)
    • Vấn đề sở thích (A Matter of Taste)

# Những thứ rõ ràng làm Git tốt hơn

Sắp xếp danh sách nhánh

  • Mặc định Git sắp xếp nhánh theo thứ tự chữ cái, nhưng sắp xếp theo ngày commit gần nhất có thể hữu ích hơn
  • Bạn có thể dùng các thiết lập sau để sắp xếp nhánh theo commit mới nhất và hiển thị theo dạng cột
    git config --global column.ui auto  
    git config --global branch.sort -committerdate  
    

Sắp xếp danh sách tag

  • Để sắp xếp tag theo thứ tự phiên bản thay vì thứ tự chữ cái, hãy dùng thiết lập sau
    git config --global tag.sort version:refname  
    

Thiết lập tên nhánh mặc định

  • Để đặt tên nhánh mặc định khi khởi tạo repository mới, hãy cấu hình như sau
    git config --global init.defaultBranch main  
    

Cấu hình diff được cải thiện

  • Thay đổi thuật toán diff mặc định sang histogram để so sánh chính xác hơn
  • Để phát hiện phần code bị di chuyển và hiển thị bằng màu, hãy thêm các thiết lập sau
    git config --global diff.algorithm histogram  
    git config --global diff.colorMoved plain  
    git config --global diff.mnemonicPrefix true  
    git config --global diff.renames true  
    

Cấu hình push được cải thiện

  • Bạn có thể cải thiện hành vi của push bằng các thiết lập sau
    git config --global push.default simple  
    git config --global push.autoSetupRemote true  
    git config --global push.followTags true  
    

Cấu hình fetch được cải thiện

  • Để tự động loại bỏ nhánh và tag không cần thiết khi fetch, hãy dùng các thiết lập sau
    git config --global fetch.prune true  
    git config --global fetch.pruneTags true  
    git config --global fetch.all true  
    

# Có lý do gì để không dùng?

Gợi ý tự sửa lỗi

  • Để phát hiện lỗi gõ sai khi nhập lệnh và đưa ra gợi ý, hãy dùng thiết lập sau
    git config --global help.autocorrect prompt  
    

Hiển thị diff khi commit

  • Để hiển thị luôn nội dung thay đổi khi viết commit message, hãy thêm thiết lập sau
    git config --global commit.verbose true  
    

Tái sử dụng cách giải quyết xung đột

  • Để tự động tái sử dụng cách giải quyết xung đột trước đó, hãy dùng các thiết lập sau
    git config --global rerere.enabled true  
    git config --global rerere.autoupdate true  
    

Thiết lập file .gitignore toàn cục

  • Để chỉ định các file bị bỏ qua trên phạm vi toàn cục, hãy cấu hình như sau
    git config --global core.excludesfile ~/.gitignore  
    

Cải thiện thiết lập rebase

  • Để tự động squash và stash khi rebase, hãy dùng các thiết lập sau
    git config --global rebase.autoSquash true  
    git config --global rebase.autoStash true  
    git config --global rebase.updateRefs true  
    

# Vấn đề sở thích

Hiển thị xung đột merge tốt hơn

  • Hãy cân nhắc thiết lập sau nếu muốn hiển thị thêm cả phiên bản gốc khi xảy ra xung đột merge
    git config --global merge.conflictstyle zdiff3  
    

Dùng rebase khi pull

  • Nếu muốn tự động rebase khi chạy git pull, hãy cấu hình như sau
    git config --global pull.rebase true  
    

Tăng tốc phát hiện thay đổi file

  • Để cải thiện hiệu năng của git status và các lệnh tương tự, bạn có thể dùng các thiết lập sau
    git config --global core.fsmonitor true  
    git config --global core.untrackedCache true  
    

# Kết luận

  • Với các thiết lập này, bạn có thể dùng Git thuận tiện hơn, và một số trong đó cũng được các nhà phát triển lõi tích cực sử dụng
  • Tối ưu cấu hình Git có thể giúp cải thiện workflow và sử dụng hiệu quả hơn

7 bình luận

 
brainypooh 2025-02-28

"Điều thú vị hơn là hầu hết các bạn hoàn toàn không biết điều này có nghĩa là gì" — đâm trúng tim đen thật. Rùng mình.

 
tested 2025-02-27

-global chứ không phải --global sao?

 
xguru 2025-02-27

Phải là --global mới đúng. Tôi đã nhầm khi copy-paste. Đã sửa lại rồi.

 
ilikeall 2025-02-26

Việc tái sử dụng cách giải quyết xung đột thật hay.

 
tujuc 2025-02-26

Khi xem diff, tôi có dùng git-delta để xem theo kiểu TUI.

  10   │ [core]  
  11   │     pager = delta  
  12   │ [interactive]  
  13   │     diffFilter = delta --color-only  
  14   │ [delta]  
  15   │     line-numbers = true  
  16   │     side-by-side = true  
  17   │     navigate = true  
  18   │     diff-so-fancy = true  
  19   │     hyperlinks = true  

Nếu ngại cả cái này lẫn cái kia thì dùng tig vậy.... haha
Có gì hay hơn nữa không nhỉ...?

 
GN⁺ 2025-02-26

Ý kiến trên Hacker News

  • alias tôi thích nhất là git out. Nó liệt kê tất cả các commit chưa được push. Tôi dùng nó suốt
    [alias]   
      out = "log @{u}.."   
    
  • Trong khi nhiều người đắn đo về ~/.gitconfig của mình, tôi rất khuyến nghị delta như một người bạn đồng hành cho git CLI
  • ~/.gitconfig của tôi như sau
    [alias]  
      co = checkout  
      ci = commit  
      st = status  
      br = branch  
      hist = log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short  
      type = cat-file -t  
      dump = cat-file -p  
      dft = difftool  
    [tag]  
      sort = version:refname  
    [tar "tar.xz"]  
      command = xz -c  
    [tar "tar.zst"]  
      command = zstd -T0 -c  
    [log]  
      date = iso-local  
    [pull]  
      ff = only  
    [diff]  
      tool = difftastic  
    [safe]  
      directory = *  
    [advice]  
      detachedHead = false  
    [init]  
      defaultBranch = master  
    
  • Tôi thắc mắc vì sao chữ ký commit lại không được đưa vào cấu hình này. Việc đó có thể làm dễ dàng bằng SSH key hiện đại
    [user]  
      name = xyz  
      email = xyz@domain.com  
      signingkey = ~/.ssh/id_algorithm.pub  
    
    [commit]  
      gpgsign = true  
    [tag]  
      gpgsign = true  
    
    [gpg]  
      format = ssh  
    
    # restrict allowed signers  
    # echo "$(git config --get user.email) namespaces=\"git\" $(cat ~/.ssh/id_*.pub)" >> ~/.git_allowed_signers  
    [gpg "ssh"]  
      allowedSignersFile = ~/git_allowed_signers  
    
    • Trên GitHub, bạn có thể thêm SSH key cho cả xác thực và ký. Phải thêm hai lần, nhưng chỉ cần thiết lập một lần là có thể bỏ nhãn 'unverified' khỏi các commit
  • Các tùy chọn cấu hình Git phổ biến của Julia Evans
  • Một số tùy chọn bổ sung tôi thích
    [apply]  
      # Remove trailing whitespaces  
      whitespace = fix  
    [color "diff"]  
      whitespace = red reverse  
    [diff]  
      colorMovedWS = allow-indentation-change  
    [format]  
      pretty = fuller  
    [log]  
      date = iso  
    [pull]  
      ff = only  
    
  • Cấu hình của tôi ở đây. Về cơ bản thì hầu như đã được thiết lập sẵn (trừ column UI). Có lẽ vì tôi đã đọc những bài viết hay của Scott và những người khác
  • Tôi đồng ý với khuyến nghị dùng (z)diff3. Bài viết đã đánh giá thấp tầm quan trọng của nó. diff ba chiều cho phép giải quyết các xung đột mà kiểu mặc định không thể xử lý được
  • Tôi phát hiện ra có thể cấu hình để git dùng pager mà nó thích. Vì vậy tôi đặt là bat