95 पॉइंट द्वारा xguru 2025-02-26 | 7 टिप्पणियां | WhatsApp पर शेयर करें
  • "Pro Git" के लेखक Scott Chacon कुछ Git settings के बारे में बताते हैं जिन्हें उन्होंने global स्तर पर सक्रिय किया है और क्यों किया है
  • इनमें से कई settings उन्होंने उन डेवलपर्स से सीखी हैं जो वास्तव में Git core codebase पर काम करते हैं
  • नीचे ~/.gitconfig settings दी गई हैं जो Git को और बेहतर बनाती हैं
    [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  
    
    # न इस्तेमाल करने की वजह क्या है?  
    
    [help]  
    autocorrect = prompt  
    [commit]  
    verbose = true  
    [rerere]  
    enabled = true  
    autoupdate = true  
    [core]  
    excludesfile = ~/.gitignore  
    [rebase]  
    autoSquash = true  
    autoStash = true  
    updateRefs = true  
    
    # व्यक्तिगत पसंद की settings (ज़रूरत हो तो comment हटाकर इस्तेमाल करें)  
    
    [core]  
    # fsmonitor = true  
    # untrackedCache = true  
    [merge]  
    # (अगर Git version 2.3 से कम है तो ‘diff3’ इस्तेमाल करें)  
    # conflictstyle = zdiff3  
    [pull]  
    # rebase = true  
    

Git core डेवलपर्स Git को कैसे configure करते हैं?

  • Git mailing list में Felipe Contreras ने कभी core team से कहा था कि वे अपनी सारी settings और aliases हटाकर default Git इस्तेमाल करके देखें
  • इस प्रयोग के परिणामस्वरूप 9 settings और 3 aliases को नए defaults के रूप में प्रस्तावित किया गया
    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  
    
  • ये settings अभी तक default के रूप में अपनाई नहीं गई हैं
  • लेकिन यह दिलचस्प है कि कई Git डेवलपर्स को इनमें से कुछ settings चालू किए बिना Git इस्तेमाल करने में कठिनाई होती है
  • और इससे भी दिलचस्प बात यह है कि आपमें से ज़्यादातर लोगों को शायद पता ही नहीं होगा कि इनका मतलब क्या है
  • इन्हें तीन categories में समझाया जाएगा
    • Git को साफ़ तौर पर बेहतर बनाने वाली चीज़ें (Clearly Makes Git Better)
    • न इस्तेमाल करने की वजह क्या है? (Why the Hell Not?)
    • पसंद का मामला (A Matter of Taste)

# Git को साफ़ तौर पर बेहतर बनाने वाली चीज़ें

branch सूची sorting

  • default रूप से Git branches को alphabetical order में sort करता है, लेकिन हाल की commit date के हिसाब से sort करना ज़्यादा उपयोगी हो सकता है
  • नीचे दी गई settings से branches को हाल की commits के क्रम में sort किया जा सकता है और column format में दिखाया जा सकता है
    git config --global column.ui auto  
    git config --global branch.sort -committerdate  
    

tag सूची sorting

  • tags को alphabetical order की बजाय version order में sort करने के लिए यह setting इस्तेमाल करें
    git config --global tag.sort version:refname  
    

default branch नाम सेट करना

  • नई repository initialize करते समय default branch नाम सेट करने के लिए यह करें
    git config --global init.defaultBranch main  
    

बेहतर diff settings

  • ज़्यादा सटीक तुलना के लिए default diff algorithm को 'histogram' में बदलें
  • code movement detect करके उसे color के साथ दिखाने के लिए ये settings जोड़ें
    git config --global diff.algorithm histogram  
    git config --global diff.colorMoved plain  
    git config --global diff.mnemonicPrefix true  
    git config --global diff.renames true  
    

बेहतर push settings

  • नीचे दी गई settings से push behavior को बेहतर बनाया जा सकता है
    git config --global push.default simple  
    git config --global push.autoSetupRemote true  
    git config --global push.followTags true  
    

बेहतर fetch settings

  • fetch के समय अनावश्यक branches और tags को अपने-आप हटाने के लिए यह settings इस्तेमाल करें
    git config --global fetch.prune true  
    git config --global fetch.pruneTags true  
    git config --global fetch.all true  
    

# न इस्तेमाल करने की वजह क्या है?

autocorrect prompt

  • command टाइप करते समय typo detect करके सुझाव पाने के लिए यह इस्तेमाल करें
    git config --global help.autocorrect prompt  
    

commit करते समय diff

  • commit message लिखते समय बदला हुआ content साथ में दिखाने के लिए यह setting जोड़ें
    git config --global commit.verbose true  
    

conflict resolution का पुन: उपयोग

  • पहले किए गए conflict resolution को अपने-आप फिर से इस्तेमाल करने के लिए यह settings इस्तेमाल करें
    git config --global rerere.enabled true  
    git config --global rerere.autoupdate true  
    

global .gitignore file सेट करना

  • global स्तर पर ignore की जाने वाली files तय करने के लिए इसे इस तरह सेट करें
    git config --global core.excludesfile ~/.gitignore  
    

rebase settings में सुधार

  • rebase के समय अपने-आप squash और stash करने के लिए यह settings इस्तेमाल करें
    git config --global rebase.autoSquash true  
    git config --global rebase.autoStash true  
    git config --global rebase.updateRefs true  
    

# पसंद का मामला

बेहतर merge conflict display

  • merge conflict के समय base version भी साथ में दिखाने के लिए इस setting पर विचार करें
    git config --global merge.conflictstyle zdiff3  
    

git pull पर rebase इस्तेमाल करना

  • git pull के समय अपने-आप rebase करने के लिए इसे इस तरह सेट करें
    git config --global pull.rebase true  
    

file change detection की speed बढ़ाना

  • git status जैसी commands की performance बेहतर करने के लिए यह settings इस्तेमाल की जा सकती हैं
    git config --global core.fsmonitor true  
    git config --global core.untrackedCache true  
    

# समापन

  • इन settings की मदद से Git को अधिक सुविधाजनक तरीके से इस्तेमाल किया जा सकता है, और इनमें से कुछ को core डेवलपर्स भी सक्रिय रूप से इस्तेमाल करते हैं
  • Git settings को optimize करके workflow बेहतर किया जा सकता है और इसे अधिक कुशलता से इस्तेमाल किया जा सकता है

7 टिप्पणियां

 
brainypooh 2025-02-28

"और भी दिलचस्प बात यह है कि आप में से ज़्यादातर लोगों को इसका मतलब क्या है, इसकी बिल्कुल भी समझ नहीं है"—सीधे चुभता है। शेकींग

 
tested 2025-02-27

क्या यह "--global" नहीं, बल्कि "-global" है?

 
xguru 2025-02-27

--global सही है। कॉपी-पेस्ट करते समय मुझसे गलती हो गई थी। इसे सुधार दिया गया है।

 
ilikeall 2025-02-26

कॉनफ़्लिक्ट समाधान का पुन: उपयोग अच्छा है।

 
tujuc 2025-02-26

मैं diff करते समय git-delta का इस्तेमाल करके उसे 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  

अगर ये सब भी झंझट लगे तो tig.... हाहा
क्या इससे भी बेहतर कुछ हो सकता है...?

 
GN⁺ 2025-02-26

Hacker News राय

  • मेरा पसंदीदा alias git out है। यह उन सभी commits की सूची दिखाता है जिन्हें push नहीं किया गया है। मैं इसे हमेशा इस्तेमाल करता हूँ
    [alias]  
      out = "log @{u}.."  
    
  • जब बहुत से लोग अपने ~/.gitconfig पर सोच-विचार करते हैं, मैं git CLI के साथी के रूप में delta की ज़ोरदार सिफारिश करता हूँ
  • मेरा ~/.gitconfig इस प्रकार है
    [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  
    
  • मुझे हैरानी है कि commit signing इस config में क्यों शामिल नहीं है। इसे आधुनिक SSH keys के साथ आसानी से किया जा सकता है
    [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  
    
    • GitHub पर आप authentication और signing, दोनों के लिए SSH keys जोड़ सकते हैं। इसे दो बार जोड़ना पड़ता है, लेकिन एक बार सेटअप हो जाने पर commits से 'unverified' लेबल हटाया जा सकता है
  • Julia Evans के लोकप्रिय Git config options
  • कुछ अतिरिक्त options जो मुझे पसंद हैं
    [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  
    
  • मेरा config यहाँ है। मूल रूप से यह पहले से ही सेट था (column UI को छोड़कर)। शायद इसलिए कि मैंने Scott वगैरह की अच्छी पोस्टें पढ़ी थीं
  • मैं (z)diff3 इस्तेमाल करने की सिफारिश से सहमत हूँ। लेख इसकी अहमियत को कम करके दिखाता है। three-way diff ऐसे conflict resolution संभव बनाता है जो default style में संभव नहीं हैं
  • मुझे पता चला कि git को उसकी पसंद का pager इस्तेमाल करने के लिए सेट किया जा सकता है। इसलिए मैंने इसे bat पर सेट किया