<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Reads From TechShowcases]]></title><description><![CDATA[Reads From TechShowcases]]></description><link>https://blogs.techshowcases.com</link><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Apr 2026 20:12:04 GMT</lastBuildDate><atom:link href="https://blogs.techshowcases.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[JavaScript Promises]]></title><description><![CDATA[Introduction
JavaScript mein agar kabhi setTimeout lagaaya, API call maara, ya database se data maanga hai… toh tum asynchronous JS jungle ke safari pe nikal chuke ho. 🌴🐒
Aur iss jungle ka ultimate ]]></description><link>https://blogs.techshowcases.com/js-promises</link><guid isPermaLink="true">https://blogs.techshowcases.com/js-promises</guid><category><![CDATA[ChaiCode]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[promises]]></category><category><![CDATA[Chaiaurcode]]></category><dc:creator><![CDATA[Abhirup Roy]]></dc:creator><pubDate>Sun, 01 Mar 2026 12:29:33 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/67e45c53bf27b83f7b5fdf20/38bda6d0-25f2-4b8e-93f6-388fffa9b19a.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Introduction</h1>
<p>JavaScript mein agar kabhi setTimeout lagaaya, API call maara, ya database se data maanga hai… toh tum <strong>asynchronous JS</strong> jungle ke safari pe nikal chuke ho. 🌴🐒</p>
<p>Aur iss jungle ka ultimate raja — <strong>Promise</strong>. Aaj hum isko full desi college romance wale andaaz mein samjhenge. Proposal se shuru, lovey-dovey phase, aur akhir mein wo iconic breakup drama. ❤️→💔</p>
<p>Maza bhi aayega, concept bhi crystal clear hoga, aur thoda sa college nostalgia ka overdose bhi milega. 🥲</p>
<p>Technically 100% correct. Emotionally? 1000% relatable, bhai!</p>
<h2>Promise hota kya hai?</h2>
<p>Simple language mein:</p>
<p><em><strong>Promise = Ek aisa commitment jo future mein ya toh fulfill hoga ya reject.</strong></em></p>
<p>Ek future ka "pakka wala vaada" jo ya toh poora hoga (resolve), ya toh dhokha dega (reject).</p>
<h2>Picture this:</h2>
<p>College ka 2nd year mein padhte huye tum, freshers' party pe usko dekha. Tumhari aankhein aur dil dono uski smile ne chura le gaya. Dil se dil tak current chala gaya. Semester exams khatam hue, tumne himmat juta ke propose kar diye (roof-top pe, rain background mandatory).</p>
<p>Ab uska reply? Pending… pending… pending…</p>
<p>Exactly jaise JS ka Promise!</p>
<pre><code class="language-javascript">const pyaarKaPromise = new Promise((resolve, reject) =&gt; {
  const mutualVibes = Math.random() &gt; 0.4; // reality check 😏
  if (mutualVibes) {
    resolve("YES bol diya! 💍✨");
  } else {
    reject("Bhai… sirf dost theek hai 🙂‍↔️");
  }
});
</code></pre>
<h2>3 States of Pyaar (aka Promise States)</h2>
<p>Chetan Bhagat ke 2 States padhe the? Forget that. Real college love mein sirf 3 states hote hain:</p>
<table>
<thead>
<tr>
<th>Love Ka Scene</th>
<th>Promise State</th>
<th>Feeling Level</th>
</tr>
</thead>
<tbody><tr>
<td>Reply ka intezaar (seen zone)</td>
<td><strong>Pending</strong></td>
<td>Anxiety 100 😨</td>
</tr>
<tr>
<td>YES bol diya!</td>
<td><strong>Fulfilled</strong></td>
<td>Butterflies 🦋</td>
</tr>
<tr>
<td>Friendzone / block / ghost</td>
<td><strong>Rejected</strong></td>
<td>Sad violin bgm 🎻🥲</td>
</tr>
</tbody></table>
<h3>1. .then() – “Haan bol diya, ab shuru honeymoon phase”</h3>
<p>Kyu ke Promise ek asynchronous activity hain, tumhara tension khatam hone mein kuch time to lagega bhai! Sirf success pe <code>.then</code> chalta hai. Jaise tumhari proposal accept hone ke baad wali story.</p>
<pre><code class="language-javascript">pyaarKaPromise
  .then((msg) =&gt; {
    console.log(msg); // "YES bol diya! 💍✨"
    // ab CCD date plan karo
  })
  .catch((err) =&gt; {
    console.log(err); // "Bhai… sirf dost theek hai"
    // sad playlist on repeat
  });
</code></pre>
<h3>2. Promise Chaining – Full college love arc</h3>
<p>Ek, do event pe nahi rukta na pyaar? Propose → first date → Insta official → late-night calls → trips → ghar waalon ko manana → shaadi dreams…</p>
<p>Same vibes chaining mein bhi:</p>
<pre><code class="language-javascript">Promise.resolve("Proposal accepted 💖")
  .then((msg) =&gt; {
    console.log(msg);
    return "First maggi date in canteen 🍜";
  })
  .then((date) =&gt; {
    console.log(date);
    return "Insta story daal di – #CoupleGoals 📸";
  })
  .then((status) =&gt; {
    console.log(status);
    return "Ghar waalon ko convince kar liya? Maybe… 😅";
  })
  .catch((error) =&gt; {
    console.log("Breakup loading…:", error);
  });
</code></pre>
<p>Har <code>.then()</code> ek naya Promise return karta hai aur har .then() previous step pe depend karta hai. Ek bhi fail → chain crash!</p>
<h3>3. .catch() – The ultimate breakup catcher</h3>
<p>Beech mein <code>ex</code> wapas aa gaya, trust issues, ya "long distance nahi chalega"… wajah kuch bhi ho, aap ko <code>.catch()</code> samhalta hain.</p>
<pre><code class="language-javascript">Promise.resolve("Honeymoon phase on 🔥")
  .then(() =&gt; {
    throw new Error("Ex ne story pe like kar diya 😵");
  })
  .then(() =&gt; console.log("Ye nahi hoga"))
  .catch((drama) =&gt; {
    console.log("Relationship terminated:", drama);
  });
</code></pre>
<p>.catch() poori chain ke errors ko pakad leta hai. Jaise ek bhi red flag dikha → pura pyaar red zone mein!</p>
<h3>4. .finally() – “Pyaar gaya toh gaya, placement toh lagana hai”</h3>
<p>Chahe resolve ho ya reject, ye hamesha chalega.</p>
<pre><code class="language-javascript">Promise.reject("Seen-zoned forever 🥲")
  .catch((err) =&gt; console.log(err))
  .finally(() =&gt; {
  // Pyaar mile na mile, placement milna chahiye..
 //Ya to Uski choice ko duniya ke nazro mein prove karne ke liye 😎,
//Nehi to uske decision ke against self-worth prove karne ke liye... 😭
    console.log(" ChaiCode webdev cohort enroll karte hain");
    console.log(" 😎  placement loading...");
  });
</code></pre>
<h2>Promise Static Methods – Multiverse of College Crushes</h2>
<h3><code>Promise.all()</code> – “Ladka Approval Committee”</h3>
<p>"Sabki approval chahiye"<br />Bestie, uski bestie, mummy-papa… sab yes → green signal. Ek bhi no → poora reject!</p>
<pre><code class="language-javascript">const bestFriendApproval = Promise.resolve("Best friend happy");
const herBestieApproval = Promise.resolve("Her bestie approved");
const momApproval = Promise.resolve("Mummy ko bhi pasand");

Promise.all([
  bestFriendApproval,
  herBestieApproval,
  momApproval
])
.then((results) =&gt; {
  console.log("Sab khush:", results);
})
.catch((error) =&gt; {
  console.log("Kisi ko problem hai:", error);
});
</code></pre>
<h3><code>Promise.allSettled()</code> <strong>– “Sab apna apna opinion batao”</strong></h3>
<p>Chahe koi support kare, koi hate kare, sabka status milega. Real gossip group energy.</p>
<pre><code class="language-javascript">const friend1 = Promise.resolve("Supportive");
const friend2 = Promise.reject("Toxic banda hai");
const friend3 = Promise.resolve("Neutral");

Promise.allSettled([friend1, friend2, friend3])
  .then((results) =&gt; {
    console.log(results);
  });
</code></pre>
<p>Output Structure:</p>
<pre><code class="language-javascript">[
  { status: 'fulfilled', value: 'Supportive' },
  { status: 'rejected', reason: 'Toxic banda hai' },
  { status: 'fulfilled', value: 'Neutral' }
]
</code></pre>
<h3><code>Promise.any()</code> – "Bas ek haan chahiye yaar"</h3>
<p>Thoda controversial 😜 hain but tum concept samjho..bhawnao pe mat jao..😉. Multiple crushes mein se pehla yes → jeet gaye! Sab reject → total heartbreak (AggregateError).</p>
<p>Rule:</p>
<ul>
<li><p>Pehla resolve → success</p>
</li>
<li><p>Sab reject → AggregateError</p>
</li>
</ul>
<pre><code class="language-javascript">const crush1 = Promise.reject("Already committed");
const crush2 = Promise.resolve("Interested 👀");
const crush3 = Promise.reject("Friendzone");

Promise.any([crush1, crush2, crush3])
  .then(console.log)
.catch(console.log);
</code></pre>
<h3><code>Promise.race()</code> – "Kaun pehle reply karega?"</h3>
<p>Jo sabse jaldi message karega, wahi jeetega. DM race intensifies! 🏃‍♂️💨</p>
<pre><code class="language-javascript">const instaReply = new Promise((resolve) =&gt; {
  setTimeout(() =&gt; resolve("Insta pe reply 💬"), 1000);
});
const whatsappReply = new Promise((resolve) =&gt; {
  setTimeout(() =&gt; resolve("WhatsApp pe reply 📱"), 2000);
});
Promise.race([instaReply, whatsappReply])
  .then(console.log);
</code></pre>
<h3>Deep Concept: Error Propagation</h3>
<p>Error kahin bhi aaya, neeche .catch() tak pahunch jaata hai. Jaise "trust issues" ka chhota sa seed → pura relationship ko barbaad karta hain.</p>
<p>Agar chain mein kahin bhi error aaya, woh neeche ke .catch() tak travel karega.</p>
<pre><code class="language-javascript">Promise.resolve("Start relationship")
.then(() =&gt; {
return Promise.reject("Trust issues 😬");
})
.then(() =&gt; {
console.log("Ye kabhi nahi chalega");
})
.catch((err) =&gt; {
console.log("Handled:", err);
})
</code></pre>
<p>Output:</p>
<pre><code class="language-javascript">Handled: Trust issues 😬
</code></pre>
<h2>Bonus: async/await – Mature, thoda calm wala version</h2>
<p>Sabar ka fal, meetha hota hain! Ab yeh dekho promises ke liye wait karne ka mature tareeka.</p>
<pre><code class="language-javascript">async function collegeLoveStory() {
  try {
    const proposal = await Promise.resolve("YES! 💖");
    console.log(proposal);

    const firstKiss = await Promise.resolve("Movie theatre mein popcorn share 🍿");
    console.log(firstKiss);

    const future = await Promise.resolve("Couple DP forever ✨");
    console.log(future);
  } catch (heartbreak) {
    console.log("Breakup scene:", heartbreak);
  } finally {
    console.log("Life goes on… next sem ke notes bhi padhna padenge 🌈");
  }
}

collegeLoveStory();
</code></pre>
<h2>Final Gyaan (Technical + Dil se)</h2>
<ul>
<li><p>Promise = future ka dabba (value ya error)</p>
</li>
<li><p>.then() = happy ending chain</p>
</li>
<li><p>.catch() = breakup damage control</p>
</li>
<li><p>.finally() = placement grind never stops</p>
</li>
<li><p>all / race / any / allSettled = alag-alag desi love scenarios</p>
</li>
</ul>
<blockquote>
<h3>Aage se jab koi bole “Baby, I promise…”</h3>
<p>Tu seedha bol dena:<br />“Return type bata?<br />Resolve ya reject?<br />Aur .catch() hai kya? 😏🔥”</p>
</blockquote>
<p>Ab jaao, promises samajh ke code likho… aur thoda sa college wala pyaar yaad karke smile kar lo. ❤️‍🩹😂</p>
<p>Jai Hind!</p>
<p>Abhirup</p>
]]></content:encoded></item><item><title><![CDATA[Emmet for HTML]]></title><description><![CDATA[To be updated]]></description><link>https://blogs.techshowcases.com/emmet-for-html</link><guid isPermaLink="true">https://blogs.techshowcases.com/emmet-for-html</guid><category><![CDATA[ChaiCode]]></category><dc:creator><![CDATA[Abhirup Roy]]></dc:creator><pubDate>Sun, 01 Feb 2026 06:28:42 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1769927077558/50226ec1-79e1-421c-8931-6f2dceec44a8.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>To be updated</p>
]]></content:encoded></item><item><title><![CDATA[CSS Selectors 101]]></title><description><![CDATA[To be updated]]></description><link>https://blogs.techshowcases.com/css-selectors-101</link><guid isPermaLink="true">https://blogs.techshowcases.com/css-selectors-101</guid><category><![CDATA[ChaiCode]]></category><dc:creator><![CDATA[Abhirup Roy]]></dc:creator><pubDate>Sun, 01 Feb 2026 06:13:52 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1769926380503/18848cf1-52c0-4e89-99c2-913a84bd5c87.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>To be updated</p>
]]></content:encoded></item><item><title><![CDATA[Understanding HTML Tags and Elements]]></title><description><![CDATA[To be updated later]]></description><link>https://blogs.techshowcases.com/understanding-html-tags-and-elements</link><guid isPermaLink="true">https://blogs.techshowcases.com/understanding-html-tags-and-elements</guid><category><![CDATA[ChaiCode]]></category><category><![CDATA[chaicode webdev cohort 2026]]></category><dc:creator><![CDATA[Abhirup Roy]]></dc:creator><pubDate>Sun, 01 Feb 2026 05:56:10 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1769925143522/30182d82-4fd3-4e90-aed2-df48489f970b.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>To be updated later</p>
]]></content:encoded></item><item><title><![CDATA[How a Browser Works]]></title><description><![CDATA[To be updated]]></description><link>https://blogs.techshowcases.com/how-a-browser-works</link><guid isPermaLink="true">https://blogs.techshowcases.com/how-a-browser-works</guid><category><![CDATA[ChaiCode]]></category><dc:creator><![CDATA[Abhirup Roy]]></dc:creator><pubDate>Sun, 01 Feb 2026 05:28:41 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1769923646928/c868e97b-a5b4-4efa-b055-eb7b93d1daf5.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>To be updated</p>
]]></content:encoded></item><item><title><![CDATA[How To Communicate using TCP Protocol]]></title><description><![CDATA[To be updated]]></description><link>https://blogs.techshowcases.com/how-to-communicate-using-tcp-protocol</link><guid isPermaLink="true">https://blogs.techshowcases.com/how-to-communicate-using-tcp-protocol</guid><category><![CDATA[ChaiCode]]></category><dc:creator><![CDATA[Abhirup Roy]]></dc:creator><pubDate>Sun, 01 Feb 2026 05:10:08 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1769869662766/563d5b07-ecfe-46cd-b530-83d3628169ab.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>To be updated</p>
]]></content:encoded></item><item><title><![CDATA[TCP vs UDP]]></title><description><![CDATA[To be updated]]></description><link>https://blogs.techshowcases.com/tcp-vs-udp</link><guid isPermaLink="true">https://blogs.techshowcases.com/tcp-vs-udp</guid><category><![CDATA[ChaiCode]]></category><dc:creator><![CDATA[Abhirup Roy]]></dc:creator><pubDate>Sat, 31 Jan 2026 14:11:24 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1769868582779/ffef3c7c-537a-4835-944b-55aa98d73553.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>To be updated</p>
]]></content:encoded></item><item><title><![CDATA[Getting Started with cURL]]></title><description><![CDATA[To be updated]]></description><link>https://blogs.techshowcases.com/getting-started-with-curl</link><guid isPermaLink="true">https://blogs.techshowcases.com/getting-started-with-curl</guid><category><![CDATA[ChaiCode]]></category><dc:creator><![CDATA[Abhirup Roy]]></dc:creator><pubDate>Sat, 31 Jan 2026 13:53:11 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1769867383457/15e66bbc-965a-4b3d-b2e0-2f70b4391456.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>To be updated</p>
]]></content:encoded></item><item><title><![CDATA[How DNS Resolution Works]]></title><description><![CDATA[To be updated.]]></description><link>https://blogs.techshowcases.com/how-dns-resolution-works</link><guid isPermaLink="true">https://blogs.techshowcases.com/how-dns-resolution-works</guid><dc:creator><![CDATA[Abhirup Roy]]></dc:creator><pubDate>Sat, 31 Jan 2026 13:43:25 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1769866911342/ab3318d7-1eab-4b76-a24c-160a440ea9d8.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>To be updated.</p>
]]></content:encoded></item><item><title><![CDATA[DNS Record Types Explained]]></title><description><![CDATA[To be modified]]></description><link>https://blogs.techshowcases.com/dns-record-types-explained</link><guid isPermaLink="true">https://blogs.techshowcases.com/dns-record-types-explained</guid><category><![CDATA[ChaiCode]]></category><dc:creator><![CDATA[Abhirup Roy]]></dc:creator><pubDate>Sat, 31 Jan 2026 13:36:33 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1769866485212/eab0d0fc-6ef1-4e4a-8e52-e874e9ba1239.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>To be modified</p>
]]></content:encoded></item><item><title><![CDATA[Looking Inside .git  - How Git Internally Works]]></title><description><![CDATA[Introduction
Git works flawlessly—until it doesn’t. Merge conflicts, detached HEADs, corrupted repos—these problems become trivial once you understand how Git works internally. Many developers use Git every day, but treat it like a black box
Hi! My n...]]></description><link>https://blogs.techshowcases.com/looking-inside-git-how-git-internally-works</link><guid isPermaLink="true">https://blogs.techshowcases.com/looking-inside-git-how-git-internally-works</guid><category><![CDATA[ChaiCode]]></category><dc:creator><![CDATA[Abhirup Roy]]></dc:creator><pubDate>Sat, 31 Jan 2026 13:22:12 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1769865633954/d23468e0-24d7-481f-abb4-3b31f95b95f8.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-introduction">Introduction</h2>
<p>Git works flawlessly—until it doesn’t. Merge conflicts, detached HEADs, corrupted repos—these problems become trivial once you understand how Git works internally. Many developers use Git every day, but treat it like a black box</p>
<p>Hi! My name is Abhirup Roy, I build softwares and write about them. Today I am writing a concept-first article designed to help you understand Git internally, not just use it. The goal is to help you build a mental model of Git—how it thinks, stores, and protects your code - so Git commands feel logical instead of magical.</p>
<p>The .git folder serves as Git's database, storing all repository metadata, history, and objects to track your project's evolution without relying on external servers. Understanding its structure and contents reveals how Git maintains snapshots of your work efficiently. This mental model shifts focus from commands to Git's content-addressable file system.</p>
<p>This article explains:</p>
<ul>
<li><p>What the <code>.git</code> folder really is</p>
</li>
<li><p>How <strong>Git objects (blob, tree, commit)</strong> work together</p>
</li>
<li><p>What <em>actually happens</em> during <code>git add</code> and <code>git commit</code></p>
</li>
<li><p>How <strong>hashes guarantee integrity</strong></p>
</li>
<li><p>Why Git tracks <strong>content, not files</strong></p>
</li>
</ul>
<p>No memorization. Only <strong>mental models</strong>.</p>
<h2 id="heading-main-premise-a-content-addressable-file-system">Main Premise: A Content-Addressable File system</h2>
<p>Before diving into the folders, we must understand the fundamental paradigm of Git.</p>
<p>Git is fundamentally a <strong>content-addressable file system</strong> layered with a directory tree structure.</p>
<p>What does that mean? Most systems store data based on <em>where</em> it is (e.g., <code>C:/Documents/report.txt</code>). Git stores data based on <em>what</em> it is.</p>
<p>Git takes a piece of data (like the contents of a file), runs it through a hashing algorithm (SHA-1), and generates a unique 40-character string (the hash). Looks like: <code>6f5d4e3...</code>.</p>
<p><strong>Why is this crucial?</strong></p>
<ol>
<li><p><strong>The hash <em>is</em> the identity:</strong> Git doesn't care that your file is named <code>index.html</code>. It only cares about the hash of its contents.</p>
</li>
<li><p><strong>Integrity is guaranteed:</strong> If you change a single character in a file, the resulting hash changes completely. It is impossible to corrupt file contents or alter history without Git knowing about it, because the hashes wouldn't match anymore.</p>
</li>
<li><p><strong>Deduplication:</strong> If you have two files with identical contents in different folders, Git only stores the content once, because they share the same hash.</p>
</li>
</ol>
<h2 id="heading-the-engine-room-the-git-folder">The Engine Room: The <code>.git</code> Folder</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768659606826/2c098557-a0a7-41ec-8988-51adc9fab9c5.png" alt class="image--center mx-auto" /></p>
<blockquote>
<p><strong>Git is a database of snapshots, not diffs</strong></p>
</blockquote>
<p>What is the <code>.git</code> Folder? The <code>.git</code> folder is <strong>the</strong> Git repository itself. Everything Git knows - history, branches, commits, staging, tags—is stored inside <code>.git</code>.</p>
<blockquote>
<p>If you delete the <code>.git</code> folder, your project becomes a normal folder again.</p>
</blockquote>
<p>Why Does the <code>.git</code> Folder Exist? Git in over-simplified term, is a <strong>content-addressed database</strong> plus a <strong>versioned file system</strong>.</p>
<ul>
<li><p>Your working directory → files you edit</p>
</li>
<li><p><code>.git</code> directory → Git’s internal database</p>
</li>
</ul>
<p>Git never relies on filenames or timestamps. It relies on <strong>content hashes</strong>.</p>
<p>When you run <code>git init</code> in a directory, Git creates a hidden folder named <code>.git</code>. This folder is your repository. Your working directory (where you edit files) is just a temporary checkout of data managed inside the <code>.git</code> folder.</p>
<p>While it contains many configurations, these are the critical components for understanding internals:</p>
<ul>
<li><p><code>objects/</code>: This is the heart of Git. This is the database where all your files, commits, and trees are stored, referenced by their hashes.</p>
</li>
<li><p><code>refs/</code>: This is where Git stores bookmarks to specific commit hashes. Branches (like <code>main</code> or <code>develop</code>) and Tags are just files in here containing a single hash.</p>
</li>
<li><p><code>index</code>: (Also called the "Staging Area"). This is a binary file that acts as the crucial middleman between your working directory and the repository. It builds the next commit.</p>
</li>
<li><p><code>HEAD</code>: A pointer indicating "where you are right now." It usually points to a branch name inside <code>refs/</code>.</p>
</li>
</ul>
<h2 id="heading-git-objects-the-atoms-of-history">Git Objects: The Atoms of History</h2>
<p>Git stores everything as immutable objects, each identified by a unique SHA-1 hash (40-character hex from content), ensuring integrity—if content changes, the hash changes. Inside the <code>.git/objects</code> directory, Git stores everything using three main types of objects. Don't think of changes as "diffs"; think of them as snapshots built from these three blocks. Three core types form a hierarchy: blobs (file contents), trees (directory snapshots), and commits (named snapshots with metadata).</p>
<ol>
<li><p><strong>Blob</strong>: The simplest object. A blob contains just the <strong>contents</strong> of a file. It does <em>not</em> know the file's name, its permissions, or when it was created. It is just raw data compressed and hashed. Raw file content, no filename or history stored—just bytes with a hash like da39a3ee5e6b4b0d3255bfef95601890afd80709.</p>
<ul>
<li><strong>Analogy:</strong> A Polaroid photograph. It shows an image, but nothing is written on the white border.</li>
</ul>
</li>
<li><p><strong>Tree</strong>: Blobs aren't enough. We need filenames and directory structures. A Tree object solves this. A Tree is essentially a list of directory contents. Each line in a Tree object maps a filename to the hash of a Blob (for files) or another Tree hash (for sub directories). Directory listing with name, mode, and hash references to blobs or sub-trees, e.g., representing "file.txt" pointing to its blob hash.</p>
<ul>
<li><strong>Analogy:</strong> A folder on your computer desktop that contains photos (blobs) and other sub-folders (other trees).</li>
</ul>
</li>
<li><p><strong>Commit</strong>: Snapshot via tree hash, plus metadata (author, date, message, parent commits), forming history chains.</p>
</li>
</ol>
<div class="hn-table">
<table>
<thead>
<tr>
<td><strong>Object Type</strong></td><td><strong>Purpose</strong></td></tr>
</thead>
<tbody>
<tr>
<td>Blob</td><td>Stores file content</td></tr>
<tr>
<td>Tree</td><td>Stores directory structure</td></tr>
<tr>
<td>Commit</td><td>Stores snapshot + metadata</td></tr>
</tbody>
</table>
</div><p>This design enables deduplication—identical file content reuses the same blob hash across the repository.​</p>
]]></content:encoded></item><item><title><![CDATA[Understanding Network Devices]]></title><description><![CDATA[In 2026, where hardly any device is not connected to internet, it is quite confusing and messy to understand what constitutes to computer network and which devices or hardwares are fundamentally responsible for successful communication between world ...]]></description><link>https://blogs.techshowcases.com/understanding-network-devices</link><guid isPermaLink="true">https://blogs.techshowcases.com/understanding-network-devices</guid><category><![CDATA[networking]]></category><category><![CDATA[computer networking]]></category><category><![CDATA[#DNS #NetworkingBasics #InternetBasics #WebFundamentals #ComputerNetworks #TechForBeginners #LearnNetworking #WebDevelopment #HowInternetWorks #CSBasics]]></category><category><![CDATA[chaicode webdev cohort 2026]]></category><category><![CDATA[ChaiCode]]></category><category><![CDATA[Chaiaurcode]]></category><category><![CDATA[ChaiCohort]]></category><category><![CDATA[chai-code ]]></category><dc:creator><![CDATA[Abhirup Roy]]></dc:creator><pubDate>Sat, 31 Jan 2026 13:14:09 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1769167790420/3128df3c-0e89-4977-8ac6-78786d96a3a2.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In 2026, where hardly any device is not connected to internet, it is quite confusing and messy to understand what constitutes to computer network and which devices or hardwares are fundamentally responsible for successful communication between world wide web of computers. When I was in my college days, my teachers suggested me to understand this inter computer network of WWW as if, it is a layout of water pipeline plan for a very big city (at today’s scale, probably we need to visualize the whole world as one big city). The data that flows through internet, is the waterflow, and network devices are the “plumbers“ who ensures that water flows from intended source to intended target, following an approach of finding least distance path, to reach the target without any delay.</p>
<p>Hello! My name is Abhirup Roy, I build softwares and I write about them. Though we engineers have a special fond for fancy technical terms, I prefer simplicity over jargons. Let’s dive back to our Computer Networks 101 and understand essential network devices in a <code>TL;DR</code> fashion with real-life examples and easy to visualize analogies.</p>
<p>Today’s computer network, is built on a design strategy where a computer network has been segregated in groups, in such a way, that our data flow is contained within these groups. Bigger the geographical area the network covers, more iteration of this design, resulting in multiple copies of these network groups. These groups are -</p>
<ul>
<li><p>WWW User Devices</p>
</li>
<li><p>Local Network</p>
</li>
<li><p>Enterprise Network</p>
</li>
<li><p>ISP Edge</p>
</li>
<li><p>Internet Backbone</p>
</li>
<li><p>Datacenter</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1769168166093/a58c25ee-f91b-496c-88b1-a3d501174e7c.png" alt class="image--center mx-auto" /></p>
<p>Each of these groups have their respective role in establishing and maintaining data flow, and in order to do that, each of these groups use few network devices. Thus these are the most common and will be part of this discussion. Remember, internet is an ongoing evolution from ARPANET project in <strong>1969,</strong> to transition to official internet with standard TCP/IP protocol allowing different networks to connect, happened on January 1, 1983, and each component used in internet has its scope of diving very deep (from hardware implementation to software abstraction of each network device used). But in this article, my objective is to explain network device and how they make computer network work, without getting into “rabbit hole”, hence <code>TL;DR</code> approach.</p>
<p>Before I explain the above network architecture, first I want to talk about another concept, that we need to refer to in our journey to understand computer networking. Open Systems Interconnection AKA OSI model. It is a conceptual framework that segregate/standardize network communication functions/operations into manageable stages (🤯😵‍💫).</p>
<p>Basically it is a 7-stage layered approach in which computer network communication happens. So, at each layer, which ever networking function is performed, its relevant hardwares and few rules that these hardwares follow to operate, are involved. I have prepared a diagram to show you that at each of 7 layers of OSI framework, certain network functions are performed by respective hardwares, using respective protocols (in simple term, rules).</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1769186680589/1b51e602-4fde-46d6-b0f8-9e44c0aa5c69.png" alt class="image--center mx-auto" /></p>
<ul>
<li><p>Physical layer AKA Layer 1 handles raw electrical and optical signals. Hence devices that works at this layers not “intelligent” enough to understand IP address and MAC addresses. Hence, they take incoming electrical signals and send them out to all devices after performing its duties. In this layer we have below devices -</p>
<ol>
<li><p>Hub - A central connection point for devices in a LAN. It takes an incoming signal on one port and blindly broadcasts it to all other ports. This leads to collisions when multiple devices try to talk at once, reducing efficiency and security risks (everyone sees everyone's data). Preferably, in real-life, hubs are avoided as switch is a better alternative.</p>
</li>
<li><p>Repeaters - A repeater is a network device that regenerates weakened or corrupted signals to restore them to their original form before re-transmission. Unlike an amplifier, which increases both signal and noise, a repeater reconstructs the original clean signal and forwards it, ensuring reliable data delivery over longer distances.</p>
</li>
<li><p>Modem - Is an abbreviation of two words - Modulator and Demodulator.</p>
</li>
</ol>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[GIT Basics Explained: A Beginner's Perspective]]></title><description><![CDATA[Introduction
As we embark on our long and arduous journey of learning to code and build complex softwares that can solve real-world problems, the first inevitable bump that we come across is learning Git, the “version control software“ for all the co...]]></description><link>https://blogs.techshowcases.com/git-basics-explained-a-beginners-perspective</link><guid isPermaLink="true">https://blogs.techshowcases.com/git-basics-explained-a-beginners-perspective</guid><category><![CDATA[ChaiCode]]></category><category><![CDATA[Chaiaurcode]]></category><category><![CDATA[ChaiCohort]]></category><category><![CDATA[chaicode webdev cohort 2026]]></category><category><![CDATA[chai-code ]]></category><category><![CDATA[Git]]></category><category><![CDATA[GitLab]]></category><category><![CDATA[Gitcommands]]></category><category><![CDATA[GitHub]]></category><dc:creator><![CDATA[Abhirup Roy]]></dc:creator><pubDate>Fri, 30 Jan 2026 15:21:58 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1769784380662/7baaca5c-d072-4147-b8ad-04c0a1969e56.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-introduction">Introduction</h2>
<p>As we embark on our long and arduous journey of learning to code and build complex softwares that can solve real-world problems, the first inevitable bump that we come across is learning Git, the “version control software“ for all the codes and other important files, used in a project.</p>
<p>Hi! my name is Abhirup Roy, I love to build softwares and write about them, and today, in this article, we are going to understand how to use Git, enough to get going. We can always dive deeper later, to master our understanding of the software, from its internal architectures to design strategy and principles used in implementation, and discuss all the mostly used functionalities that Git provides us. But before we can dive that deep, today, in thing article, we will learn how to at least start using Git to track our code changes, like how “pro” engineers do in their production software projects.</p>
<p>Before explaining the “how” part, Let’s have an overview idea about “<em>what is Git?</em>” and '“<em>why should we use git</em>?”</p>
<h2 id="heading-what-is-git">What is Git</h2>
<p>In one word over-simplification, Git is the “Undo“ option for software developers!</p>
<p>Like any other projects, a software project is an implementation of an answer to a real-world problem. When we create such a software project, it is obvious, that we need to write many lines of code, often segregated in different files, to keep the design clean, understandable, maintainable and upgradable.</p>
<p>While we do so, we create many files, edit many files, sometime even remove few files to reach to the final version of our solution of the problem. It is quite understandable that, this cannot be done in a single attempt, or most often, not by a single software programmer. Thus, we need an efficient way to track changes in our project files and also provide a mechanism to enable multiple programmers to contribute their progress to the project code base to reach the final implementation of solution. Git does that for us. It is a “<em>distributed version control system</em>“ software. Let’s dissolve the jargons, “<em>version control system</em>” means, it keeps a track onto each programmer’s code changes along with timestamp onto their workstations, and, “<em>distributed</em>“ refers to the ability of Git to allow programmers to submit their delta progress to a central source code storage of project (which is often a remote server), documenting it with an ID, a description, contributor’s name or email and timestamp of contribution.</p>
<h2 id="heading-why-should-we-use-git">Why should we use Git</h2>
<p>As we got a bird view idea around what is the purpose of Git version control software, let’s also skim through why should we use Git, or any VCS (version control system) software for the matter.</p>
<p>Git is used to track, manage and co-ordinate changes in software project files (i.e. codes and other files) efficiently, when a team of software engineers are working on the same project.</p>
<ul>
<li><p>Complete change history tracking by recording author, timestamp and commit message</p>
</li>
<li><p>Easy rollback and debugging in case of errors introduced</p>
</li>
<li><p>Each repository or in short repo, is a full backup of the project, containing all files. Thus, multiple software developers can work on the same repo simultaneously, by working offline and upload their delta change to the repository. In most of the real-world scenarios, we software developers use a remote repository in online platforms like GitHub, BitBucket or GitLab, so that we do not have a single point of failure</p>
</li>
<li><p>Creating branches in Git for experimenting some new risky or experimental changes without jeopardizing entire project’s progress. Creating branches in git is lightweight and fast, enabling developers to develop new features, fix bugs and experiment in their codes. Merging these back to the original main or master branch is also reliable and traceable</p>
</li>
</ul>
<p>If you want to dive deeper and understand why version control system(VCS) softwares exist in the first place and how VCS has evolved from a local change tracking tool to modern day distributed VCS - “Git”, you can read my another article - <a target="_blank" href="https://blogs.techshowcases.com/why-version-control-exists-the-pen-drive-problem"><strong>Why version control exists?</strong></a></p>
<h2 id="heading-how-to-install-git-onto-your-system">How to Install Git onto your system</h2>
<ul>
<li><p><strong>Check if Git is installed -</strong></p>
<ol>
<li><p>Open a terminal for Linux or Mac OS, a command prompt/PowerShell/GitBash window, depending upon your OS.</p>
</li>
<li><p>Run a command <code>git --version</code> , if Git is installed onto your system already, you will see Git version information onto your terminal/command prompt.</p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1767965079997/41c9981b-928c-475f-8c7d-e592c5c07ca4.png" alt class="image--center mx-auto" /></p>
<p> If Git is not already installed onto your system, you will get a prompt response like <code>command not found</code> or <code>‘git’ is not recognized as an internal or external command</code></p>
</li>
</ol>
</li>
<li><p><strong>Install Git -</strong></p>
<ol>
<li><p>Installing Git on Linux -</p>
<ul>
<li><p>For Debian based Linux distribution such as Ubuntu -</p>
<ol>
<li><p>Updates the package list using <code>sudo apt update</code></p>
</li>
<li><p>Installs git - <code>sudo apt install git -y</code></p>
</li>
<li><p>verify installation <code>git --version</code></p>
</li>
</ol>
</li>
<li><p>For Fedora, CentOS or RHEL -</p>
<ol>
<li><p><code>sudo dnf install git -y</code></p>
</li>
<li><p><code>git --version</code></p>
</li>
</ol>
</li>
<li><p>For Arch Linux -</p>
<ol>
<li><p><code>sudo pacman -S git</code></p>
</li>
<li><p><code>git --version</code></p>
</li>
</ol>
</li>
<li><p>For OpenSUSE -</p>
<ol>
<li><p><code>sudo zypper install git</code></p>
</li>
<li><p><code>git --version</code></p>
</li>
</ol>
</li>
</ul>
</li>
<li><p>Installing on MacOS -</p>
<ul>
<li><p>Check if homebrew is available on your Mac -</p>
<p>  <code>brew --version</code></p>
</li>
<li><p>Install homebrew if the above command does not show you homebrew version -</p>
<p>  <code>/bin/bash -c "$(curl -fsSL</code> <a target="_blank" href="https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh"><code>https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh</code></a><code>)"</code></p>
</li>
<li><p>Once the brew installation is comeplete and you get to see brew version information on <code>brew --version</code> command, install git using following command</p>
<p>  <code>brew install git</code></p>
<p>  <code>git --version</code></p>
</li>
<li><p>If the above method seems complex to you, you can also install git from GUI installer package. For that. follow below steps -</p>
<ol>
<li><p>Go to: <a target="_blank" href="http://git-scm.com">git-scm.com</a></p>
</li>
<li><p>Download macOS installer</p>
</li>
<li><p>Run <code>.pkg</code> file</p>
</li>
<li><p>Follow installation steps</p>
</li>
<li><p>Verify with: <code>git --version</code></p>
</li>
</ol>
</li>
</ul>
</li>
<li><p>Installing on Windows -</p>
<ul>
<li><p>On Windows OS, Git installation is GUI based and easy. Follow below steps -</p>
<ol>
<li><p>Visit: <a target="_blank" href="http://git-scm.com"><strong>git-scm.com</strong></a></p>
</li>
<li><p>Click <strong>Download for Windows</strong></p>
</li>
<li><p><code>.exe</code> file will be downloaded to your system</p>
</li>
<li><p>During installation -</p>
<ul>
<li><p>Keep the default/recommended options/settings</p>
</li>
<li><p>Make sure to select the option on GUI screen, that says - “Git from the command line and also from 3rd-party software”</p>
<p>  This ensures that Git will work on command prompt, PowerShell and editors or IDE like VS Code or IntelliJ</p>
</li>
</ul>
</li>
<li><p>After installation, open <strong>Command Prompt</strong> or <strong>PowerShell</strong> and run: <code>git --version</code></p>
</li>
</ol>
</li>
</ul>
</li>
</ol>
</li>
<li><p>After installing Git onto your system for the first time, you will need to configure your identity in git -</p>
<p>  <code>git config --global user.name “Your Name/Name that you want to use in your commit signatures“</code></p>
<p>  <code>git config --global user.email “Your email - your.email@example.com“</code></p>
<p>  Once they are configured, you can always see them by running <code>git config --global --list</code> command</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768491918080/d40bd6e3-967c-4f72-b279-7468217f9fd0.png" alt class="image--center mx-auto" /></p>
</li>
</ul>
<h2 id="heading-core-terminologies-and-concepts">Core Terminologies and Concepts</h2>
<p>Think of Git as three zones or areas: Working directory (your files), Staging area (prepare changes) and Repository or repo (saved history).</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768641802992/1ec7abc3-46fe-4552-9269-9815d5321e7a.png" alt /></p>
<ol>
<li><p><strong>Working Directory</strong>: Current files you edit</p>
</li>
<li><p><strong>Staging Area</strong>: <code>git add</code> moves changes here for review</p>
</li>
<li><p><strong>Repository</strong>: A repository or simply ‘repo‘ is a Git-managed project.</p>
<p> It contains:</p>
<ol>
<li><p>Your project files</p>
</li>
<li><p>Full history of changes</p>
</li>
<li><p>Git metadata inside <code>.git</code> folder</p>
</li>
</ol>
</li>
</ol>
<p>    Types of repo:</p>
<ol>
<li><p>Local repo → On your computer</p>
</li>
<li><p>remote repo → on GitHub/GitLab/BitBucket etc</p>
</li>
</ol>
<ol start="4">
<li><p><strong>Commit</strong>: A commit is a snapshot of your project at a point in time created by command <code>git commit -m "Message"</code>. You can think of commit as “Save game checkpoint“. Each commit has:</p>
<ul>
<li><p>Unique ID (hash created using SHA-1 encryption algorithm)</p>
</li>
<li><p>Author</p>
</li>
<li><p>Timestamp</p>
</li>
<li><p>Message (why the change was made)</p>
</li>
</ul>
</li>
<li><p><strong>Branch:</strong> A branch is an independent line of development.</p>
<ul>
<li><p><code>main</code> or <code>master</code> is the default branch</p>
</li>
<li><p>Feature branches allow safe experimentation</p>
<p>  Example - Trying to implementing login feature, onto feature branch, while, main branch is unchanged.</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768643420125/7eea47ff-d010-4257-8f3d-c28c7b4eef1f.png" alt /></p>
</li>
</ul>
</li>
<li><p><strong>Head:</strong> Head tells Git -”This is where I am right now”. Head is a pointer to -</p>
<ul>
<li><p>The current branch</p>
</li>
<li><p>The latest commit you’re working on</p>
</li>
</ul>
</li>
</ol>
<h2 id="heading-git-managed-project-structure">Git Managed Project Structure</h2>
<p>Below is a tree-like representation of a simple, git-managed JavaScript based application project structure, for ease of understanding.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768642043163/51e4c626-ebc7-4a69-b01e-2efdf37806b3.png" alt /></p>
<ul>
<li><p><code>.git/</code> → Git’s brain. Do not manually make any change to this directory, if you do not wish to unknowingly corrupt your project repo snapshots.</p>
</li>
<li><p>File outside <code>.git/</code> → Is your actual project. In the above diagram, <code>src/</code> and <code>README.md</code> are your project files, while content inside <code>.git/</code> is not.</p>
</li>
</ul>
<h2 id="heading-common-git-commands">Common Git Commands</h2>
<ul>
<li><p><strong>Initialize a repo</strong>: Start in an empty project folder. Open terminal there. Initialize a Git repository using the command :</p>
<pre><code class="lang-bash">  git init 
  <span class="hljs-comment"># It creates a hidden .git folder tracking changes. Your folder has now a local repo.</span>
</code></pre>
</li>
<li><p><strong>Check Status</strong>: Use below command to show modified, staged, or untracked files:</p>
<pre><code class="lang-bash">  git status
  <span class="hljs-comment"># It shows modified, staged, or untracked files</span>
</code></pre>
</li>
<li><p><strong>Stage and Commit Changes:</strong> Create/edit files, then :</p>
<pre><code class="lang-bash">  git add filename.txt <span class="hljs-comment"># Stage one file </span>
  git add . <span class="hljs-comment"># Stage all </span>
  git commit -m <span class="hljs-string">"Initial commit"</span>
</code></pre>
<p>  The message describes the snapshot.</p>
</li>
<li><p><strong>View History:</strong></p>
<pre><code class="lang-bash">  git <span class="hljs-built_in">log</span> --oneline
  <span class="hljs-comment">#Lists commits with short IDs and commit messages</span>
</code></pre>
</li>
<li><p><strong>Undo Changes:</strong> Cover safe recovery with <code>git restore</code> for unstaged edits, <code>git reset</code> for unstaged commits (with caution), and <code>git revert</code> for committed changes. Emphasize checking <code>git status</code> first to avoid mistakes.</p>
<pre><code class="lang-bash">  git restore filename.txt  <span class="hljs-comment"># Discard edits</span>
  git checkout -- filename.txt  <span class="hljs-comment"># Alternative</span>

  <span class="hljs-comment">#safe for unstaged files.</span>
</code></pre>
</li>
</ul>
<p><strong>Save snapshot to remote repo</strong>: Connect to a remote repo like GitHub/GitLab via <code>git remote add origin</code>, <code>git push</code> to upload, and <code>git pull</code>/<code>git fetch</code> to sync. But for that to work, you definitely need to first create an account and perform first push.</p>
<pre><code class="lang-bash">git push origin main <span class="hljs-comment"># publishing latest snapshot from local repo to remote repo</span>
git pull <span class="hljs-comment"># get the local repo in sync with remote repo</span>
</code></pre>
<p><strong>Summary of most common git commands based on their use case:</strong></p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Workflow</td><td>Key Commands</td><td>Use Case</td></tr>
</thead>
<tbody>
<tr>
<td>First Commit</td><td><code>git init</code>, <code>git add .</code>, <code>git commit</code></td><td>New project setup​</td></tr>
<tr>
<td>Daily Changes</td><td><code>git status</code>, <code>git add</code>, <code>git commit</code></td><td>Track edits</td></tr>
<tr>
<td>Branch &amp; Merge</td><td><code>git checkout -b feature</code>, <code>git merge</code></td><td>Test features safely</td></tr>
<tr>
<td>Remote Sync</td><td><code>git push origin main</code><a target="_blank" href="https://github.com/git-guides/install-git">,</a> <code>git pull</code></td><td>Share with team</td></tr>
</tbody>
</table>
</div><h2 id="heading-developer-workflow"><strong>Developer Workflow</strong></h2>
<p>In the below illustration, I am giving a step-by-step example to give you an idea on a common workflow that a developer has to go through in his/her day-to-day software development work. However, there are many other corrective steps and actions that are used in cases of fixing wrong/corrupted project snapshots or mapping the snapshots to relevant branches. That are not topic of basics understanding, hence out of scope for this blog.</p>
<pre><code class="lang-bash"><span class="hljs-comment"># 1. Create project folder</span>
mkdir my-app
<span class="hljs-built_in">cd</span> my-app

<span class="hljs-comment"># 2. Initialize Git</span>
git init

<span class="hljs-comment"># 3. Create a file</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"Hello Git"</span> &gt; app.txt

<span class="hljs-comment"># 4. Check status</span>
git status

<span class="hljs-comment"># 5. Stage file</span>
git add app.txt

<span class="hljs-comment"># 6. Commit</span>
git commit -m <span class="hljs-string">"Initial commit"</span>

<span class="hljs-comment"># 7. View history</span>
git <span class="hljs-built_in">log</span>
</code></pre>
<h3 id="heading-what-just-happened">What Just Happened?</h3>
<ul>
<li><p>Git started tracking your project</p>
</li>
<li><p>File was staged and committed</p>
</li>
<li><p>History is now preserved forever</p>
</li>
</ul>
<h3 id="heading-what-is-next">What is Next?</h3>
<p>Now let’s understand the developers workflow with git, how git works at local level as well as at the remote repository of single source of truth. In order to do so, let us refer the below flow diagram:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1767014755720/6ae7e2d2-5cf8-4bb3-b8bd-984c01d05838.png" alt class="image--center mx-auto" /></p>
<p>The above diagram shows a typical modern Git + GitHub/GitLab/BitBucket workflow from local development to CI/CD and deployment. Each step both structures the work and protects quality.</p>
<h3 id="heading-step-12-sync-and-create-a-feature-branch">Step 1–2: Sync and Create a Feature Branch</h3>
<ol>
<li><p><code>git pull origin main</code> (update local main) – The developer first synchronizes the local main branch with the remote repository to ensure they build on the latest code, reducing later merge conflicts.</p>
</li>
<li><p><code>git checkout -b feature-branch</code> (create &amp; switch to branch) – A dedicated branch isolates the new feature or bug fix, keeping the <strong>main</strong> branch clean and deployable at all times.</p>
</li>
</ol>
<p>How this helps:</p>
<ul>
<li><p>Conflicts are minimized because everyone branches from a common, up‑to‑date base.</p>
</li>
<li><p>main remains stable, which supports trunk‑based development, GitHub Flow, or Git-flow style workflows.</p>
</li>
</ul>
<h3 id="heading-step-35-develop-stage-and-commit-locally">Step 3–5: Develop, Stage, and Commit Locally</h3>
<ol>
<li><p>Develop code &amp; run local tests – Work happens entirely on the local clone; developers can iterate, refactor, and run tests offline without impacting others.</p>
</li>
<li><p><code>git add &lt;files&gt;</code> (stage changes) – Staging lets developers build a precise set of changes into each commit, grouping related edits together.</p>
</li>
<li><p><code>git commit -m "message"</code> (commit changes) – Each commit records a snapshot plus a descriptive message, creating a clear, review-able history for future debugging and auditing.</p>
</li>
</ol>
<p>How this helps:</p>
<ul>
<li><p>Local commits are fast and independent of network latency.</p>
</li>
<li><p>Fine‑grained commits with good messages make code review and rollback straightforward.</p>
</li>
</ul>
<h3 id="heading-step-6-push-branch-to-remote">Step 6: Push Branch to Remote</h3>
<ol>
<li><code>git push origin feature-branch</code> (push branch to remote) – The feature branch is uploaded to GitHub/GitLab/BitBucket so others can review and CI pipelines can run.</li>
</ol>
<p>How this helps:</p>
<ul>
<li><p>Work becomes shareable and visible to teammates.</p>
</li>
<li><p>CI systems connected to the remote repo can automatically build and test the branch.</p>
</li>
</ul>
<h3 id="heading-step-78-open-pull-request-and-run-review-ci">Step 7–8: Open Pull Request and Run Review + CI</h3>
<ol>
<li>Create Pull Request (PR) against <code>main</code> – On the platform, the developer opens a PR (GitHub), merge request (GitLab), or similar in BitBucket, requesting that the feature branch be merged into main.</li>
</ol>
<p><strong>8a.</strong> Peer code review (approve/request changes) – Reviewers inspect the diff, comment on lines, suggest changes, and either approve or request revisions.</p>
<p><strong>8b.</strong> Automated CI pipeline (build, lint, test) – CI runs the configured jobs (unit tests, integration tests, linters, security scans) on the branch and reports status back to the PR.</p>
<p>How this helps:</p>
<ul>
<li><p>PRs formalize <strong>peer review</strong>, improving code quality and knowledge sharing, especially for junior developers.</p>
</li>
<li><p>Automated CI catches regressions early and blocks merges when tests fail, enforcing quality gates consistently.</p>
</li>
</ul>
<h3 id="heading-step-8-decision-pr-approved-amp-ci-passed">Step 8 Decision: PR Approved &amp; CI Passed?</h3>
<p>“PR Approved &amp; CI Passed?” – If reviewers request changes or CI fails, the developer returns to step 3, updates the code on the same branch, and pushes again; the PR and CI rerun automatically.</p>
<p>How this helps:</p>
<ul>
<li><p>Encourages iterative improvement until code quality and test coverage meet the team’s standards.</p>
</li>
<li><p>Keeps broken code from ever reaching main, which stabilizes releases.</p>
</li>
</ul>
<h3 id="heading-step-910-merge-and-deploy-via-cd">Step 9–10: Merge and Deploy via CD</h3>
<ol>
<li><p>Merge PR to <code>main</code> branch – Once approved and green, the platform merges the feature branch into main (often using squash or rebase strategies to keep history clean).</p>
</li>
<li><p>Automated CD pipeline (deploy to staging/production) – A CD pipeline triggers on changes to main, deploying to staging and/or production environments as configured.</p>
</li>
</ol>
<p>How this helps:</p>
<ul>
<li><p>Merges are controlled and auditable, with a clear link from commits to reviews and issues.</p>
</li>
<li><p>CD automates deployments, reducing manual errors and shortening time‑to‑production for each change.</p>
</li>
</ul>
<h3 id="heading-step-11-sync-local-after-deployment">Step 11: Sync Local After Deployment</h3>
<ol>
<li><code>git checkout main</code> &amp; <code>git pull</code> (sync local) – After the feature is merged and deployed, the developer switches back to main and pulls the latest state so the next feature starts from an up‑to‑date code base.</li>
</ol>
<p>How this helps:</p>
<ul>
<li><p>Ensures the developer’s local environment matches what is in production or staging.</p>
</li>
<li><p>Reduces future merge conflicts and keeps branches short‑lived, which aligns with modern Git-flow/GitHub Flow practices.</p>
</li>
</ul>
<h2 id="heading-conclusion">Conclusion</h2>
<p>In this article, we got a step-by-step walk through on how to install git and also how to use git for tracking our software projects, to make software development journey easier and organized. The below diagram is the concept summary of git workspace stages and what actions are commonly performed at each stage</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768645029947/fa3443be-b909-4381-b70f-474c15d66205.png" alt class="image--center mx-auto" /></p>
<p>If you liked my article, you can subscribe to my blog and get notified, whenever I write a new article on other topics relating to software engineering.</p>
<p>Namaste! Jai Hind!</p>
]]></content:encoded></item><item><title><![CDATA[Why Version Control Exists!? The “Pen-drive Problem”]]></title><description><![CDATA[If you have ever worked on source code of any commercial software or any web or mobile app, it is pretty unlikely that you have not come across any version controlling tools. Mostly, we see Git being widely used in almost all latest software code bas...]]></description><link>https://blogs.techshowcases.com/why-version-control-exists-the-pen-drive-problem</link><guid isPermaLink="true">https://blogs.techshowcases.com/why-version-control-exists-the-pen-drive-problem</guid><category><![CDATA[ChaiCode]]></category><category><![CDATA[chaicode webdev cohort 2026]]></category><category><![CDATA[Chaiaurcode]]></category><category><![CDATA[ChaiCohort]]></category><category><![CDATA[chai-code ]]></category><category><![CDATA[Git]]></category><category><![CDATA[vcs]]></category><category><![CDATA[GitHub]]></category><category><![CDATA[GitLab]]></category><category><![CDATA[Bitbucket]]></category><category><![CDATA[version control]]></category><category><![CDATA[version control systems]]></category><category><![CDATA[versioncontrol]]></category><category><![CDATA[versioning]]></category><dc:creator><![CDATA[Abhirup Roy]]></dc:creator><pubDate>Fri, 30 Jan 2026 14:31:46 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/842ofHC6MaI/upload/b0b83bc19d08ac73cfb6813674cff737.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1767007412364/03b80f44-2ca6-4eb0-b064-fdb6880a3db5.jpeg" alt class="image--center mx-auto" /></p>
<p>If you have ever worked on source code of any commercial software or any web or mobile app, it is pretty unlikely that you have not come across any version controlling tools. Mostly, we see Git being widely used in almost all latest software code bases, while few legacy code bases still use older version controlling software such as SVN (Apache subversion ) or Mercurial.</p>
<p>Has it ever crossed your mind, that why do we use it, or why do we even need it? I mean, there are already so many brain-melting jargons, tools and softwares in software development field, that have already made software development pretty overwhelming and scary for many of us, so, why another layer of trouble?</p>
<p>Let me help you understanding the the origin of “Version Control Systems” and how it saved us “developers”, from eternal dwelling of “my code has been modified! Who changed it?“ to the rabbit hole of “final“, “final_v2“, “latest_final“ directories of deliverable codes, especially in our modern day complex softwares used in wide range of machines. Hi! My name is Abhirup Roy, I am a software engineer with a decade of experience of working on different software code bases and I’ve seen these problems first-hand, repeatedly.</p>
<p>Today’s polished and fancy software development is an outcome of a continuous evolution from a time that predates 1970s, when software development was quite chaotic. Programmers used to store source code on physical punched cards, which they had to manually organize and store in boxes—essentially maintaining a manual versioning system. Later during 1970s, when Unix became popular computer operating system, developers began moving to time-shared computers. With multiple developers working on shared systems and files stored on disks, there was no systematic way to track who changed what, when, or why. Developers would manually copy files to create versions, risking accidental overwrites and data loss.</p>
<p>Let us use a flow diagram to understand this manual source code versioning menace a little better:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1767007335107/ec38b451-0ea1-42e7-ba9c-98e7b8588d90.png" alt class="image--center mx-auto" /></p>
<p>The core problems in this approach were:</p>
<ul>
<li><p>No way to track change history</p>
</li>
<li><p>No accountability for who made which changes</p>
</li>
<li><p>Manual file copying was error-prone</p>
</li>
<li><p>Reverting to a previous version was nearly impossible</p>
</li>
<li><p>Concurrent development caused constant conflicts</p>
</li>
</ul>
<p>A modern day analogy to this situation would be copying source code base to a pen-drive (aka USB flash drive) and sharing with your team of multiple developers, for collaborating and simultaneously working on different components of the software, altogether. In no time, all the above mentioned problems will infest your entire code base and the obvious result will be - “A Total mess”.</p>
<p>In search of solution to this problem, many legendary software engineers have developed different solutions over time, addressing various aspects of what a ‘version controlling tool’ should do.</p>
<h3 id="heading-era-1-local-version-control-systems-1972-1990s"><code>Era 1: Local Version Control Systems (1972 ~ 1990s)</code></h3>
<p>Marc Rochkind at Bell Laboratories, created “Source Code Control System (SCSS)“ in 1972, the first version control software. Originally written in SNOBOL for an IBM System/370, which Rochkind rewrote in C for UNIX OS in 1973. The first public release came on February 18, 1977.</p>
<p>SCCS introduced revolutionary concepts for its time:</p>
<ul>
<li><p><strong>Delta storage</strong>: Instead of storing complete copies of every version, SCCS stored only the differences (deltas) between versions using interleaved delta format, dramatically reducing storage requirements.​</p>
</li>
<li><p><strong>Version tracking</strong>: It maintained a history of all changes with metadata including who made changes, when, and comments (predecessors of today's commit messages)​</p>
</li>
<li><p><strong>Version numbering</strong>: It introduced versioning schemes like 1.1.1 and 1.2.5​</p>
</li>
<li><p><strong>Simple operations</strong>: Users could issue <code>get</code> commands to retrieve versions and <code>delta</code> commands to record changes</p>
</li>
</ul>
<p>However, SCCS had significant limitations. It was local-only (no network support), single-file only (tracked one file at a time, not entire projects), and used a locking mechanism where only one developer could edit a file at a time. Merging multiple developers' changes was impossible.</p>
<p>In 1982, Walter Tichy at Purdue University developed the Revision Control System (RCS), publishing his design in a landmark paper at ICSE'82. RCS maintained SCCS's core concepts but introduced a crucial innovation: <strong>reversed deltas</strong>. ​Rather than storing the original file plus forward deltas (SCCS's approach), RCS stored the most recent version in full and backward-pointing deltas to older versions. This optimization had profound implications: checking out the latest version became much faster (the most common operation), while retrieving older versions became slower. For typical workflows, this was an excellent trade-off. RCS brought additional improvements:</p>
<ul>
<li><p><strong>Better user experience</strong>: Users could specify either the working file or version file, not just version file commands​</p>
</li>
<li><p><strong>Improved locking mechanism</strong>: Unprivileged users could override locks, and lock-breakers received email notification​</p>
</li>
<li><p><strong>Delta format</strong>: Used the more efficient <code>diff</code> format instead of SCCS's interleaved deltas​</p>
</li>
</ul>
<p>RCS remained the dominant local version control system through the 1980s, but it still suffered from SCCS's fundamental limitation: only one developer could work on a file at a time. The field needed a breakthrough that would enable <strong>concurrent access.</strong></p>
<h3 id="heading-era-2-centralized-version-control-systems-1986-2004"><code>Era 2: Centralized Version Control Systems (1986 ~ 2004)</code></h3>
<p>Dick Grune developed the <strong>Concurrent Versions System (CVS)</strong> in July 1986 as a series of shell scripts (later rewritten in C by Brian Berliner in the 1990s). CVS represented a fundamental architectural leap: it was the first version control system to allow multiple developers to work on the same files simultaneously.​</p>
<p>CVS's innovations:</p>
<ul>
<li><p><strong>Client-server architecture</strong>: A central server stored the repository; developers checked out copies, made changes locally, and committed back​</p>
</li>
<li><p><strong>Project-level tracking</strong>: Unlike RCS and SCCS (file-level), CVS tracked entire projects and could manage atomic commits across multiple files​</p>
</li>
<li><p><strong>Network support</strong>: Developers could work from different machines over the network​</p>
</li>
<li><p><strong>Concurrent development</strong>: Multiple programmers could edit the same file without blocking each other​</p>
</li>
<li><p><strong>Merge operations</strong>: CVS implemented merge algorithms that combined concurrent changes​</p>
</li>
<li><p><strong>Branching and tagging</strong>: Full support for project branches and version tags​</p>
</li>
</ul>
<p>CVS used a clever approach, it operated as a "front-end to RCS," using RCS's file format internally while adding project-level features. This allowed developers to work independently on private copies and merge changes collaboratively.​</p>
<p>However, CVS had limitations. It struggled with <strong>binary file handling</strong>, <strong>directory operations</strong>, and <strong>atomic commits</strong> (a commit could partially succeed, leaving the repository in an inconsistent state). Additionally, it could only track entire files, not directories as first-class objects.​</p>
<p>Despite these limitations, CVS became the de facto standard for collaborative development by the 1990s.</p>
<p>By the 1990s, the growth of the internet drove demand for better remote repository access. <strong>Subversion (SVN)</strong> emerged as the spiritual successor to CVS, addressing major limitations:</p>
<ul>
<li><p><strong>Atomic commits</strong>: An entire change-set either commits fully or not at all</p>
</li>
<li><p><strong>Binary file support</strong>: True binary versioning without special handling</p>
</li>
<li><p><strong>Directory versioning</strong>: Directories are first-class objects</p>
</li>
<li><p><strong>Renamed file tracking</strong>: Handles file and directory renames properly​</p>
</li>
</ul>
<p>SVN and other centralized systems (Perforce, ClearCase, SourceSafe) dominated enterprise development through the 2000s. Their appeal was clear: a single source of truth, straightforward backup procedures, and centralized access control.​</p>
<p>However, centralized systems had inherent limitations that would become very obvious as the internet enabled distributed teams:</p>
<ul>
<li><p><strong>Network dependency</strong>: Developers needed constant server access to commit; offline work was limited</p>
</li>
<li><p><strong>Merge complexity</strong>: Centralizing changes created bottlenecks</p>
</li>
<li><p><strong>Single point of failure</strong>: The central server was critical infrastructure</p>
</li>
<li><p><strong>Slow operations</strong>: Many operations required round-trips to the server​</p>
</li>
</ul>
<p>The stage was set for a revolution.</p>
<h3 id="heading-era-3-distributed-version-control-systems-2005-present-day"><code>Era 3: Distributed Version Control Systems (2005 ~ Present Day)</code></h3>
<p>In 2004, the free license for BitKeeper—a proprietary distributed version control system used by the Linux kernel—was revoked. Linus Torvalds, who had led Linux kernel development for over a decade, faced an impossible choice: pay for proprietary software or find an alternative.​</p>
<p>Torvalds investigated existing free version control systems, but none met his stringent requirements. Linux kernel development required extreme performance: developers synchronized with 250+ patch operations simultaneously. With CVS taking 30 seconds per patch operation, synchronization would take hours. Torvalds specified aggressive design goals:​</p>
<ul>
<li><p><strong>Speed</strong>: Patching operations must complete in 3 seconds (he later achieved 6.7 patches/second)​</p>
</li>
<li><p><strong>Distributed workflow</strong>: Like BitKeeper, every developer needs a complete repository copy​</p>
</li>
<li><p><strong>Data integrity</strong>: Cryptographic safeguards against accidental or malicious corruption​</p>
</li>
<li><p><strong>Opposite of CVS</strong>: "Take CVS as an example of what <em>not</em> to do; if in doubt, make the exact opposite decision"​</p>
</li>
</ul>
<p>These requirements eliminated every existing system, so Torvalds built his own. Git development began April 3, 2005. Torvalds announced the project on April 6 and achieved self-hosting the next day. By April 29, he had benchmarked Git handling kernel patches at 6.7 patches per second—nearly 200x faster than CVS. On June 16, Git managed the Linux 2.6.12 release.​</p>
<h3 id="heading-gits-revolutionary-architecture"><strong>Git's Revolutionary Architecture</strong></h3>
<p>Git's design broke fundamental assumptions that had guided version control systems for 30 years:​</p>
<ol>
<li><p><strong>Distributed repositories</strong>: Every clone contains the full history. Developers work offline; synchronization happens through peer-to-peer push/pull operations rather than client-server check-in/check-out.​</p>
</li>
<li><p><strong>Snapshot-based architecture</strong>: Git snapshots entire directory trees, not individual file versions. Unlike RCS/SCCS/CVS (which tracked file identity), Git focuses on content itself. Files can be renamed, split, or merged without losing history.​</p>
</li>
<li><p><strong>Content-addressable file system</strong>: Each object (commit, tree, blob) is identified by SHA-1 hash of its contents. This provides cryptographic integrity—changing history would require recalculating all subsequent hashes, making corruption obvious.​</p>
</li>
<li><p><strong>Three-way merging</strong>: Git implements multiple merge strategies, with recursive merging (handling multiple common ancestors) as default, reducing merge conflicts.​</p>
</li>
<li><p><strong>Efficient storage</strong>: Git uses delta compression (storing changes relative to similar objects) and periodic "garbage collection" to maintain repository efficiency.​</p>
</li>
<li><p><strong>Lightweight branching</strong>: A branch is merely a reference to a commit, making branch creation trivial. This enables aggressive experimentation.​</p>
</li>
</ol>
<p>These architectural choices made Git fundamentally faster and more suitable for large-scale distributed development than any previous system.​ Other distributed systems like <strong>Mercurial</strong>, <strong>Bazaar</strong> and <strong>Darcs</strong> were also developed as alternative to Git. But Git outpaced them on speed and wide-spread adoption. Git's adoption curve is unprecedented in software development. This acceleration was driven by complementary factors:</p>
<ul>
<li><p><strong>GitHub</strong> (2008) - Transformed Git from a command-line tool into a social network for developers. GitHub introduced pull requests, a workflows innovation that simplified code review. By offering free public repositories and paid private repositories, GitHub democratized collaboration. Today, GitHub hosts over 200 million repositories.</p>
</li>
<li><p><strong>GitLab</strong> (2013) - GitLab provided self-hosted Git with integrated CI/CD, DevOps tooling, and enterprise security features. For organizations requiring on-premise infrastructure, GitLab offered a comprehensive DevOps platform.</p>
</li>
<li><p>BitBucket, Microsoft’s acquisition of GitHub and numerous other platform based on Git, cemented Git’s position as most favored choice for Version Controlling Software.</p>
</li>
</ul>
<p>Modern Git and Git-based platforms like GitHub, GitLab, and BitBucket have turned version control from a necessary burden into a productive, collaborative backbone for software teams. They make everyday work faster, safer, and more automated through branching, pull requests, and deep CI/CD integration.​</p>
<h3 id="heading-how-git-makes-developers-lives-easier">How Git Makes Developers’ Lives Easier</h3>
<ul>
<li><p>Git’s <strong>distributed</strong> model gives every developer a full local copy of the repository, so they can commit, diff, and browse history without any network connection. This removes central-server bottlenecks and lets work continue even when VPNs or servers are down.​</p>
</li>
<li><p>Lightweight <strong>branching and merging</strong> enable feature branches for every task, letting teams isolate experiments or bug fixes without risking the main production branch. This keeps main stable while still encouraging rapid change and experimentation.​</p>
</li>
<li><p>Detailed <strong>commit history</strong> with authors, timestamps, and messages allows easy blame/annotate, audit trails, and precise rollbacks when something goes wrong.​</p>
</li>
<li><p>Built‑in <strong>data integrity</strong> (cryptographic hashes for commits and objects) protects history from silent corruption or tampering, which is crucial for large, long‑lived projects.​</p>
</li>
<li><p><strong>Safer experimentation</strong>: Cheap branches plus PR review mean developers can try ideas without fear of breaking production; unwanted experiments can simply be deleted.​</p>
</li>
<li><p><strong>Better collaboration</strong>: Distributed Git plus GitHub/GitLab/BitBucket’s social features (PRs, comments, mentions, issues) let globally distributed teams work effectively across time zones.​</p>
</li>
<li><p><strong>Higher code quality</strong>: Mandatory review, automated testing, and protected branches dramatically reduce bugs reaching users and make it easy to trace when and why a regression appeared.​</p>
</li>
<li><p><strong>Faster delivery</strong>: The combination of feature branches, CI, and CD supports small, frequent releases rather than risky big‑bang deploys, aligning with agile and DevOps best practices.</p>
</li>
</ul>
<p>So, if you are new to software development fraternity, make friendship with Git and Git-based remote repository platforms. On the other hand, if you already have professional experience in software development, having an impressive GitHub profile with real proof of work is much better strategy for networking on X or LinkedIn or applying for Job posts.</p>
<p>If you liked my article, you can subscribe to my blog and get notified, whenever I write a new article on other topics relating to software engineering.</p>
<p>Namaste! Jai Hind!</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1767015325495/25891b4e-7031-4152-a045-7f6a347a5a35.png" alt class="image--center mx-auto" /></p>
]]></content:encoded></item></channel></rss>