<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Hemant</title>
    <description>The latest articles on Forem by Hemant (@hemant_the_devlpr).</description>
    <link>https://forem.com/hemant_the_devlpr</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1869455%2F9aa80937-1489-420d-9adc-598805be4f24.png</url>
      <title>Forem: Hemant</title>
      <link>https://forem.com/hemant_the_devlpr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/hemant_the_devlpr"/>
    <language>en</language>
    <item>
      <title># Git Tips for Real Life: Stuff That Actually Happens at Work</title>
      <dc:creator>Hemant</dc:creator>
      <pubDate>Tue, 16 Dec 2025 13:59:23 +0000</pubDate>
      <link>https://forem.com/hemant_the_devlpr/-git-tips-for-real-life-stuff-that-actually-happens-at-work-d12</link>
      <guid>https://forem.com/hemant_the_devlpr/-git-tips-for-real-life-stuff-that-actually-happens-at-work-d12</guid>
      <description>&lt;p&gt;This guide is all about those everyday Git headaches we all face. It's not fancy theory—it's real fixes with easy steps and commands you can copy-paste. I pulled it from my &lt;a href="https://github.com/hemant-dev-8/Git-Enterprise-Patterns-Practices/blob/main/README.md" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt; , so feel free to grab it and tweak for your own use.If you're wondering how I gathered all this info, a bit of AI magic to organize and double-check the details.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Real-World Git Scenario Questions&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Merge Strategy Scenarios&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Q1:&lt;/strong&gt; Your feature branch is 3 months behind main with hundreds of commits. You need to merge without breaking everything. What's your step-by-step approach?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q2:&lt;/strong&gt; You accidentally committed sensitive data (API keys) to a branch you already pushed. How do you remove it completely from history?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q3:&lt;/strong&gt; You need to deploy a hotfix but your current branch has experimental code. How do you extract just the stable changes?&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2. Rebase vs Merge Dilemmas&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Q4:&lt;/strong&gt; Team A says "always rebase before PR," Team B says "never rebase, always merge." Who's right for a shared feature branch with 4 developers?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q5:&lt;/strong&gt; You're asked to clean up 20 messy commits before code review. Do you use interactive rebase or squash merge? When does each backfire?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q6:&lt;/strong&gt; You rebased your branch, then someone else pushed to the same branch. Now you have diverged histories. How do you recover?&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3. Team Collaboration Issues&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Q7:&lt;/strong&gt; Two developers modified the same file in different ways. Git shows no conflict but the feature is broken. What went wrong?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q8:&lt;/strong&gt; Your CI/CD pipeline fails after a merge, but &lt;code&gt;git status&lt;/code&gt; is clean. How do you identify which specific commit introduced the bug?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q9:&lt;/strong&gt; A junior developer force-pushed to main, overwriting critical commits. How do you restore without losing recent valid work?&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4. Branch Management Problems&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Q10:&lt;/strong&gt; You created a branch called &lt;code&gt;featrue-login&lt;/code&gt; (typo). It's been pushed to remote and others are using it. How do you rename it properly?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q11:&lt;/strong&gt; Your PR has 15 commits, but company policy requires one commit per PR. You can't squash because others have based work on your branch. Solutions?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q12:&lt;/strong&gt; You need to work on 3 urgent bugs simultaneously. Do you create 3 branches from main, or branch from each other? How do you manage dependencies?&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;5. Advanced Recovery Scenarios&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Q13:&lt;/strong&gt; You ran &lt;code&gt;git reset --hard&lt;/code&gt; and lost uncommitted work. No stash, no backup. Is the data truly gone? Any recovery options?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q14:&lt;/strong&gt; During a complex rebase, you get stuck with conflicts you can't resolve. How do you abort safely without losing hours of work?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q15:&lt;/strong&gt; Git says "your branch is ahead by X commits, behind by Y commits." What does this actually mean, and how do you synchronize?&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;6. Performance &amp;amp; Optimization&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Q16:&lt;/strong&gt; Your repo is 5GB and cloning takes 30 minutes. Daily operations are slow. What investigation steps and fixes do you propose?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q17:&lt;/strong&gt; &lt;code&gt;git status&lt;/code&gt; shows "Changes not staged for commit" but &lt;code&gt;git diff&lt;/code&gt; shows nothing. What's happening and how do you fix it?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q18:&lt;/strong&gt; You need to find which commit introduced a specific line of code that's now causing a bug, but the file has been moved/renamed.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;7. CI/CD &amp;amp; Automation Issues&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Q19:&lt;/strong&gt; Your deployment script runs &lt;code&gt;git pull&lt;/code&gt; but fails with "would be overwritten" errors. How do you make it resilient?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q20:&lt;/strong&gt; You need to verify that the code being deployed matches exactly what was tested in the PR. How do you guarantee this with Git?&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;8. Permission &amp;amp; Security&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Q21:&lt;/strong&gt; A contractor pushed commits with their personal email instead of company email. How do you rewrite the author for already-pushed commits?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q22:&lt;/strong&gt; You need to give a developer access to only one specific branch in a repository. Is this possible with standard Git?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q23:&lt;/strong&gt; Your team uses both SSH and HTTPS to clone the same repo. Now you have authentication conflicts. Best practice solution?&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;9. Submodules &amp;amp; Complex Repos&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Q24:&lt;/strong&gt; Your project uses submodules. A teammate says "I updated the submodule" but your local copy doesn't show changes. What's happening?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q25:&lt;/strong&gt; You need to move a folder from a monorepo to its own repository while preserving history. What's the safest approach?&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;10. Real Emergency Scenarios&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Q26:&lt;/strong&gt; &lt;code&gt;git&lt;/code&gt; commands suddenly return "not a git repository" in your project folder. The &lt;code&gt;.git&lt;/code&gt; folder is missing. Recovery steps?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q27:&lt;/strong&gt; During a deploy, you realize the wrong branch was merged to production. How do you revert while minimizing downtime?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q28:&lt;/strong&gt; Your team uses "squash and merge" on PRs, but now you need to cherry-pick a fix that was squashed. How do you locate the actual change?&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;11. Git Hooks &amp;amp; Automation&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Q29:&lt;/strong&gt; Your pre-commit hook runs tests that take 2 minutes, slowing development. How do you balance code quality vs developer velocity?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q30:&lt;/strong&gt; A commit-msg hook enforces ticket numbers, but you need to make an urgent fix without a ticket. How do you bypass safely?&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Sample Answer to Q1 (The 3-month lag scenario):&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Approach:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;First, save your current state:&lt;/strong&gt; &lt;code&gt;git stash&lt;/code&gt; or commit everything locally as "WIP backup"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fetch latest main:&lt;/strong&gt; &lt;code&gt;git fetch origin main&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rebase incrementally:&lt;/strong&gt; Don't rebase all 3 months at once. Rebase week-by-week:
&lt;code&gt;git rebase --onto main~12weeks main~11weeks your-branch&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test at each milestone:&lt;/strong&gt; Run basic tests after each weekly chunk&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handle conflicts strategically:&lt;/strong&gt; When conflicts arise, create temporary fix commits, continue rebase, then fix properly later&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Final cleanup:&lt;/strong&gt; Interactive rebase to squash temporary fix commits&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pre-merge testing:&lt;/strong&gt; Create a test merge branch: &lt;code&gt;git checkout -b test-merge main &amp;amp;&amp;amp; git merge your-branch --no-ff&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI verification:&lt;/strong&gt; Push test branch to run full CI pipeline before merging to main&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Key Insight:&lt;/strong&gt; The real problem isn't the merge—it's that your tests/CI should have been running against main regularly. Setup regular merges from main to your feature branch (weekly) to avoid this.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Comprehensive Git Scenario Solutions for Enterprise Developers&lt;/strong&gt;
&lt;/h1&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;1. Merge Strategy Scenarios&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Q1: Your feature branch is 3 months behind main with hundreds of commits. You need to merge without breaking everything.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Step-by-Step Strategy:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. First, save your current work&lt;/span&gt;
git stash push &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"pre-merge-backup"&lt;/span&gt;
&lt;span class="c"&gt;# Or commit it as a backup&lt;/span&gt;
git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"WIP: Backup before major merge"&lt;/span&gt;

&lt;span class="c"&gt;# 2. Fetch the absolute latest main&lt;/span&gt;
git fetch origin main &lt;span class="nt"&gt;--prune&lt;/span&gt;

&lt;span class="c"&gt;# 3. Create a merge-base branch to understand the gap&lt;/span&gt;
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; merge-base &lt;span class="si"&gt;$(&lt;/span&gt;git merge-base main feature-branch&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="c"&gt;# This shows you where you diverged 3 months ago&lt;/span&gt;

&lt;span class="c"&gt;# 4. Do a test merge in a new branch FIRST&lt;/span&gt;
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; test-merge main
git merge feature-branch &lt;span class="nt"&gt;--no-commit&lt;/span&gt; &lt;span class="nt"&gt;--no-ff&lt;/span&gt;
&lt;span class="c"&gt;# The --no-commit flag lets you see what would happen without actually committing&lt;/span&gt;

&lt;span class="c"&gt;# 5. If conflicts appear immediately, abort and strategize&lt;/span&gt;
&lt;span class="c"&gt;# Check what files will conflict:&lt;/span&gt;
git diff &lt;span class="nt"&gt;--name-only&lt;/span&gt; &lt;span class="nt"&gt;--diff-filter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;U

&lt;span class="c"&gt;# 6. Instead of one massive rebase, do incremental merges&lt;/span&gt;
&lt;span class="c"&gt;# Create a temporary branch from where you diverged&lt;/span&gt;
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; incremental-merge &lt;span class="si"&gt;$(&lt;/span&gt;git merge-base main feature-branch&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# 7. Cherry-pick or merge in chunks (weekly/monthly)&lt;/span&gt;
&lt;span class="c"&gt;# Get commits from your feature branch, grouped by time&lt;/span&gt;
git log &lt;span class="nt"&gt;--oneline&lt;/span&gt; &lt;span class="nt"&gt;--since&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"3 months ago"&lt;/span&gt; &lt;span class="nt"&gt;--until&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"2.5 months ago"&lt;/span&gt;
&lt;span class="c"&gt;# Cherry-pick manageable chunks&lt;/span&gt;
git cherry-pick &amp;lt;commit-range&amp;gt;  &lt;span class="c"&gt;# Use with careful review&lt;/span&gt;

&lt;span class="c"&gt;# 8. OR use git rerere (reuse recorded resolution) to help&lt;/span&gt;
git config rerere.enabled &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;span class="c"&gt;# This remembers how you resolved conflicts and reuses them&lt;/span&gt;

&lt;span class="c"&gt;# 9. Best approach: Merge main into your branch regularly going forward&lt;/span&gt;
git checkout feature-branch
git merge main &lt;span class="nt"&gt;--no-ff&lt;/span&gt;
&lt;span class="c"&gt;# Yes, merge main INTO your feature branch, not the other way around&lt;/span&gt;
&lt;span class="c"&gt;# This keeps your branch updated and conflicts manageable&lt;/span&gt;

&lt;span class="c"&gt;# 10. Use a visual merge tool for complex conflicts&lt;/span&gt;
git mergetool  &lt;span class="c"&gt;# Configure your preferred tool (vscode, meld, kdiff3)&lt;/span&gt;

&lt;span class="c"&gt;# 11. After merging main into your branch, run tests&lt;/span&gt;
&lt;span class="c"&gt;# Then you can safely merge your branch back to main&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Critical Insight:&lt;/strong&gt; The real solution starts &lt;strong&gt;before&lt;/strong&gt; this problem. Setup automation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# In your CI pipeline, add:&lt;/span&gt;
&lt;span class="c"&gt;# "Daily: Merge main into all feature branches older than 3 days"&lt;/span&gt;
&lt;span class="c"&gt;# This prevents the 3-month gap from happening&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Q2: You accidentally committed sensitive data (API keys) to a branch you already pushed.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Immediate Action Plan:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. DO NOT PANIC. First, invalidate the exposed credentials&lt;/span&gt;
&lt;span class="c"&gt;# Contact your security team/rotate API keys immediately&lt;/span&gt;

&lt;span class="c"&gt;# 2. Local cleanup with BFG Repo-Cleaner (recommended) or git filter-repo&lt;/span&gt;
&lt;span class="c"&gt;# Download BFG: https://rtyley.github.io/bfg-repo-cleaner/&lt;/span&gt;

&lt;span class="c"&gt;# 3. Remove the sensitive file from ALL history&lt;/span&gt;
bfg &lt;span class="nt"&gt;--delete-files&lt;/span&gt; config/credentials.json
&lt;span class="c"&gt;# Or remove specific strings:&lt;/span&gt;
bfg &lt;span class="nt"&gt;--replace-text&lt;/span&gt; passwords.txt  &lt;span class="c"&gt;# passwords.txt contains: PASSWORD1==&amp;gt;***&lt;/span&gt;

&lt;span class="c"&gt;# 4. Force push (this is the ONE time force push is acceptable)&lt;/span&gt;
git push origin &lt;span class="nt"&gt;--force&lt;/span&gt; &lt;span class="nt"&gt;--all&lt;/span&gt;

&lt;span class="c"&gt;# 5. Notify EVERYONE on the team&lt;/span&gt;
&lt;span class="c"&gt;# They must: git fetch origin &amp;amp;&amp;amp; git reset --hard origin/feature-branch&lt;/span&gt;

&lt;span class="c"&gt;# 6. For multiple branches, you need to clean each&lt;/span&gt;
git checkout main
bfg &lt;span class="nt"&gt;--delete-files&lt;/span&gt; credentials.json
git reflog expire &lt;span class="nt"&gt;--expire&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;now &lt;span class="nt"&gt;--all&lt;/span&gt;
git gc &lt;span class="nt"&gt;--prune&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;now &lt;span class="nt"&gt;--aggressive&lt;/span&gt;
git push origin &lt;span class="nt"&gt;--force&lt;/span&gt;

&lt;span class="c"&gt;# 7. Add to .gitignore immediately&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"config/credentials.json"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; .gitignore
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;".env"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; .gitignore
git add .gitignore
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Add sensitive files to gitignore"&lt;/span&gt;

&lt;span class="c"&gt;# 8. Use git-secret or git-crypt for future secrets&lt;/span&gt;
&lt;span class="c"&gt;# Pre-commit hook to prevent secrets:&lt;/span&gt;
&lt;span class="c"&gt;# https://github.com/awslabs/git-secrets&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Alternative if BFG isn't available:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Using git filter-branch (slower but built-in)&lt;/span&gt;
git filter-branch &lt;span class="nt"&gt;--force&lt;/span&gt; &lt;span class="nt"&gt;--index-filter&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"git rm --cached --ignore-unmatch config/credentials.json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--prune-empty&lt;/span&gt; &lt;span class="nt"&gt;--tag-name-filter&lt;/span&gt; &lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Q3: You need to deploy a hotfix but your current branch has experimental code.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Strategic Extraction:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Method 1: Stash selectively&lt;/span&gt;
&lt;span class="c"&gt;# 1. First, commit your experimental work as WIP&lt;/span&gt;
git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"WIP: Experimental feature - DO NOT MERGE"&lt;/span&gt;

&lt;span class="c"&gt;# 2. Create hotfix branch from main (clean state)&lt;/span&gt;
git checkout main
git pull origin main
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; hotfix/urgent-issue

&lt;span class="c"&gt;# 3. Make and test your hotfix&lt;/span&gt;
&lt;span class="c"&gt;# ... fix the bug ...&lt;/span&gt;
git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"fix: critical production issue [PROD-123]"&lt;/span&gt;

&lt;span class="c"&gt;# 4. Deploy from hotfix branch&lt;/span&gt;
&lt;span class="c"&gt;# Merge to main and tag&lt;/span&gt;
git checkout main
git merge &lt;span class="nt"&gt;--no-ff&lt;/span&gt; hotfix/urgent-issue
git tag &lt;span class="nt"&gt;-a&lt;/span&gt; v1.2.3-hotfix &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Hotfix for PROD-123"&lt;/span&gt;

&lt;span class="c"&gt;# 5. Return to your feature branch and continue&lt;/span&gt;
git checkout feature-branch
&lt;span class="c"&gt;# If you need the hotfix in your feature branch too:&lt;/span&gt;
git merge hotfix/urgent-issue

&lt;span class="c"&gt;# Method 2: Cherry-pick specific commits&lt;/span&gt;
&lt;span class="c"&gt;# If the fix is already in your experimental branch&lt;/span&gt;
git log &lt;span class="nt"&gt;--oneline&lt;/span&gt; &lt;span class="nt"&gt;--grep&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"fix"&lt;/span&gt;
&lt;span class="c"&gt;# Copy the commit hash&lt;/span&gt;
git checkout main
git cherry-pick &amp;lt;commit-hash&amp;gt;  &lt;span class="c"&gt;# Only the fix, not the experimental code&lt;/span&gt;

&lt;span class="c"&gt;# Method 3: Checkout specific files&lt;/span&gt;
git checkout main &lt;span class="nt"&gt;--&lt;/span&gt; path/to/file/needing/fix.js
&lt;span class="c"&gt;# This brings just that file from main to your current branch&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;2. Rebase vs Merge Dilemmas&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Q4: Team A says "always rebase before PR," Team B says "never rebase, always merge." Who's right?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The Pragmatic Answer:&lt;/strong&gt; It depends on your workflow and team size.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use REBASE when:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Scenario 1: Solo developer or feature owner&lt;/span&gt;
&lt;span class="c"&gt;# You're cleaning up your own messy commit history&lt;/span&gt;
git rebase &lt;span class="nt"&gt;-i&lt;/span&gt; main

&lt;span class="c"&gt;# Scenario 2: Preparing a PR for review&lt;/span&gt;
&lt;span class="c"&gt;# You want a clean, linear history for reviewers&lt;/span&gt;
git fetch origin main
git rebase origin/main
&lt;span class="c"&gt;# This replays your commits on top of latest main&lt;/span&gt;

&lt;span class="c"&gt;# Scenario 3: Fixing a typo in an earlier commit&lt;/span&gt;
git rebase &lt;span class="nt"&gt;-i&lt;/span&gt; HEAD~3
&lt;span class="c"&gt;# Change "pick" to "edit" for the commit with typo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Use MERGE when:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Scenario 1: Shared feature branch with 4 developers&lt;/span&gt;
&lt;span class="c"&gt;# NEVER rebase a shared branch - you'll rewrite public history&lt;/span&gt;
git merge main  &lt;span class="c"&gt;# Merge main into feature branch&lt;/span&gt;
&lt;span class="c"&gt;# This preserves everyone's work and creates a merge commit&lt;/span&gt;

&lt;span class="c"&gt;# Scenario 2: You want to preserve the true development history&lt;/span&gt;
&lt;span class="c"&gt;# Merge commits show when features were integrated&lt;/span&gt;
git merge &lt;span class="nt"&gt;--no-ff&lt;/span&gt; feature-branch
&lt;span class="c"&gt;# Creates explicit merge commit (good for audit trails)&lt;/span&gt;

&lt;span class="c"&gt;# Scenario 3: Completing a feature/PR&lt;/span&gt;
&lt;span class="c"&gt;# On main: git merge --no-ff feature-branch&lt;/span&gt;
&lt;span class="c"&gt;# This marks the completion point clearly&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Hybrid Approach (Best Practice):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Individual developers: rebase locally&lt;/span&gt;
git rebase &lt;span class="nt"&gt;-i&lt;/span&gt; @&lt;span class="o"&gt;{&lt;/span&gt;u&lt;span class="o"&gt;}&lt;/span&gt;~3  &lt;span class="c"&gt;# Interactive rebase last 3 commits&lt;/span&gt;

&lt;span class="c"&gt;# Team branch: merge regularly&lt;/span&gt;
git checkout team-feature-branch
git merge main &lt;span class="nt"&gt;--no-ff&lt;/span&gt;  &lt;span class="c"&gt;# Keep updated with main&lt;/span&gt;

&lt;span class="c"&gt;# PR completion: squash or merge based on policy&lt;/span&gt;
&lt;span class="c"&gt;# For clean history: git merge --squash feature-branch&lt;/span&gt;
&lt;span class="c"&gt;# For full history: git merge --no-ff feature-branch&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Q5: Clean up 20 messy commits before code review. Interactive rebase or squash merge?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;When to use Interactive Rebase:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# You want to:&lt;/span&gt;
&lt;span class="c"&gt;# 1. Reorder commits logically&lt;/span&gt;
&lt;span class="c"&gt;# 2. Split large commits into smaller ones&lt;/span&gt;
&lt;span class="c"&gt;# 3. Rewrite commit messages&lt;/span&gt;
&lt;span class="c"&gt;# 4. Remove debug commits entirely&lt;/span&gt;

git rebase &lt;span class="nt"&gt;-i&lt;/span&gt; HEAD~20
&lt;span class="c"&gt;# Then:&lt;/span&gt;
&lt;span class="c"&gt;# - pick: keep commit&lt;/span&gt;
&lt;span class="c"&gt;# - reword: change message&lt;/span&gt;
&lt;span class="c"&gt;# - edit: modify commit contents&lt;/span&gt;
&lt;span class="c"&gt;# - squash: combine with previous&lt;/span&gt;
&lt;span class="c"&gt;# - fixup: combine and discard message&lt;/span&gt;
&lt;span class="c"&gt;# - drop: remove commit&lt;/span&gt;

&lt;span class="c"&gt;# Example transformation:&lt;/span&gt;
&lt;span class="c"&gt;# Before: 20 commits with "WIP", "fix", "oops", "tmp"&lt;/span&gt;
&lt;span class="c"&gt;# After: 5 logical commits:&lt;/span&gt;
&lt;span class="c"&gt;# 1. feat: add user authentication&lt;/span&gt;
&lt;span class="c"&gt;# 2. test: auth unit tests  &lt;/span&gt;
&lt;span class="c"&gt;# 3. refactor: auth middleware&lt;/span&gt;
&lt;span class="c"&gt;# 4. docs: update API docs&lt;/span&gt;
&lt;span class="c"&gt;# 5. chore: update dependencies&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;When to use Squash Merge (in PR/GitHub/GitLab):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Use squash merge when:&lt;/span&gt;
&lt;span class="c"&gt;# 1. The PR has many small commits that tell a story&lt;/span&gt;
&lt;span class="c"&gt;# 2. You want to preserve the PR discussion history&lt;/span&gt;
&lt;span class="c"&gt;# 3. Individual commit quality is poor but overall change is good&lt;/span&gt;

&lt;span class="c"&gt;# GitHub/GitLab provides "Squash and merge" button&lt;/span&gt;
&lt;span class="c"&gt;# This creates ONE clean commit on main while keeping&lt;/span&gt;
&lt;span class="c"&gt;# the messy development history in the feature branch&lt;/span&gt;

&lt;span class="c"&gt;# NEVER squash if:&lt;/span&gt;
&lt;span class="c"&gt;# - Commits are already clean and logical&lt;/span&gt;
&lt;span class="c"&gt;# - You need to cherry-pick individual fixes later&lt;/span&gt;
&lt;span class="c"&gt;# - You're working with git bisect (squash breaks it)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Danger of Interactive Rebase:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# If others have already based work on your branch:&lt;/span&gt;
&lt;span class="c"&gt;# DO NOT REBASE&lt;/span&gt;
&lt;span class="c"&gt;# You'll force them to do painful resets&lt;/span&gt;

&lt;span class="c"&gt;# Check if branch is shared:&lt;/span&gt;
git branch &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="nt"&gt;--contains&lt;/span&gt; feature-branch
&lt;span class="c"&gt;# If others see it, use merge instead&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Q6: You rebased your branch, then someone else pushed to the same branch.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Recovery Process:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. First, don't panic and DON'T force push&lt;/span&gt;
git fetch origin

&lt;span class="c"&gt;# 2. See what happened:&lt;/span&gt;
git log &lt;span class="nt"&gt;--oneline&lt;/span&gt; &lt;span class="nt"&gt;--graph&lt;/span&gt; origin/feature-branch feature-branch

&lt;span class="c"&gt;# 3. You have two options:&lt;/span&gt;

&lt;span class="c"&gt;# Option A: Merge the diverged branches&lt;/span&gt;
git merge origin/feature-branch
&lt;span class="c"&gt;# This creates a merge commit reconciling both histories&lt;/span&gt;

&lt;span class="c"&gt;# Option B: Rebase again (if you MUST have linear history)&lt;/span&gt;
git pull &lt;span class="nt"&gt;--rebase&lt;/span&gt; origin feature-branch
&lt;span class="c"&gt;# This replays your new commits on top of their new commits&lt;/span&gt;

&lt;span class="c"&gt;# 4. If you already force-pushed (bad!):&lt;/span&gt;
&lt;span class="c"&gt;# Roll back and fix properly&lt;/span&gt;
git reflog  &lt;span class="c"&gt;# Find where you were before disaster&lt;/span&gt;
git reset &lt;span class="nt"&gt;--hard&lt;/span&gt; HEAD@&lt;span class="o"&gt;{&lt;/span&gt;5&lt;span class="o"&gt;}&lt;/span&gt;  &lt;span class="c"&gt;# Go back 5 operations&lt;/span&gt;

&lt;span class="c"&gt;# 5. Best practice: Use --force-with-lease&lt;/span&gt;
git push &lt;span class="nt"&gt;--force-with-lease&lt;/span&gt; origin feature-branch
&lt;span class="c"&gt;# This fails if someone else pushed, preventing overwrites&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;3. Team Collaboration Issues&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Q7: Two developers modified the same file differently. Git shows no conflict but feature is broken.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The Silent Conflict Problem:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# This happens with:&lt;/span&gt;
&lt;span class="c"&gt;# 1. Non-conflicting but incompatible changes&lt;/span&gt;
&lt;span class="c"&gt;# Example: &lt;/span&gt;
&lt;span class="c"&gt;# Dev A changed function signature: processUser(user)&lt;/span&gt;
&lt;span class="c"&gt;# Dev B calls the function: processUser(user, true)&lt;/span&gt;

&lt;span class="c"&gt;# 2. Changes to different parts that break runtime&lt;/span&gt;
&lt;span class="c"&gt;# 3. Dependency updates that aren't compatible&lt;/span&gt;

&lt;span class="c"&gt;# Detection:&lt;/span&gt;
&lt;span class="c"&gt;# 1. Run integration tests (should catch this)&lt;/span&gt;
&lt;span class="c"&gt;# 2. Use semantic conflict detection tools&lt;/span&gt;

&lt;span class="c"&gt;# Solution:&lt;/span&gt;
&lt;span class="c"&gt;# 1. Better communication - talk before changing shared interfaces&lt;/span&gt;
&lt;span class="c"&gt;# 2. Feature flags for major changes&lt;/span&gt;
&lt;span class="c"&gt;# 3. API versioning for breaking changes&lt;/span&gt;

&lt;span class="c"&gt;# Git command to see combined changes:&lt;/span&gt;
git diff HEAD...origin/main &lt;span class="nt"&gt;--&lt;/span&gt; path/to/file.js
&lt;span class="c"&gt;# Shows total difference between your branch and main&lt;/span&gt;

&lt;span class="c"&gt;# Use git blame to understand who changed what:&lt;/span&gt;
git blame &lt;span class="nt"&gt;-L&lt;/span&gt; 50,100 file.js  &lt;span class="c"&gt;# Lines 50-100&lt;/span&gt;
&lt;span class="c"&gt;# Then talk to that person!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Q8: CI/CD pipeline fails after a merge, but &lt;code&gt;git status&lt;/code&gt; is clean.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Debugging Strategy:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. First, reproduce locally&lt;/span&gt;
git checkout main
git pull origin main
npm &lt;span class="nb"&gt;install&lt;/span&gt;  &lt;span class="c"&gt;# Or your package manager&lt;/span&gt;
npm &lt;span class="nb"&gt;test&lt;/span&gt;     &lt;span class="c"&gt;# Run the same tests as CI&lt;/span&gt;

&lt;span class="c"&gt;# 2. If tests pass locally, check environment differences&lt;/span&gt;
&lt;span class="c"&gt;# Common issues:&lt;/span&gt;
&lt;span class="c"&gt;# - Node version mismatch&lt;/span&gt;
&lt;span class="c"&gt;# - Missing environment variables&lt;/span&gt;
&lt;span class="c"&gt;# - Different OS (Linux vs Windows line endings)&lt;/span&gt;

&lt;span class="c"&gt;# 3. Use git bisect to find the culprit&lt;/span&gt;
git bisect start
git bisect bad  &lt;span class="c"&gt;# Current commit fails&lt;/span&gt;
git bisect good v1.0.0  &lt;span class="c"&gt;# Last known good version&lt;/span&gt;

&lt;span class="c"&gt;# Git will binary search through commits&lt;/span&gt;
&lt;span class="c"&gt;# For each commit, run your test script&lt;/span&gt;
git bisect run npm &lt;span class="nb"&gt;test&lt;/span&gt;

&lt;span class="c"&gt;# 4. Check for hidden files&lt;/span&gt;
git clean &lt;span class="nt"&gt;-xdn&lt;/span&gt;  &lt;span class="c"&gt;# Show what would be removed (dry run)&lt;/span&gt;
git clean &lt;span class="nt"&gt;-xdf&lt;/span&gt;  &lt;span class="c"&gt;# Actually remove untracked files&lt;/span&gt;

&lt;span class="c"&gt;# 5. Check submodules if used&lt;/span&gt;
git submodule status
git submodule update &lt;span class="nt"&gt;--init&lt;/span&gt; &lt;span class="nt"&gt;--recursive&lt;/span&gt;

&lt;span class="c"&gt;# 6. Look at the actual merge commit&lt;/span&gt;
git show &lt;span class="nt"&gt;--name-only&lt;/span&gt; MERGE_HEAD
&lt;span class="c"&gt;# Shows files changed in merge&lt;/span&gt;

&lt;span class="c"&gt;# 7. Check for file permissions (common on Linux)&lt;/span&gt;
git diff &lt;span class="nt"&gt;--summary&lt;/span&gt;  &lt;span class="c"&gt;# Shows mode changes (755 vs 644)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Q9: Junior developer force-pushed to main, overwriting critical commits.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Emergency Recovery:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. IMMEDIATELY lock the main branch&lt;/span&gt;
&lt;span class="c"&gt;# GitHub/GitLab: Settings → Branches → Protect main branch&lt;/span&gt;
&lt;span class="c"&gt;# Require pull requests, disable force push&lt;/span&gt;

&lt;span class="c"&gt;# 2. Find the lost commits&lt;/span&gt;
&lt;span class="c"&gt;# Every developer who pulled before the force push has them&lt;/span&gt;
git reflog show origin/main
&lt;span class="c"&gt;# Look for commits before the bad push&lt;/span&gt;

&lt;span class="c"&gt;# 3. Restore main to previous state&lt;/span&gt;
&lt;span class="c"&gt;# Find the good commit hash from reflog&lt;/span&gt;
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; recovery-branch &amp;lt;good-commit-hash&amp;gt;

&lt;span class="c"&gt;# 4. Force push the correct history BACK&lt;/span&gt;
git push origin recovery-branch:main &lt;span class="nt"&gt;--force&lt;/span&gt;
&lt;span class="c"&gt;# Yes, you need to force push to fix a force push&lt;/span&gt;

&lt;span class="c"&gt;# 5. Notify everyone to reset&lt;/span&gt;
&lt;span class="c"&gt;# Team must run:&lt;/span&gt;
git fetch origin
git reset &lt;span class="nt"&gt;--hard&lt;/span&gt; origin/main

&lt;span class="c"&gt;# 6. If commits are truly lost from all origins:&lt;/span&gt;
&lt;span class="c"&gt;# Check CI system artifacts - they often clone repos&lt;/span&gt;
&lt;span class="c"&gt;# Check backup systems&lt;/span&gt;
&lt;span class="c"&gt;# Check other developers' machines&lt;/span&gt;

&lt;span class="c"&gt;# 7. Implement prevention:&lt;/span&gt;
&lt;span class="c"&gt;# Pre-receive hooks on server:&lt;/span&gt;
&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# Prevent force push to main&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"refs/heads/main"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Force push to main is prohibited"&lt;/span&gt;
    &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# 8. Train the junior developer&lt;/span&gt;
&lt;span class="c"&gt;# Teach: git revert instead of git reset --hard&lt;/span&gt;
&lt;span class="c"&gt;# Teach: git push --force-with-lease&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;4. Branch Management Problems&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Q10: Rename a branch with typo that's already pushed and used by others.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Safe Rename Process:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Scenario: Branch "featrue-login" (typo) instead of "feature-login"&lt;/span&gt;

&lt;span class="c"&gt;# Step 1: Rename locally FIRST&lt;/span&gt;
git branch &lt;span class="nt"&gt;-m&lt;/span&gt; featrue-login feature-login

&lt;span class="c"&gt;# Step 2: Push the new name to remote&lt;/span&gt;
git push origin feature-login

&lt;span class="c"&gt;# Step 3: Delete the old name from remote&lt;/span&gt;
git push origin &lt;span class="nt"&gt;--delete&lt;/span&gt; featrue-login

&lt;span class="c"&gt;# Step 4: Update tracking relationship&lt;/span&gt;
git branch &lt;span class="nt"&gt;--unset-upstream&lt;/span&gt;  &lt;span class="c"&gt;# Remove old tracking&lt;/span&gt;
git branch &lt;span class="nt"&gt;-u&lt;/span&gt; origin/feature-login  &lt;span class="c"&gt;# Set new tracking&lt;/span&gt;

&lt;span class="c"&gt;# Step 5: Communicate to team members&lt;/span&gt;
&lt;span class="c"&gt;# They need to:&lt;/span&gt;
git fetch origin
git checkout featrue-login
git branch &lt;span class="nt"&gt;-m&lt;/span&gt; featrue-login feature-login
git branch &lt;span class="nt"&gt;--unset-upstream&lt;/span&gt;
git branch &lt;span class="nt"&gt;-u&lt;/span&gt; origin/feature-login

&lt;span class="c"&gt;# If someone has local commits not pushed:&lt;/span&gt;
git checkout featrue-login
git branch &lt;span class="nt"&gt;-m&lt;/span&gt; feature-login  &lt;span class="c"&gt;# Rename&lt;/span&gt;
git fetch origin
git reset &lt;span class="nt"&gt;--hard&lt;/span&gt; origin/feature-login  &lt;span class="c"&gt;# Align with remote&lt;/span&gt;

&lt;span class="c"&gt;# Alternative if many people are using it:&lt;/span&gt;
&lt;span class="c"&gt;# Keep both branches temporarily&lt;/span&gt;
git push origin feature-login
&lt;span class="c"&gt;# Don't delete old branch yet&lt;/span&gt;
&lt;span class="c"&gt;# Update documentation&lt;/span&gt;
&lt;span class="c"&gt;# After 2 weeks, delete old branch&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Q11: PR has 15 commits but company requires one commit per PR. Others have based work on your branch.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Solutions Without Breaking Others:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Option 1: Create a new squashed branch&lt;/span&gt;
git checkout main
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; feature-login-squashed
git merge &lt;span class="nt"&gt;--squash&lt;/span&gt; feature-login
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"feat: complete login implementation"&lt;/span&gt;
&lt;span class="c"&gt;# Push this NEW branch for PR&lt;/span&gt;

&lt;span class="c"&gt;# Keep original branch for others&lt;/span&gt;
git checkout feature-login
&lt;span class="c"&gt;# Others continue working here&lt;/span&gt;

&lt;span class="c"&gt;# Option 2: Use GitHub/GitLab squash merge feature&lt;/span&gt;
&lt;span class="c"&gt;# Keep all 15 commits in feature branch&lt;/span&gt;
&lt;span class="c"&gt;# Use UI "Squash and merge" button when approving PR&lt;/span&gt;
&lt;span class="c"&gt;# This creates 1 commit on main but preserves branch history&lt;/span&gt;

&lt;span class="c"&gt;# Option 3: Interactive rebase with backup branch&lt;/span&gt;
&lt;span class="c"&gt;# First, create backup for others&lt;/span&gt;
git branch feature-login-backup feature-login

&lt;span class="c"&gt;# Now squash locally&lt;/span&gt;
git checkout feature-login
git rebase &lt;span class="nt"&gt;-i&lt;/span&gt; main
&lt;span class="c"&gt;# Change all but first "pick" to "squash"&lt;/span&gt;

&lt;span class="c"&gt;# Force push with warning&lt;/span&gt;
git push origin feature-login &lt;span class="nt"&gt;--force-with-lease&lt;/span&gt;

&lt;span class="c"&gt;# Tell team members to rebase:&lt;/span&gt;
git fetch origin
git rebase origin/feature-login

&lt;span class="c"&gt;# Option 4: Change company policy&lt;/span&gt;
&lt;span class="c"&gt;# Argue that:&lt;/span&gt;
&lt;span class="c"&gt;# - Multiple commits help with bisect debugging&lt;/span&gt;
&lt;span class="c"&gt;# - They preserve development context&lt;/span&gt;
&lt;span class="c"&gt;# - Tools like git blame work better&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Q12: Work on 3 urgent bugs simultaneously.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Branch Strategy:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Recommended: Branch from main for each bug&lt;/span&gt;
git checkout main
git pull origin main
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; hotfix/bug-1

git checkout main
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; hotfix/bug-2

git checkout main  
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; hotfix/bug-3

&lt;span class="c"&gt;# Work on them in any order&lt;/span&gt;
&lt;span class="c"&gt;# When fixing bug-1:&lt;/span&gt;
git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"fix: resolve null pointer in user service [BUG-1]"&lt;/span&gt;

&lt;span class="c"&gt;# If bug-2 depends on bug-1 fix:&lt;/span&gt;
git checkout hotfix/bug-2
git merge hotfix/bug-1 &lt;span class="nt"&gt;--no-ff&lt;/span&gt;
&lt;span class="c"&gt;# Now bug-2 branch has bug-1 fix&lt;/span&gt;

&lt;span class="c"&gt;# Merge strategy:&lt;/span&gt;
&lt;span class="c"&gt;# 1. Merge smallest/independent fixes first&lt;/span&gt;
&lt;span class="c"&gt;# 2. Test each fix individually before combining&lt;/span&gt;

&lt;span class="c"&gt;# Bad approach: Branch from each other&lt;/span&gt;
&lt;span class="c"&gt;# Creates dependency chain that's hard to untangle&lt;/span&gt;

&lt;span class="c"&gt;# Use git worktree for parallel work:&lt;/span&gt;
git worktree add ../bug-1 hotfix/bug-1
git worktree add ../bug-2 hotfix/bug-2
&lt;span class="c"&gt;# Now you have separate folders for each branch&lt;/span&gt;
&lt;span class="c"&gt;# Can work on all simultaneously without stashing&lt;/span&gt;

&lt;span class="c"&gt;# Stashing alternative:&lt;/span&gt;
git stash push &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"bug-1-wip"&lt;/span&gt;
git checkout hotfix/bug-2
&lt;span class="c"&gt;# ... fix bug-2 ...&lt;/span&gt;
git stash pop  &lt;span class="c"&gt;# Return to bug-1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;5. Advanced Recovery Scenarios&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Q13: Ran &lt;code&gt;git reset --hard&lt;/code&gt;, lost uncommitted work. No stash, no backup.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Data Recovery Options:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Check if your IDE/editor has local history&lt;/span&gt;
&lt;span class="c"&gt;# VSCode: Local History extension&lt;/span&gt;
&lt;span class="c"&gt;# IntelliJ: Local History feature&lt;/span&gt;
&lt;span class="c"&gt;# Most editors keep temporary backups&lt;/span&gt;

&lt;span class="c"&gt;# 2. Check for file system recovery&lt;/span&gt;
&lt;span class="c"&gt;# On Unix: check .swp, .swo files (vim recovery)&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; .&lt;span class="k"&gt;*&lt;/span&gt;.sw&lt;span class="k"&gt;*&lt;/span&gt;

&lt;span class="c"&gt;# 3. Git might still have it (if staged even briefly)&lt;/span&gt;
git fsck &lt;span class="nt"&gt;--lost-found&lt;/span&gt;
&lt;span class="c"&gt;# This finds dangling commits/blobs&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; .git/lost-found
&lt;span class="c"&gt;# Check the files here&lt;/span&gt;

&lt;span class="c"&gt;# 4. Use git reflog for committed work&lt;/span&gt;
git reflog
&lt;span class="c"&gt;# Look for commits before reset&lt;/span&gt;
git reset &lt;span class="nt"&gt;--hard&lt;/span&gt; HEAD@&lt;span class="o"&gt;{&lt;/span&gt;1&lt;span class="o"&gt;}&lt;/span&gt;  &lt;span class="c"&gt;# Go back one step in reflog&lt;/span&gt;

&lt;span class="c"&gt;# 5. For truly uncommitted work:&lt;/span&gt;
&lt;span class="c"&gt;# If you added to index (git add) even briefly:&lt;/span&gt;
git fsck &lt;span class="nt"&gt;--cache&lt;/span&gt; &lt;span class="nt"&gt;--unreachable&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;blob | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="s1"&gt;' '&lt;/span&gt; &lt;span class="nt"&gt;-f3&lt;/span&gt; | xargs &lt;span class="nt"&gt;-I&lt;/span&gt;&lt;span class="o"&gt;{}&lt;/span&gt; git show &lt;span class="o"&gt;{}&lt;/span&gt;

&lt;span class="c"&gt;# 6. Operating system recovery:&lt;/span&gt;
&lt;span class="c"&gt;# Mac: Time Machine backups&lt;/span&gt;
&lt;span class="c"&gt;# Windows: File History / Previous Versions&lt;/span&gt;
&lt;span class="c"&gt;# Linux: check /tmp or backup systems&lt;/span&gt;

&lt;span class="c"&gt;# 7. PREVENTION is key:&lt;/span&gt;
&lt;span class="c"&gt;# Add to your .bashrc/.zshrc:&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;gah&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'git reset --hard'&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;gahs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'echo "DANGER: Use git stash instead" &amp;amp;&amp;amp; false'&lt;/span&gt;
&lt;span class="c"&gt;# Override the dangerous command&lt;/span&gt;

&lt;span class="c"&gt;# Use pre-commit hooks to auto-stash:&lt;/span&gt;
&lt;span class="c"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="c"&gt;# auto-stash.sh&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; git diff &lt;span class="nt"&gt;--quiet&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; git diff &lt;span class="nt"&gt;--cached&lt;/span&gt; &lt;span class="nt"&gt;--quiet&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;git stash push &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"auto-stash-&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +%s&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Q14: Stuck in complex rebase with unresolvable conflicts.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Safe Abort Strategy:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. First, save your conflict resolution work&lt;/span&gt;
&lt;span class="c"&gt;# Copy conflicted files somewhere safe&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; /tmp/recovery-backup/

&lt;span class="c"&gt;# 2. Standard abort&lt;/span&gt;
git rebase &lt;span class="nt"&gt;--abort&lt;/span&gt;
&lt;span class="c"&gt;# This returns to pre-rebase state&lt;/span&gt;

&lt;span class="c"&gt;# 3. If --abort fails (rare):&lt;/span&gt;
git reset &lt;span class="nt"&gt;--hard&lt;/span&gt; ORIG_HEAD
&lt;span class="c"&gt;# ORIG_HEAD is where you were before rebase&lt;/span&gt;

&lt;span class="c"&gt;# 4. If even that fails:&lt;/span&gt;
git reflog
&lt;span class="c"&gt;# Find the commit before rebase started&lt;/span&gt;
git reset &lt;span class="nt"&gt;--hard&lt;/span&gt; HEAD@&lt;span class="o"&gt;{&lt;/span&gt;5&lt;span class="o"&gt;}&lt;/span&gt;  &lt;span class="c"&gt;# Adjust number&lt;/span&gt;

&lt;span class="c"&gt;# 5. Alternative: Skip the problematic commit&lt;/span&gt;
&lt;span class="c"&gt;# During rebase, for the conflicted commit:&lt;/span&gt;
git add &lt;span class="nb"&gt;.&lt;/span&gt;  &lt;span class="c"&gt;# Stage resolution (even if incomplete)&lt;/span&gt;
git rebase &lt;span class="nt"&gt;--skip&lt;/span&gt;  &lt;span class="c"&gt;# Skip this commit&lt;/span&gt;
&lt;span class="c"&gt;# WARNING: You lose that commit's changes&lt;/span&gt;

&lt;span class="c"&gt;# 6. Better: Use merge instead of rebase&lt;/span&gt;
git merge main &lt;span class="nt"&gt;--no-ff&lt;/span&gt;
&lt;span class="c"&gt;# Keep your branch history as is&lt;/span&gt;

&lt;span class="c"&gt;# 7. For future: Rebase in smaller chunks&lt;/span&gt;
git rebase &lt;span class="nt"&gt;-i&lt;/span&gt; main~10  &lt;span class="c"&gt;# Rebase last 10 commits only&lt;/span&gt;
&lt;span class="c"&gt;# Less likely to get complex conflicts&lt;/span&gt;

&lt;span class="c"&gt;# 8. Use rerere (reuse recorded resolution)&lt;/span&gt;
git config rerere.enabled &lt;span class="nb"&gt;true
&lt;/span&gt;git rerere  &lt;span class="c"&gt;# Manually record current resolution&lt;/span&gt;
git rebase &lt;span class="nt"&gt;--continue&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Q15: "Your branch is ahead by X commits, behind by Y commits."&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Understanding &amp;amp; Synchronization:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# What this means:&lt;/span&gt;
&lt;span class="c"&gt;# Ahead: You have commits that remote doesn't have&lt;/span&gt;
&lt;span class="c"&gt;# Behind: Remote has commits you don't have&lt;/span&gt;

&lt;span class="c"&gt;# Visualize:&lt;/span&gt;
git log &lt;span class="nt"&gt;--oneline&lt;/span&gt; &lt;span class="nt"&gt;--graph&lt;/span&gt; &lt;span class="nt"&gt;--all&lt;/span&gt;

&lt;span class="c"&gt;# Solution 1: Simple push (if only ahead)&lt;/span&gt;
git push origin feature-branch

&lt;span class="c"&gt;# Solution 2: Pull first (if behind)&lt;/span&gt;
git pull origin feature-branch
&lt;span class="c"&gt;# This fetches AND merges&lt;/span&gt;

&lt;span class="c"&gt;# Solution 3: Pull with rebase (clean history)&lt;/span&gt;
git pull &lt;span class="nt"&gt;--rebase&lt;/span&gt; origin feature-branch
&lt;span class="c"&gt;# Puts your commits on top of remote&lt;/span&gt;

&lt;span class="c"&gt;# Solution 4: When both ahead AND behind:&lt;/span&gt;
&lt;span class="c"&gt;# This happens when you and someone else both pushed&lt;/span&gt;
&lt;span class="c"&gt;# You need to integrate changes&lt;/span&gt;

git fetch origin
git merge origin/feature-branch
&lt;span class="c"&gt;# Creates merge commit reconciling both&lt;/span&gt;

&lt;span class="c"&gt;# OR rebase your commits on top:&lt;/span&gt;
git rebase origin/feature-branch

&lt;span class="c"&gt;# Solution 5: Reset if your local commits are bad&lt;/span&gt;
git fetch origin
git reset &lt;span class="nt"&gt;--hard&lt;/span&gt; origin/feature-branch
&lt;span class="c"&gt;# WARNING: Discards your local commits&lt;/span&gt;

&lt;span class="c"&gt;# Best practice workflow:&lt;/span&gt;
&lt;span class="c"&gt;# 1. Always pull before starting work&lt;/span&gt;
git pull &lt;span class="nt"&gt;--rebase&lt;/span&gt; origin main
&lt;span class="c"&gt;# 2. Commit frequently&lt;/span&gt;
&lt;span class="c"&gt;# 3. Push when ready&lt;/span&gt;
&lt;span class="c"&gt;# 4. If push rejected: pull --rebase first&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;6. Performance &amp;amp; Optimization&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Q16: Repo is 5GB, cloning takes 30 minutes, operations are slow.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Investigation &amp;amp; Fixes:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Identify what's bloating the repo&lt;/span&gt;
git count-objects &lt;span class="nt"&gt;-vH&lt;/span&gt;  &lt;span class="c"&gt;# Check pack size&lt;/span&gt;
&lt;span class="nb"&gt;du&lt;/span&gt; &lt;span class="nt"&gt;-sh&lt;/span&gt; .git            &lt;span class="c"&gt;# Total .git size&lt;/span&gt;

&lt;span class="c"&gt;# 2. Find large files in history&lt;/span&gt;
git rev-list &lt;span class="nt"&gt;--objects&lt;/span&gt; &lt;span class="nt"&gt;--all&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
  git cat-file &lt;span class="nt"&gt;--batch-check&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'%(objecttype) %(objectname) %(objectsize) %(rest)'&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'/^blob/ {print substr($0,6)}'&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;--numeric-sort&lt;/span&gt; &lt;span class="nt"&gt;--key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2 | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-10&lt;/span&gt;  &lt;span class="c"&gt;# Top 10 largest files&lt;/span&gt;

&lt;span class="c"&gt;# 3. Use BFG to clean history&lt;/span&gt;
bfg &lt;span class="nt"&gt;--strip-blobs-bigger-than&lt;/span&gt; 100M  &lt;span class="c"&gt;# Remove files &amp;gt;100MB&lt;/span&gt;
git reflog expire &lt;span class="nt"&gt;--expire&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;now &lt;span class="nt"&gt;--all&lt;/span&gt;
git gc &lt;span class="nt"&gt;--prune&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;now &lt;span class="nt"&gt;--aggressive&lt;/span&gt;

&lt;span class="c"&gt;# 4. Use shallow clone for CI/CD&lt;/span&gt;
git clone &lt;span class="nt"&gt;--depth&lt;/span&gt; 1 https://github.com/company/repo.git
&lt;span class="c"&gt;# Only gets latest, not full history&lt;/span&gt;

&lt;span class="c"&gt;# 5. Use sparse checkout if only need some files&lt;/span&gt;
git clone &lt;span class="nt"&gt;--filter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;blob:none &lt;span class="nt"&gt;--no-checkout&lt;/span&gt; repo
&lt;span class="nb"&gt;cd &lt;/span&gt;repo
git sparse-checkout init &lt;span class="nt"&gt;--cone&lt;/span&gt;
git sparse-checkout &lt;span class="nb"&gt;set &lt;/span&gt;src/  &lt;span class="c"&gt;# Only get src folder&lt;/span&gt;
git checkout main

&lt;span class="c"&gt;# 6. Configure git for large repos&lt;/span&gt;
git config core.preloadindex &lt;span class="nb"&gt;true
&lt;/span&gt;git config core.fscache &lt;span class="nb"&gt;true
&lt;/span&gt;git config gc.auto 256  &lt;span class="c"&gt;# More frequent GC&lt;/span&gt;

&lt;span class="c"&gt;# 7. Split monorepo if possible&lt;/span&gt;
&lt;span class="c"&gt;# Use git subtree or submodules&lt;/span&gt;

&lt;span class="c"&gt;# 8. Add .gitignore rules&lt;/span&gt;
&lt;span class="c"&gt;# Common culprits: node_modules, .DS_Store, *.log, build artifacts&lt;/span&gt;

&lt;span class="c"&gt;# 9. Use git LFS for binaries&lt;/span&gt;
git lfs track &lt;span class="s2"&gt;"*.psd"&lt;/span&gt;
git lfs track &lt;span class="s2"&gt;"*.mp4"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Q17: &lt;code&gt;git status&lt;/code&gt; shows "Changes not staged for commit" but &lt;code&gt;git diff&lt;/code&gt; shows nothing.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Diagnosis &amp;amp; Fix:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# This is usually a file mode/permissions issue&lt;/span&gt;
&lt;span class="c"&gt;# Common on Linux/Mac when file permissions change&lt;/span&gt;

&lt;span class="c"&gt;# 1. Check if it's file mode changes&lt;/span&gt;
git config core.filemode
&lt;span class="c"&gt;# If true, Git tracks permission changes&lt;/span&gt;

&lt;span class="c"&gt;# 2. See what actually changed&lt;/span&gt;
git diff &lt;span class="nt"&gt;--summary&lt;/span&gt;
&lt;span class="c"&gt;# Shows mode changes like: mode change 100644 =&amp;gt; 100755&lt;/span&gt;

&lt;span class="c"&gt;# 3. Fix: Ignore permission changes&lt;/span&gt;
git config core.filemode &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;span class="c"&gt;# Then:&lt;/span&gt;
git add &lt;span class="nt"&gt;-A&lt;/span&gt;
git status  &lt;span class="c"&gt;# Should be clean now&lt;/span&gt;

&lt;span class="c"&gt;# 4. Alternative: Reset file modes&lt;/span&gt;
git diff &lt;span class="nt"&gt;--name-only&lt;/span&gt; | xargs &lt;span class="nb"&gt;chmod &lt;/span&gt;644
&lt;span class="c"&gt;# Or for executables:&lt;/span&gt;
git diff &lt;span class="nt"&gt;--name-only&lt;/span&gt; | xargs &lt;span class="nb"&gt;chmod &lt;/span&gt;755

&lt;span class="c"&gt;# 5. Could also be line ending issues (Windows/Linux)&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; core.autocrlf &lt;span class="nb"&gt;true&lt;/span&gt;  &lt;span class="c"&gt;# Windows&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; core.autocrlf input &lt;span class="c"&gt;# Linux/Mac&lt;/span&gt;

&lt;span class="c"&gt;# 6. Check for case sensitivity issues (Mac/Windows)&lt;/span&gt;
&lt;span class="c"&gt;# File was renamed with different case&lt;/span&gt;
git &lt;span class="nb"&gt;mv &lt;/span&gt;OldFile.txt oldfile.txt  &lt;span class="c"&gt;# Fix case&lt;/span&gt;

&lt;span class="c"&gt;# 7. Clean cache if corrupted&lt;/span&gt;
git &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="nt"&gt;--cached&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
git reset HEAD &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
git status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Q18: Find which commit introduced a bug in code that's been moved/renamed.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Tracking Through File Moves:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Use git log with follow flag&lt;/span&gt;
git log &lt;span class="nt"&gt;--follow&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; path/to/current/file.js
&lt;span class="c"&gt;# --follow tracks file through renames&lt;/span&gt;

&lt;span class="c"&gt;# 2. Use git blame with follow&lt;/span&gt;
git blame &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="nt"&gt;-C&lt;/span&gt; path/to/file.js
&lt;span class="c"&gt;# -C finds copied code from other files&lt;/span&gt;
&lt;span class="c"&gt;# More -C flags = more aggressive copy detection&lt;/span&gt;

&lt;span class="c"&gt;# 3. Find when file was renamed&lt;/span&gt;
git log &lt;span class="nt"&gt;--name-status&lt;/span&gt; &lt;span class="nt"&gt;--oneline&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-B2&lt;/span&gt; &lt;span class="nt"&gt;-A2&lt;/span&gt; &lt;span class="s2"&gt;"R.*file"&lt;/span&gt;
&lt;span class="c"&gt;# R = rename&lt;/span&gt;

&lt;span class="c"&gt;# 4. Use git pickaxe search for specific code&lt;/span&gt;
git log &lt;span class="nt"&gt;-S&lt;/span&gt; &lt;span class="s2"&gt;"functionName()"&lt;/span&gt; &lt;span class="nt"&gt;--all&lt;/span&gt;
&lt;span class="c"&gt;# Find commits that added/removed this string&lt;/span&gt;

&lt;span class="c"&gt;# 5. Combine with line numbers&lt;/span&gt;
git blame &lt;span class="nt"&gt;-L&lt;/span&gt; 50,100 path/to/file.js

&lt;span class="c"&gt;# 6. Full investigation script:&lt;/span&gt;
&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# trace-bug.sh&lt;/span&gt;
&lt;span class="nv"&gt;BUGGY_CODE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"badFunctionCall()"&lt;/span&gt;

&lt;span class="c"&gt;# Find all occurrences in history&lt;/span&gt;
git log &lt;span class="nt"&gt;--all&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-B5&lt;/span&gt; &lt;span class="nt"&gt;-A5&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$BUGGY_CODE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"^commit "&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-5&lt;/span&gt;

&lt;span class="c"&gt;# 7. Visualize with gitk&lt;/span&gt;
gitk &lt;span class="nt"&gt;--all&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; path/to/file.js

&lt;span class="c"&gt;# 8. If file was split/merged:&lt;/span&gt;
&lt;span class="c"&gt;# Use git log --find-renames&lt;/span&gt;
git log &lt;span class="nt"&gt;--find-renames&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;40%  &lt;span class="c"&gt;# 40% similarity threshold&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;7. CI/CD &amp;amp; Automation Issues&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Q19: Deployment script runs &lt;code&gt;git pull&lt;/code&gt; but fails with "would be overwritten" errors.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Resilient Deployment Script:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# deploy.sh - Safe git operations for CI/CD&lt;/span&gt;

&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt;  &lt;span class="c"&gt;# Exit on error&lt;/span&gt;

&lt;span class="c"&gt;# 1. Use a lock file to prevent concurrent deployments&lt;/span&gt;
&lt;span class="nv"&gt;LOCK_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/tmp/deploy.lock"&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LOCK_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Deployment already in progress"&lt;/span&gt;
    &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi
&lt;/span&gt;&lt;span class="nb"&gt;trap&lt;/span&gt; &lt;span class="s2"&gt;"rm -f &lt;/span&gt;&lt;span class="nv"&gt;$LOCK_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; EXIT
&lt;span class="nb"&gt;touch&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LOCK_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# 2. Always start from known state&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; /var/www/app
git reset &lt;span class="nt"&gt;--hard&lt;/span&gt; HEAD
git clean &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;

&lt;span class="c"&gt;# 3. Fetch with prune (remove stale branches)&lt;/span&gt;
git fetch origin &lt;span class="nt"&gt;--prune&lt;/span&gt;

&lt;span class="c"&gt;# 4. Check if we can fast-forward&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;git merge-base &lt;span class="nt"&gt;--is-ancestor&lt;/span&gt; HEAD origin/main&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="c"&gt;# Safe to fast-forward&lt;/span&gt;
    git merge &lt;span class="nt"&gt;--ff-only&lt;/span&gt; origin/main
&lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="c"&gt;# Need proper merge, backup first&lt;/span&gt;
    &lt;span class="nv"&gt;BACKUP_TAG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"backup-&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +%Y%m%d-%H%M%S&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    git tag &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$BACKUP_TAG&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    git merge origin/main &lt;span class="nt"&gt;--no-ff&lt;/span&gt; &lt;span class="nt"&gt;--strategy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;recursive &lt;span class="nt"&gt;--strategy-option&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;theirs
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# 5. Alternative: Always use reset if you don't care about local changes&lt;/span&gt;
&lt;span class="c"&gt;# git fetch origin main&lt;/span&gt;
&lt;span class="c"&gt;# git reset --hard origin/main&lt;/span&gt;

&lt;span class="c"&gt;# 6. Log the deployment&lt;/span&gt;
git log &lt;span class="nt"&gt;--oneline&lt;/span&gt; &lt;span class="nt"&gt;-5&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Deployed: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;git rev-parse &lt;span class="nt"&gt;--short&lt;/span&gt; HEAD&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# 7. Clean up old backups (keep last 10)&lt;/span&gt;
git tag &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="s2"&gt;"backup-*"&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; | &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; +11 | xargs git tag &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Q20: Verify deployed code matches exactly what was tested in PR.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Deployment Integrity Check:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Method 1: SHA-based verification&lt;/span&gt;
&lt;span class="c"&gt;# In CI pipeline:&lt;/span&gt;
&lt;span class="nv"&gt;PR_SHA&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;git rev-parse HEAD&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"PR_SHA=&lt;/span&gt;&lt;span class="nv"&gt;$PR_SHA&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$GITHUB_ENV&lt;/span&gt;

&lt;span class="c"&gt;# In deployment script:&lt;/span&gt;
&lt;span class="nv"&gt;EXPECTED_SHA&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"{{PR_SHA}}"&lt;/span&gt;
&lt;span class="nv"&gt;ACTUAL_SHA&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;git rev-parse HEAD&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$EXPECTED_SHA&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ACTUAL_SHA&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"ERROR: SHA mismatch!"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Expected: &lt;/span&gt;&lt;span class="nv"&gt;$EXPECTED_SHA&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Actual: &lt;/span&gt;&lt;span class="nv"&gt;$ACTUAL_SHA&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# Method 2: Tag-based deployment&lt;/span&gt;
&lt;span class="c"&gt;# When PR is approved and tested:&lt;/span&gt;
git tag &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"release-&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +%Y%m%d-%H%M%S&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PR_NUMBER&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"PR &lt;/span&gt;&lt;span class="nv"&gt;$PR_NUMBER&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
git push origin &lt;span class="nt"&gt;--tags&lt;/span&gt;

&lt;span class="c"&gt;# Deployment script:&lt;/span&gt;
&lt;span class="nv"&gt;TAG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;git describe &lt;span class="nt"&gt;--tags&lt;/span&gt; &lt;span class="nt"&gt;--abbrev&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0&lt;span class="si"&gt;)&lt;/span&gt;
git checkout &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$TAG&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Method 3: Checksum verification&lt;/span&gt;
&lt;span class="c"&gt;# Generate checksum of critical files&lt;/span&gt;
find src/ &lt;span class="nt"&gt;-type&lt;/span&gt; f &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.js"&lt;/span&gt; &lt;span class="nt"&gt;-exec&lt;/span&gt; &lt;span class="nb"&gt;md5sum&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /tmp/checksums.pr
&lt;span class="c"&gt;# Deploy, then verify:&lt;/span&gt;
find src/ &lt;span class="nt"&gt;-type&lt;/span&gt; f &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.js"&lt;/span&gt; &lt;span class="nt"&gt;-exec&lt;/span&gt; &lt;span class="nb"&gt;md5sum&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /tmp/checksums.deploy
diff /tmp/checksums.pr /tmp/checksums.deploy

&lt;span class="c"&gt;# Method 4: Use Git Notes for metadata&lt;/span&gt;
git notes add &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"PR: &lt;/span&gt;&lt;span class="nv"&gt;$PR_NUMBER&lt;/span&gt;&lt;span class="s2"&gt; | Tested-by: CI-&lt;/span&gt;&lt;span class="nv"&gt;$RUN_ID&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
git push origin refs/notes/&lt;span class="k"&gt;*&lt;/span&gt;

&lt;span class="c"&gt;# Verify on server:&lt;/span&gt;
git fetch origin refs/notes/&lt;span class="k"&gt;*&lt;/span&gt;:refs/notes/&lt;span class="k"&gt;*&lt;/span&gt;
git notes show
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;8. Permission &amp;amp; Security&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Q21: Contractor pushed with personal email instead of company email.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Rewriting Author Information:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# WARNING: This rewrites history - force push required&lt;/span&gt;
&lt;span class="c"&gt;# Only do on feature branches, not main&lt;/span&gt;

&lt;span class="c"&gt;# 1. Clone fresh to avoid issues&lt;/span&gt;
git clone &lt;span class="nt"&gt;--bare&lt;/span&gt; https://github.com/company/repo.git
&lt;span class="nb"&gt;cd &lt;/span&gt;repo.git

&lt;span class="c"&gt;# 2. Use git filter-branch&lt;/span&gt;
git filter-branch &lt;span class="nt"&gt;--env-filter&lt;/span&gt; &lt;span class="s1"&gt;'
OLD_EMAIL="contractor@gmail.com"
CORRECT_NAME="Jane Contractor"
CORRECT_EMAIL="jane@company.com"

if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]; then
    export GIT_COMMITTER_NAME="$CORRECT_NAME"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]; then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
'&lt;/span&gt; &lt;span class="nt"&gt;--tag-name-filter&lt;/span&gt; &lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--all&lt;/span&gt;

&lt;span class="c"&gt;# 3. Clean up&lt;/span&gt;
git reflog expire &lt;span class="nt"&gt;--expire&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;now &lt;span class="nt"&gt;--all&lt;/span&gt;
git gc &lt;span class="nt"&gt;--prune&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;now &lt;span class="nt"&gt;--aggressive&lt;/span&gt;

&lt;span class="c"&gt;# 4. Push back&lt;/span&gt;
git push &lt;span class="nt"&gt;--force&lt;/span&gt; &lt;span class="nt"&gt;--tags&lt;/span&gt; origin &lt;span class="s1"&gt;'refs/heads/*'&lt;/span&gt;

&lt;span class="c"&gt;# 5. For all developers:&lt;/span&gt;
git fetch origin
git reset &lt;span class="nt"&gt;--hard&lt;/span&gt; origin/feature-branch

&lt;span class="c"&gt;# 6. Prevention: Use commit template&lt;/span&gt;
git config commit.template .gitmessage.txt
&lt;span class="c"&gt;# In .gitmessage.txt:&lt;/span&gt;
&lt;span class="c"&gt;# Author: company.email@domain.com&lt;/span&gt;

&lt;span class="c"&gt;# 7. Use pre-commit hook to validate&lt;/span&gt;
&lt;span class="c"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="c"&gt;# .git/hooks/commit-msg&lt;/span&gt;
&lt;span class="nv"&gt;COMPANY_DOMAIN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"@company.com"&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;git config user.email&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$COMPANY_DOMAIN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"ERROR: Use your company email"&lt;/span&gt;
    &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Q22: Give developer access to only one specific branch.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Git Branch Permissions:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Git itself doesn't do permissions - use hosting platform&lt;/span&gt;

&lt;span class="c"&gt;# GitHub:&lt;/span&gt;
&lt;span class="c"&gt;# 1. Go to repo Settings → Branches&lt;/span&gt;
&lt;span class="c"&gt;# 2. Add branch protection rule for main&lt;/span&gt;
&lt;span class="c"&gt;# 3. Require PR, require reviews&lt;/span&gt;
&lt;span class="c"&gt;# 4. Go to Settings → Collaborators&lt;/span&gt;
&lt;span class="c"&gt;# 5. Add person with "Write" access&lt;/span&gt;
&lt;span class="c"&gt;# 6. They can push to any branch but can't merge to protected branches&lt;/span&gt;

&lt;span class="c"&gt;# GitLab:&lt;/span&gt;
&lt;span class="c"&gt;# 1. Settings → Repository → Protected Branches&lt;/span&gt;
&lt;span class="c"&gt;# 2. Protect main: Maintainers can merge&lt;/span&gt;
&lt;span class="c"&gt;# 3. Create new branch: Developers can push&lt;/span&gt;
&lt;span class="c"&gt;# 4. Use "Push Rules" for finer control&lt;/span&gt;

&lt;span class="c"&gt;# Bitbucket:&lt;/span&gt;
&lt;span class="c"&gt;# 1. Repository settings → Branch permissions&lt;/span&gt;
&lt;span class="c"&gt;# 2. Add permission: branch name = "feature/*"&lt;/span&gt;
&lt;span class="c"&gt;# 3. Allow specific users/groups&lt;/span&gt;

&lt;span class="c"&gt;# Server-side hooks (advanced):&lt;/span&gt;
&lt;span class="c"&gt;# In .git/hooks/pre-receive on server:&lt;/span&gt;
&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;read &lt;/span&gt;oldrev newrev refname&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;&lt;span class="nv"&gt;branch&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;git rev-parse &lt;span class="nt"&gt;--symbolic&lt;/span&gt; &lt;span class="nt"&gt;--abbrev-ref&lt;/span&gt; &lt;span class="nv"&gt;$refname&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
    &lt;span class="nv"&gt;user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;whoami&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$branch&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"main"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;"allowed-user"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Access denied to main branch"&lt;/span&gt;
        &lt;span class="nb"&gt;exit &lt;/span&gt;1
    &lt;span class="k"&gt;fi
done&lt;/span&gt;

&lt;span class="c"&gt;# Fork workflow alternative:&lt;/span&gt;
&lt;span class="c"&gt;# Developer forks repo, works in their fork&lt;/span&gt;
&lt;span class="c"&gt;# Submits PR from their branch to upstream main&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Q23: Team uses both SSH and HTTPS, causing authentication conflicts.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Standardization Solution:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Choose one protocol for the team&lt;/span&gt;
&lt;span class="c"&gt;# Recommendation: Use SSH for developers, HTTPS for CI&lt;/span&gt;

&lt;span class="c"&gt;# 2. Check current remote URL&lt;/span&gt;
git remote &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;span class="c"&gt;# origin  https://github.com/company/repo.git (fetch)&lt;/span&gt;
&lt;span class="c"&gt;# origin  https://github.com/company/repo.git (push)&lt;/span&gt;

&lt;span class="c"&gt;# 3. Convert HTTPS to SSH&lt;/span&gt;
git remote set-url origin git@github.com:company/repo.git

&lt;span class="c"&gt;# 4. Or SSH to HTTPS&lt;/span&gt;
git remote set-url origin https://github.com/company/repo.git

&lt;span class="c"&gt;# 5. Use git config to set default&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; url.&lt;span class="s2"&gt;"git@github.com:"&lt;/span&gt;.insteadOf &lt;span class="s2"&gt;"https://github.com/"&lt;/span&gt;
&lt;span class="c"&gt;# Now `git clone https://github.com/company/repo` uses SSH automatically&lt;/span&gt;

&lt;span class="c"&gt;# 6. For CI/CD systems, use tokens:&lt;/span&gt;
&lt;span class="c"&gt;# GitHub: Personal Access Token&lt;/span&gt;
git clone https://token@github.com/company/repo.git

&lt;span class="c"&gt;# 7. Store credentials securely&lt;/span&gt;
&lt;span class="c"&gt;# SSH: Use ssh-agent&lt;/span&gt;
&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;ssh-agent &lt;span class="nt"&gt;-s&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
ssh-add ~/.ssh/id_rsa

&lt;span class="c"&gt;# HTTPS: Use credential helper&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; credential.helper cache
&lt;span class="c"&gt;# Stores for 15 minutes&lt;/span&gt;

&lt;span class="c"&gt;# 8. Team documentation should specify:&lt;/span&gt;
&lt;span class="c"&gt;# - SSH key setup guide&lt;/span&gt;
&lt;span class="c"&gt;# - Standard remote URL format&lt;/span&gt;
&lt;span class="c"&gt;# - Troubleshooting steps&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;9. Submodules &amp;amp; Complex Repos&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Q24: Teammate says "I updated the submodule" but your local doesn't show changes.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Submodule Synchronization Issue:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Understanding: Submodules are pointers to specific commits&lt;/span&gt;
&lt;span class="c"&gt;# Your repo stores which commit of submodule to use&lt;/span&gt;

&lt;span class="c"&gt;# 1. Check current submodule state&lt;/span&gt;
git submodule status
&lt;span class="c"&gt;# Shows commit hash and path&lt;/span&gt;
&lt;span class="c"&gt;# - (dash) means not initialized&lt;/span&gt;
&lt;span class="c"&gt;# + (plus) means different commit than recorded&lt;/span&gt;

&lt;span class="c"&gt;# 2. Update submodules&lt;/span&gt;
git submodule update &lt;span class="nt"&gt;--init&lt;/span&gt; &lt;span class="nt"&gt;--recursive&lt;/span&gt;
&lt;span class="c"&gt;# --init: initializes if needed&lt;/span&gt;
&lt;span class="c"&gt;# --recursive: for nested submodules&lt;/span&gt;

&lt;span class="c"&gt;# 3. If teammate updated submodule commit:&lt;/span&gt;
&lt;span class="c"&gt;# First, get latest main repo&lt;/span&gt;
git pull origin main

&lt;span class="c"&gt;# Then update submodules to new commits&lt;/span&gt;
git submodule update &lt;span class="nt"&gt;--recursive&lt;/span&gt;

&lt;span class="c"&gt;# 4. If you need to update submodule yourself:&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;path/to/submodule
git checkout main
git pull origin main
&lt;span class="nb"&gt;cd&lt;/span&gt; ..
git add path/to/submodule
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Update submodule to latest"&lt;/span&gt;
git push origin main

&lt;span class="c"&gt;# 5. Common problem: Submodule pointer not updated&lt;/span&gt;
&lt;span class="c"&gt;# Teammate updated submodule code but didn't commit the pointer change&lt;/span&gt;
git submodule foreach git pull origin main
&lt;span class="c"&gt;# Updates all submodules to latest&lt;/span&gt;

&lt;span class="c"&gt;# 6. Use --remote to track branch&lt;/span&gt;
git submodule update &lt;span class="nt"&gt;--remote&lt;/span&gt;
&lt;span class="c"&gt;# Fetches latest from submodule's tracked branch&lt;/span&gt;

&lt;span class="c"&gt;# 7. Prevention: Use subtrees instead of submodules&lt;/span&gt;
&lt;span class="c"&gt;# Convert submodule to subtree:&lt;/span&gt;
git subtree add &lt;span class="nt"&gt;--prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;lib/dependency https://github.com/vendor/dependency.git main &lt;span class="nt"&gt;--squash&lt;/span&gt;
&lt;span class="c"&gt;# Easier to manage, no pointer commits&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Q25: Move a folder from monorepo to its own repository while preserving history.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Splitting Repository with History:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Using git filter-repo (recommended):&lt;/span&gt;
&lt;span class="c"&gt;# 1. Install filter-repo&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;git-filter-repo

&lt;span class="c"&gt;# 2. Clone the monorepo&lt;/span&gt;
git clone https://github.com/company/monorepo.git
&lt;span class="nb"&gt;cd &lt;/span&gt;monorepo

&lt;span class="c"&gt;# 3. Extract folder with history&lt;/span&gt;
git filter-repo &lt;span class="nt"&gt;--path&lt;/span&gt; packages/my-module/ &lt;span class="nt"&gt;--subdirectory-filter&lt;/span&gt; packages/my-module
&lt;span class="c"&gt;# This keeps only files from that folder, at repo root&lt;/span&gt;

&lt;span class="c"&gt;# 4. Create new remote repo on GitHub/GitLab&lt;/span&gt;
&lt;span class="c"&gt;# 5. Add new remote&lt;/span&gt;
git remote add origin https://github.com/company/my-module.git
git push &lt;span class="nt"&gt;-u&lt;/span&gt; origin main

&lt;span class="c"&gt;# Using git subtree (alternative):&lt;/span&gt;
&lt;span class="c"&gt;# 1. Prepare split in monorepo&lt;/span&gt;
git subtree &lt;span class="nb"&gt;split&lt;/span&gt; &lt;span class="nt"&gt;-P&lt;/span&gt; packages/my-module &lt;span class="nt"&gt;-b&lt;/span&gt; split-branch

&lt;span class="c"&gt;# 2. Create new repo&lt;/span&gt;
&lt;span class="nb"&gt;mkdir &lt;/span&gt;my-module &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;my-module
git init
git pull ../monorepo split-branch

&lt;span class="c"&gt;# 3. Clean up and push&lt;/span&gt;
git remote add origin https://github.com/company/my-module.git
git push &lt;span class="nt"&gt;-u&lt;/span&gt; origin main

&lt;span class="c"&gt;# Keep connection with subtrees:&lt;/span&gt;
&lt;span class="c"&gt;# In monorepo, after moving:&lt;/span&gt;
git remote add module-origin https://github.com/company/my-module.git
git subtree add &lt;span class="nt"&gt;--prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;packages/my-module module-origin main &lt;span class="nt"&gt;--squash&lt;/span&gt;

&lt;span class="c"&gt;# Now you can pull updates:&lt;/span&gt;
git subtree pull &lt;span class="nt"&gt;--prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;packages/my-module module-origin main &lt;span class="nt"&gt;--squash&lt;/span&gt;

&lt;span class="c"&gt;# Update the module from monorepo:&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;packages/my-module
&lt;span class="c"&gt;# Make changes&lt;/span&gt;
git add &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Update module"&lt;/span&gt;
git push module-origin main
&lt;span class="nb"&gt;cd&lt;/span&gt; ../..
git commit &lt;span class="nt"&gt;-am&lt;/span&gt; &lt;span class="s2"&gt;"Update module subtree"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;10. Real Emergency Scenarios&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Q26: &lt;code&gt;git&lt;/code&gt; commands return "not a git repository" but you're in your project folder.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Recovery Steps:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Check if .git folder exists&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; .git
&lt;span class="c"&gt;# If missing, something deleted it&lt;/span&gt;

&lt;span class="c"&gt;# 2. Look for backup .git folders&lt;/span&gt;
find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;".git*"&lt;/span&gt; &lt;span class="nt"&gt;-type&lt;/span&gt; d
&lt;span class="c"&gt;# Maybe .git moved or renamed&lt;/span&gt;

&lt;span class="c"&gt;# 3. Check if you're in subdirectory&lt;/span&gt;
&lt;span class="nb"&gt;pwd
&lt;/span&gt;git rev-parse &lt;span class="nt"&gt;--show-toplevel&lt;/span&gt;
&lt;span class="c"&gt;# Should show repo root&lt;/span&gt;

&lt;span class="c"&gt;# 4. If .git is truly gone:&lt;/span&gt;
&lt;span class="c"&gt;# Option A: Re-clone (loses local uncommitted changes)&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; /tmp
git clone https://github.com/company/repo.git
&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; /tmp/repo/.git /path/to/project/

&lt;span class="c"&gt;# Option B: Recover from remote&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; /path/to/project
git init
git remote add origin https://github.com/company/repo.git
git fetch origin
git reset &lt;span class="nt"&gt;--hard&lt;/span&gt; origin/main
&lt;span class="c"&gt;# WARNING: Loses all local commits not pushed&lt;/span&gt;

&lt;span class="c"&gt;# Option C: Check for backups&lt;/span&gt;
&lt;span class="c"&gt;# - Time Machine (Mac)&lt;/span&gt;
&lt;span class="c"&gt;# - File History (Windows)  &lt;/span&gt;
&lt;span class="c"&gt;# - Server backups&lt;/span&gt;
&lt;span class="c"&gt;# - CI system artifacts&lt;/span&gt;

&lt;span class="c"&gt;# 5. If .git is corrupted:&lt;/span&gt;
&lt;span class="nb"&gt;mv&lt;/span&gt; .git .git.corrupted
git init
git remote add origin https://github.com/company/repo.git
git fetch origin
&lt;span class="c"&gt;# Try to recover specific branches:&lt;/span&gt;
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; main origin/main

&lt;span class="c"&gt;# 6. Prevention:&lt;/span&gt;
&lt;span class="c"&gt;# Regular backups of .git folder&lt;/span&gt;
&lt;span class="c"&gt;# Push to remote frequently&lt;/span&gt;
&lt;span class="c"&gt;# Use git bundle for local backups:&lt;/span&gt;
git bundle create repo-backup.bundle &lt;span class="nt"&gt;--all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Q27: Wrong branch merged to production during deploy.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Emergency Rollback:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Scenario: feature/experimental merged instead of hotfix/production&lt;/span&gt;

&lt;span class="c"&gt;# 1. IMMEDIATE: Block new deployments&lt;/span&gt;
&lt;span class="c"&gt;# Turn off CI/CD pipeline&lt;/span&gt;
&lt;span class="c"&gt;# Notify team&lt;/span&gt;

&lt;span class="c"&gt;# 2. Identify what was deployed&lt;/span&gt;
git log &lt;span class="nt"&gt;--oneline&lt;/span&gt; &lt;span class="nt"&gt;-5&lt;/span&gt; main
&lt;span class="c"&gt;# Find the bad merge commit&lt;/span&gt;

&lt;span class="c"&gt;# 3. Revert the merge commit&lt;/span&gt;
git revert &lt;span class="nt"&gt;-m&lt;/span&gt; 1 &amp;lt;merge-commit-hash&amp;gt;
&lt;span class="c"&gt;# -m 1 keeps main's side of merge (not feature branch)&lt;/span&gt;
&lt;span class="c"&gt;# Creates a new commit that undoes the merge&lt;/span&gt;

&lt;span class="c"&gt;# 4. Deploy the revert&lt;/span&gt;
git push origin main

&lt;span class="c"&gt;# 5. If revert causes conflicts (complex merge):&lt;/span&gt;
&lt;span class="c"&gt;# Use reset to go back before merge&lt;/span&gt;
git reset &lt;span class="nt"&gt;--hard&lt;/span&gt; &amp;lt;commit-before-merge&amp;gt;
git push &lt;span class="nt"&gt;--force&lt;/span&gt; origin main
&lt;span class="c"&gt;# WARNING: This rewrites history - only if no one else has pulled&lt;/span&gt;

&lt;span class="c"&gt;# 6. Alternative: Cherry-pick fixes&lt;/span&gt;
&lt;span class="c"&gt;# If feature branch had some good changes&lt;/span&gt;
git log feature/experimental &lt;span class="nt"&gt;--oneline&lt;/span&gt;
git cherry-pick &amp;lt;good-commit-hash&amp;gt;

&lt;span class="c"&gt;# 7. Communicate:&lt;/span&gt;
&lt;span class="c"&gt;# - What happened&lt;/span&gt;
&lt;span class="c"&gt;# - How it was fixed&lt;/span&gt;
&lt;span class="c"&gt;# - Prevention steps&lt;/span&gt;

&lt;span class="c"&gt;# 8. Prevention for future:&lt;/span&gt;
&lt;span class="c"&gt;# - Deployment checklists&lt;/span&gt;
&lt;span class="c"&gt;# - Pre-deployment approvals&lt;/span&gt;
&lt;span class="c"&gt;# - Staging environment testing&lt;/span&gt;
&lt;span class="c"&gt;# - Feature flags for risky changes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Q28: Team uses "squash and merge" on PRs, need to cherry-pick a fix that was squashed.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Finding the Actual Change:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Problem: Squash merge combines many commits into one&lt;/span&gt;
&lt;span class="c"&gt;# The fix you need is buried in the squash&lt;/span&gt;

&lt;span class="c"&gt;# 1. Find the squashed commit&lt;/span&gt;
git log &lt;span class="nt"&gt;--oneline&lt;/span&gt; &lt;span class="nt"&gt;--grep&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"PR #123"&lt;/span&gt; &lt;span class="nt"&gt;-5&lt;/span&gt;
&lt;span class="c"&gt;# Find the squash merge commit&lt;/span&gt;

&lt;span class="c"&gt;# 2. Look at what changed in that commit&lt;/span&gt;
git show &amp;lt;squash-commit-hash&amp;gt; &lt;span class="nt"&gt;--stat&lt;/span&gt;
&lt;span class="c"&gt;# See all files changed&lt;/span&gt;

&lt;span class="c"&gt;# 3. Search for the specific fix&lt;/span&gt;
git show &amp;lt;squash-commit-hash&amp;gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-B5&lt;/span&gt; &lt;span class="nt"&gt;-A5&lt;/span&gt; &lt;span class="s2"&gt;"fix-message"&lt;/span&gt;

&lt;span class="c"&gt;# 4. If you know the original PR branch:&lt;/span&gt;
&lt;span class="c"&gt;# Check if branch still exists locally/remotely&lt;/span&gt;
git branch &lt;span class="nt"&gt;-r&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"PR-123"&lt;/span&gt;
&lt;span class="c"&gt;# If yes, checkout and find the fix commit&lt;/span&gt;

&lt;span class="c"&gt;# 5. Use git log with pickaxe on squash commit&lt;/span&gt;
git log &lt;span class="nt"&gt;-S&lt;/span&gt; &lt;span class="s2"&gt;"specificCodeChange"&lt;/span&gt; &lt;span class="nt"&gt;--all&lt;/span&gt;
&lt;span class="c"&gt;# Might find other occurrences&lt;/span&gt;

&lt;span class="c"&gt;# 6. Extract just the fix from squashed commit:&lt;/span&gt;
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; extract-fix &amp;lt;squash-commit-hash&amp;gt;~1
&lt;span class="c"&gt;# Go to parent of squash commit&lt;/span&gt;
git cherry-pick &lt;span class="nt"&gt;-n&lt;/span&gt; &amp;lt;squash-commit-hash&amp;gt;
&lt;span class="c"&gt;# Stage changes but don't commit&lt;/span&gt;
git reset  &lt;span class="c"&gt;# Unstage all&lt;/span&gt;
git add path/to/fix.js  &lt;span class="c"&gt;# Only stage the fix file&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"fix: extract specific fix from PR #123"&lt;/span&gt;

&lt;span class="c"&gt;# 7. Prevention:&lt;/span&gt;
&lt;span class="c"&gt;# Don't squash if you need to cherry-pick later&lt;/span&gt;
&lt;span class="c"&gt;# Or, tag important individual commits before squash:&lt;/span&gt;
git tag &lt;span class="s2"&gt;"fix-bug-456"&lt;/span&gt; &amp;lt;commit-hash&amp;gt;
git push origin &lt;span class="nt"&gt;--tags&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;11. Git Hooks &amp;amp; Automation&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Q29: Pre-commit hook runs 2-minute tests, slowing development.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Balancing Speed vs Quality:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Solution: Staged testing - only test what changed&lt;/span&gt;

&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# .git/hooks/pre-commit&lt;/span&gt;
&lt;span class="c"&gt;# Only run tests on staged files&lt;/span&gt;

&lt;span class="c"&gt;# 1. Get list of staged files&lt;/span&gt;
&lt;span class="nv"&gt;STAGED_FILES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;git diff &lt;span class="nt"&gt;--cached&lt;/span&gt; &lt;span class="nt"&gt;--name-only&lt;/span&gt; &lt;span class="nt"&gt;--diff-filter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ACM&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# 2. Only run tests if relevant files changed&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$STAGED_FILES&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="s2"&gt;js$"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Running JavaScript tests..."&lt;/span&gt;
    npm &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--findRelatedTests&lt;/span&gt; &lt;span class="nv"&gt;$STAGED_FILES&lt;/span&gt;
    &lt;span class="c"&gt;# Jest: --findRelatedTests runs tests for changed files only&lt;/span&gt;
&lt;span class="k"&gt;fi

if &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$STAGED_FILES&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="s2"&gt;py$"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Running Python tests..."&lt;/span&gt;
    python &lt;span class="nt"&gt;-m&lt;/span&gt; pytest &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$STAGED_FILES&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="s2"&gt;py$"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# 3. Use lint-staged for different file types&lt;/span&gt;
&lt;span class="c"&gt;# package.json:&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"lint-staged"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"*.js"&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"eslint --fix"&lt;/span&gt;, &lt;span class="s2"&gt;"prettier --write"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;,
    &lt;span class="s2"&gt;"*.{json,md}"&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"prettier --write"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# 4. Skip hook when needed (with warning)&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"WIP"&lt;/span&gt; &lt;span class="nt"&gt;--no-verify&lt;/span&gt;
&lt;span class="c"&gt;# Or set environment variable:&lt;/span&gt;
&lt;span class="nv"&gt;BY_PASS_HOOKS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1 git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Emergency fix"&lt;/span&gt;

&lt;span class="c"&gt;# 5. Fast pre-commit, full tests in CI&lt;/span&gt;
&lt;span class="c"&gt;# Pre-commit: quick linting&lt;/span&gt;
&lt;span class="c"&gt;# CI: full test suite&lt;/span&gt;

&lt;span class="c"&gt;# 6. Progressive enhancement:&lt;/span&gt;
&lt;span class="c"&gt;# First: Only syntax checking (fast)&lt;/span&gt;
&lt;span class="c"&gt;# Second: Unit tests for changed files (medium)&lt;/span&gt;
&lt;span class="c"&gt;# CI: Full integration tests (slow but thorough)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Q30: Commit-msg hook enforces ticket numbers, but you need urgent fix without ticket.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Safe Bypass Methods:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Hook code (should allow emergencies):&lt;/span&gt;
&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# .git/hooks/commit-msg&lt;/span&gt;

&lt;span class="nv"&gt;COMMIT_MSG_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;span class="nv"&gt;COMMIT_MSG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$COMMIT_MSG_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Allow emergency bypass&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$COMMIT_MSG&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;~ ^EMERGENCY: &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"WARNING: Emergency commit - skipping ticket validation"&lt;/span&gt;
    &lt;span class="nb"&gt;exit &lt;/span&gt;0
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# Allow hotfix pattern&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$COMMIT_MSG&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;~ ^&lt;span class="o"&gt;(&lt;/span&gt;fix|hotfix&lt;span class="o"&gt;)&lt;/span&gt;:.&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="se"&gt;\[&lt;/span&gt;HOTFIX&lt;span class="se"&gt;\]&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Hotfix detected - creating ticket automatically"&lt;/span&gt;
    &lt;span class="c"&gt;# Auto-create ticket via API&lt;/span&gt;
    curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.company.com/tickets &lt;span class="se"&gt;\&lt;/span&gt;
      &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"title":"Emergency fix", "type":"hotfix"}'&lt;/span&gt;
    &lt;span class="nb"&gt;exit &lt;/span&gt;0
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# Normal validation&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$COMMIT_MSG&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;~ &lt;span class="se"&gt;\[&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;A-Z]+-[0-9]+&lt;span class="se"&gt;\]&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"ERROR: Commit must include ticket number [PROJ-123]"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"For emergencies, use: EMERGENCY: description"&lt;/span&gt;
    &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# Alternative bypass methods:&lt;/span&gt;

&lt;span class="c"&gt;# 1. Use --no-verify flag&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"fix: critical production outage"&lt;/span&gt; &lt;span class="nt"&gt;--no-verify&lt;/span&gt;

&lt;span class="c"&gt;# 2. Temporary disable hook&lt;/span&gt;
&lt;span class="nb"&gt;mv&lt;/span&gt; .git/hooks/commit-msg .git/hooks/commit-msg.disabled
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Emergency fix"&lt;/span&gt;
&lt;span class="nb"&gt;mv&lt;/span&gt; .git/hooks/commit-msg.disabled .git/hooks/commit-msg

&lt;span class="c"&gt;# 3. Environment variable bypass&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;SKIP_COMMIT_HOOKS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Emergency fix"&lt;/span&gt;

&lt;span class="c"&gt;# 4. Special branch for emergencies&lt;/span&gt;
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; emergency-fix
&lt;span class="c"&gt;# This branch could have different hooks or no hooks&lt;/span&gt;

&lt;span class="c"&gt;# 5. Post-commit cleanup&lt;/span&gt;
&lt;span class="c"&gt;# Commit without ticket, then amend:&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"fix: database connection"&lt;/span&gt; &lt;span class="nt"&gt;--no-verify&lt;/span&gt;
&lt;span class="c"&gt;# Get ticket created&lt;/span&gt;
git commit &lt;span class="nt"&gt;--amend&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"fix: database connection [PROD-456]"&lt;/span&gt;

&lt;span class="c"&gt;# Important: All emergency commits should be reviewed&lt;/span&gt;
&lt;span class="c"&gt;# and linked to tickets retroactively&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;Bonus: Git Configuration for Enterprise Teams&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# .gitconfig for all team members&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;core]
    editor &lt;span class="o"&gt;=&lt;/span&gt; code &lt;span class="nt"&gt;--wait&lt;/span&gt;  &lt;span class="c"&gt;# Use VSCode as editor&lt;/span&gt;
    autocrlf &lt;span class="o"&gt;=&lt;/span&gt; input      &lt;span class="c"&gt;# Linux/Mac line endings&lt;/span&gt;
    filemode &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;      &lt;span class="c"&gt;# Ignore permission changes&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;push]
    default &lt;span class="o"&gt;=&lt;/span&gt; current     &lt;span class="c"&gt;# Push current branch only&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;pull]
    rebase &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;         &lt;span class="c"&gt;# Rebase by default (local branches)&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;merge]
    ff &lt;span class="o"&gt;=&lt;/span&gt; only             &lt;span class="c"&gt;# Only fast-forward merges&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;rerere]
    enabled &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;        &lt;span class="c"&gt;# Reuse conflict resolutions&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;alias&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
    &lt;span class="c"&gt;# Safety aliases&lt;/span&gt;
    unstage &lt;span class="o"&gt;=&lt;/span&gt; restore &lt;span class="nt"&gt;--staged&lt;/span&gt;
    discard &lt;span class="o"&gt;=&lt;/span&gt; restore
    &lt;span class="c"&gt;# Useful aliases&lt;/span&gt;
    lol &lt;span class="o"&gt;=&lt;/span&gt; log &lt;span class="nt"&gt;--oneline&lt;/span&gt; &lt;span class="nt"&gt;--graph&lt;/span&gt; &lt;span class="nt"&gt;--all&lt;/span&gt;
    lola &lt;span class="o"&gt;=&lt;/span&gt; log &lt;span class="nt"&gt;--oneline&lt;/span&gt; &lt;span class="nt"&gt;--graph&lt;/span&gt; &lt;span class="nt"&gt;--all&lt;/span&gt; &lt;span class="nt"&gt;--decorate&lt;/span&gt;
    &lt;span class="c"&gt;# Undo aliases&lt;/span&gt;
    undo &lt;span class="o"&gt;=&lt;/span&gt; reset HEAD~1
    amend &lt;span class="o"&gt;=&lt;/span&gt; commit &lt;span class="nt"&gt;--amend&lt;/span&gt; &lt;span class="nt"&gt;--no-edit&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;commit]
    template &lt;span class="o"&gt;=&lt;/span&gt; ~/.gitmessage
&lt;span class="o"&gt;[&lt;/span&gt;init]
    defaultBranch &lt;span class="o"&gt;=&lt;/span&gt; main

&lt;span class="c"&gt;# Team-specific hooks in repo&lt;/span&gt;
&lt;span class="c"&gt;# These should be versioned in repo and installed via:&lt;/span&gt;
&lt;span class="c"&gt;# git config core.hooksPath .githooks&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Quick Wrap-Up
&lt;/h2&gt;

&lt;p&gt;Hope this helps make your Git days a bit smoother! If you've got ideas to add or fix something, hop over to the &lt;a href="https://github.com/hemant-dev-8/Git-Enterprise-Patterns-Practices" rel="noopener noreferrer"&gt;Git-Enterprise-Patterns-Practices&lt;/a&gt;. Fork it, send a pull request, or just give it a star ⭐ if it was useful. What's your go-to Git hack? Share in the comments—I'd love to hear! Thanks for reading. 😊&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>git</category>
      <category>github</category>
    </item>
    <item>
      <title>Some lesser-known aspects of React that many developers might not be fully aware</title>
      <dc:creator>Hemant</dc:creator>
      <pubDate>Sat, 03 Aug 2024 08:05:47 +0000</pubDate>
      <link>https://forem.com/hemant_the_devlpr/some-lesser-known-aspects-of-react-that-many-developers-might-not-be-fully-aware-405b</link>
      <guid>https://forem.com/hemant_the_devlpr/some-lesser-known-aspects-of-react-that-many-developers-might-not-be-fully-aware-405b</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Here are some lesser-known aspects of React that many developers might not be fully aware of:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Virtual DOM Diffing Is Not Always Perfect&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;React's virtual DOM diffing algorithm is quite efficient, but it's not flawless. It’s optimized for common scenarios but might not handle every edge case perfectly. For complex UI updates or performance-intensive applications, sometimes custom optimization or alternative approaches (like React.memo) are necessary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Functional Components and Performance&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Functional components can sometimes be more performant than class components because they avoid the overhead of the class system and lifecycle methods. However, without careful use of hooks like &lt;code&gt;useMemo&lt;/code&gt; and &lt;code&gt;useCallback&lt;/code&gt;, functional components can suffer from performance issues due to unnecessary re-renders.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Reconciliation and Keys&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When rendering lists, React uses keys to identify elements uniquely. However, keys do not need to be globally unique, but they must be unique among siblings. Improper use of keys (like using indexes) can lead to inefficient updates and bugs, especially when the list changes dynamically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Strict Mode Does Not Affect Production&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;React’s Strict Mode is a tool for identifying potential problems in development. It performs additional checks and invokes some lifecycle methods twice to highlight issues, but these checks do not affect the production build. Many developers mistakenly think these checks impact production performance or behavior.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Use of &lt;code&gt;useEffect&lt;/code&gt; and Cleanup&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;useEffect&lt;/code&gt; hook can be tricky. It’s essential to handle cleanup properly (e.g., in asynchronous operations) to avoid memory leaks. Forgetting to clean up effects, such as subscriptions or timers, can lead to unintended behavior or performance issues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Context API Performance Considerations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;While the Context API is useful for passing data down the component tree, it can lead to performance issues if not used carefully. Updating context values can trigger re-renders of all consuming components, even if they don't use the updated data. Using &lt;code&gt;React.memo&lt;/code&gt; or splitting context into smaller contexts can mitigate this issue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. React Fiber and Reconciliation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;React Fiber is the reconciliation algorithm that enables features like asynchronous rendering. It introduced a new internal architecture that improves the handling of complex UI updates, but it's not something most developers need to worry about directly. Understanding that React’s internals have evolved can help in troubleshooting and performance optimization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. React's Prop Drilling and Alternatives&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Prop drilling, where props are passed through multiple layers of components, can become cumbersome. While React’s Context API helps mitigate this issue, it’s also worth exploring other state management solutions like Redux, Zustand, or Recoil for more complex scenarios.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9. Development vs. Production Builds&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;React’s development build includes extra warnings and checks that are not present in the production build. This makes debugging easier but can impact performance. Always ensure that your application is using the production build for deployment to avoid unnecessary overhead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;10. Concurrent Mode and Future Features&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;React’s Concurrent Mode and experimental features promise significant improvements in rendering performance and user experience. However, these features are still experimental and not fully stabilized. They offer exciting possibilities but should be used with caution.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>react</category>
    </item>
  </channel>
</rss>
