[{"data":1,"prerenderedAt":3043},["ShallowReactive",2],{"/pl/articles/git-commands-every-junior-developer-should-master":3,"seo-stack":2882,"seo-faq-data-pl":2973},{"id":4,"title":5,"body":6,"date":2865,"description":2866,"extension":2867,"head":2868,"image":2869,"meta":2870,"navigation":142,"ogImage":2868,"path":2871,"readingTime":2872,"robots":2868,"schemaOrg":2868,"seo":2873,"sitemap":2874,"stem":2875,"tags":2876,"__hash__":2881},"articles_pl/pl/articles/git-commands-every-junior-developer-should-master.md","Komendy Git, które każdy junior developer powinien opanować",{"type":7,"value":8,"toc":2828},"minimark",[9,14,18,34,37,41,46,52,112,117,220,225,233,237,242,332,342,346,350,355,443,447,571,576,637,641,645,726,731,753,757,832,836,840,903,907,962,966,1045,1050,1124,1128,1189,1194,1208,1212,1216,1222,1391,1396,1493,1497,1543,1548,1583,1588,1675,1679,1736,1741,1780,1784,1788,1969,1974,2019,2023,2085,2089,2146,2150,2157,2354,2358,2363,2413,2418,2494,2499,2554,2558,2603,2607,2610,2615,2618,2621,2625,2824],[10,11,13],"h2",{"id":12},"wstęp","Wstęp",[15,16,17],"p",{},"Git jest jednym z najbardziej ważnych narzędzi dla każdego developera. Jeśli zaledwie używasz git add, git commit i git push, tracisz moc tego narzędzia.",[15,19,20,21,25,26,29,30,33],{},"When I started as a developer, I thought I knew Git. I could ",[22,23,24],"code",{},"git add",", ",[22,27,28],{},"git commit",", and ",[22,31,32],{},"git push",". But then came my first merge conflict, my first accidental commit to main, and my first \"oh no, I need to undo that.\" Suddenly, basic Git wasn't enough.",[15,35,36],{},"This guide covers the Git commands that transformed me from a nervous beginner to a confident contributor. No fluff—just the commands you'll actually use in real projects.",[10,38,40],{"id":39},"level-1-beyond-the-basics","Level 1: Beyond the Basics",[42,43,45],"h3",{"id":44},"the-commit-message-that-matters","The Commit Message That Matters",[15,47,48],{},[49,50,51],"strong",{},"Bad habits I had to break:",[53,54,59],"pre",{"className":55,"code":56,"language":57,"meta":58,"style":58},"language-bash shiki shiki-themes github-light github-dark github-dark","# ❌ Don't do this\ngit commit -m \"fixed stuff\"\ngit commit -m \"updates\"\ngit commit -m \"asdf\"\n","bash","",[22,60,61,70,88,100],{"__ignoreMap":58},[62,63,66],"span",{"class":64,"line":65},"line",1,[62,67,69],{"class":68},"sCsY4","# ❌ Don't do this\n",[62,71,73,77,81,85],{"class":64,"line":72},2,[62,74,76],{"class":75},"shcOC","git",[62,78,80],{"class":79},"sfrk1"," commit",[62,82,84],{"class":83},"suiK_"," -m",[62,86,87],{"class":79}," \"fixed stuff\"\n",[62,89,91,93,95,97],{"class":64,"line":90},3,[62,92,76],{"class":75},[62,94,80],{"class":79},[62,96,84],{"class":83},[62,98,99],{"class":79}," \"updates\"\n",[62,101,103,105,107,109],{"class":64,"line":102},4,[62,104,76],{"class":75},[62,106,80],{"class":79},[62,108,84],{"class":83},[62,110,111],{"class":79}," \"asdf\"\n",[15,113,114],{},[49,115,116],{},"What I learned to do:",[53,118,120],{"className":55,"code":119,"language":57,"meta":58,"style":58},"# ✅ Good commit messages\ngit commit -m \"fix: resolve null pointer in user login\n\n- Add null check before accessing user.email property\n- Add test case for login with missing email\n- Fixes #247\"\n\n# Follow conventional commits\ngit commit -m \"feat: add dark mode toggle to navigation\"\ngit commit -m \"refactor: simplify authentication logic\"\ngit commit -m \"docs: update API documentation for v2 endpoints\"\ngit commit -m \"test: add unit tests for payment validation\"\n",[22,121,122,127,138,144,149,155,161,166,172,184,196,208],{"__ignoreMap":58},[62,123,124],{"class":64,"line":65},[62,125,126],{"class":68},"# ✅ Good commit messages\n",[62,128,129,131,133,135],{"class":64,"line":72},[62,130,76],{"class":75},[62,132,80],{"class":79},[62,134,84],{"class":83},[62,136,137],{"class":79}," \"fix: resolve null pointer in user login\n",[62,139,140],{"class":64,"line":90},[62,141,143],{"emptyLinePlaceholder":142},true,"\n",[62,145,146],{"class":64,"line":102},[62,147,148],{"class":79},"- Add null check before accessing user.email property\n",[62,150,152],{"class":64,"line":151},5,[62,153,154],{"class":79},"- Add test case for login with missing email\n",[62,156,158],{"class":64,"line":157},6,[62,159,160],{"class":79},"- Fixes #247\"\n",[62,162,164],{"class":64,"line":163},7,[62,165,143],{"emptyLinePlaceholder":142},[62,167,169],{"class":64,"line":168},8,[62,170,171],{"class":68},"# Follow conventional commits\n",[62,173,175,177,179,181],{"class":64,"line":174},9,[62,176,76],{"class":75},[62,178,80],{"class":79},[62,180,84],{"class":83},[62,182,183],{"class":79}," \"feat: add dark mode toggle to navigation\"\n",[62,185,187,189,191,193],{"class":64,"line":186},10,[62,188,76],{"class":75},[62,190,80],{"class":79},[62,192,84],{"class":83},[62,194,195],{"class":79}," \"refactor: simplify authentication logic\"\n",[62,197,199,201,203,205],{"class":64,"line":198},11,[62,200,76],{"class":75},[62,202,80],{"class":79},[62,204,84],{"class":83},[62,206,207],{"class":79}," \"docs: update API documentation for v2 endpoints\"\n",[62,209,211,213,215,217],{"class":64,"line":210},12,[62,212,76],{"class":75},[62,214,80],{"class":79},[62,216,84],{"class":83},[62,218,219],{"class":79}," \"test: add unit tests for payment validation\"\n",[15,221,222],{},[49,223,224],{},"Commit Message Template:",[53,226,231],{"className":227,"code":229,"language":230},[228],"language-text","\u003Ctype>: \u003Cshort summary>\n\n\u003Coptional body>\n- Bullet point changes\n- Be specific about what changed\n\n\u003Coptional footer>\nFixes #issue-number\n","text",[22,232,229],{"__ignoreMap":58},[42,234,236],{"id":235},"checking-status-and-differences","Checking Status and Differences",[15,238,239],{},[49,240,241],{},"Commands I use every day:",[53,243,245],{"className":55,"code":244,"language":57,"meta":58,"style":58},"# See what's changed\ngit status\n\n# See what's different (before staging)\ngit diff\n\n# See what's staged for commit\ngit diff --staged\n\n# Compare branches\ngit diff main..feature-branch\n\n# See changes in a specific file\ngit diff path/to/file.ts\n",[22,246,247,252,259,263,268,275,279,284,294,298,303,312,316,322],{"__ignoreMap":58},[62,248,249],{"class":64,"line":65},[62,250,251],{"class":68},"# See what's changed\n",[62,253,254,256],{"class":64,"line":72},[62,255,76],{"class":75},[62,257,258],{"class":79}," status\n",[62,260,261],{"class":64,"line":90},[62,262,143],{"emptyLinePlaceholder":142},[62,264,265],{"class":64,"line":102},[62,266,267],{"class":68},"# See what's different (before staging)\n",[62,269,270,272],{"class":64,"line":151},[62,271,76],{"class":75},[62,273,274],{"class":79}," diff\n",[62,276,277],{"class":64,"line":157},[62,278,143],{"emptyLinePlaceholder":142},[62,280,281],{"class":64,"line":163},[62,282,283],{"class":68},"# See what's staged for commit\n",[62,285,286,288,291],{"class":64,"line":168},[62,287,76],{"class":75},[62,289,290],{"class":79}," diff",[62,292,293],{"class":83}," --staged\n",[62,295,296],{"class":64,"line":174},[62,297,143],{"emptyLinePlaceholder":142},[62,299,300],{"class":64,"line":186},[62,301,302],{"class":68},"# Compare branches\n",[62,304,305,307,309],{"class":64,"line":198},[62,306,76],{"class":75},[62,308,290],{"class":79},[62,310,311],{"class":79}," main..feature-branch\n",[62,313,314],{"class":64,"line":210},[62,315,143],{"emptyLinePlaceholder":142},[62,317,319],{"class":64,"line":318},13,[62,320,321],{"class":68},"# See changes in a specific file\n",[62,323,325,327,329],{"class":64,"line":324},14,[62,326,76],{"class":75},[62,328,290],{"class":79},[62,330,331],{"class":79}," path/to/file.ts\n",[15,333,334,337,338,341],{},[49,335,336],{},"Pro tip:"," Use ",[22,339,340],{},"git status -s"," for a cleaner, shorter output.",[10,343,345],{"id":344},"level-2-branching-like-a-pro","Level 2: Branching Like a Pro",[42,347,349],{"id":348},"creating-and-switching-branches","Creating and Switching Branches",[15,351,352],{},[49,353,354],{},"The evolution of my workflow:",[53,356,358],{"className":55,"code":357,"language":57,"meta":58,"style":58},"# Old way (still works)\ngit branch feature-login\ngit checkout feature-login\n\n# Better way\ngit checkout -b feature-login\n\n# Modern way (Git 2.23+)\ngit switch -c feature-login\n\n# Switch to existing branch\ngit switch main\n",[22,359,360,365,375,384,388,393,404,408,413,425,429,434],{"__ignoreMap":58},[62,361,362],{"class":64,"line":65},[62,363,364],{"class":68},"# Old way (still works)\n",[62,366,367,369,372],{"class":64,"line":72},[62,368,76],{"class":75},[62,370,371],{"class":79}," branch",[62,373,374],{"class":79}," feature-login\n",[62,376,377,379,382],{"class":64,"line":90},[62,378,76],{"class":75},[62,380,381],{"class":79}," checkout",[62,383,374],{"class":79},[62,385,386],{"class":64,"line":102},[62,387,143],{"emptyLinePlaceholder":142},[62,389,390],{"class":64,"line":151},[62,391,392],{"class":68},"# Better way\n",[62,394,395,397,399,402],{"class":64,"line":157},[62,396,76],{"class":75},[62,398,381],{"class":79},[62,400,401],{"class":83}," -b",[62,403,374],{"class":79},[62,405,406],{"class":64,"line":163},[62,407,143],{"emptyLinePlaceholder":142},[62,409,410],{"class":64,"line":168},[62,411,412],{"class":68},"# Modern way (Git 2.23+)\n",[62,414,415,417,420,423],{"class":64,"line":174},[62,416,76],{"class":75},[62,418,419],{"class":79}," switch",[62,421,422],{"class":83}," -c",[62,424,374],{"class":79},[62,426,427],{"class":64,"line":186},[62,428,143],{"emptyLinePlaceholder":142},[62,430,431],{"class":64,"line":198},[62,432,433],{"class":68},"# Switch to existing branch\n",[62,435,436,438,440],{"class":64,"line":210},[62,437,76],{"class":75},[62,439,419],{"class":79},[62,441,442],{"class":79}," main\n",[42,444,446],{"id":445},"branch-management","Branch Management",[53,448,450],{"className":55,"code":449,"language":57,"meta":58,"style":58},"# List all branches\ngit branch -a\n\n# List remote branches only\ngit branch -r\n\n# Delete a local branch\ngit branch -d feature-login\n\n# Force delete (if not merged)\ngit branch -D feature-login\n\n# Delete remote branch\ngit push origin --delete feature-login\n\n# Rename current branch\ngit branch -m new-branch-name\n",[22,451,452,457,466,470,475,484,488,493,504,508,513,524,528,533,548,553,559],{"__ignoreMap":58},[62,453,454],{"class":64,"line":65},[62,455,456],{"class":68},"# List all branches\n",[62,458,459,461,463],{"class":64,"line":72},[62,460,76],{"class":75},[62,462,371],{"class":79},[62,464,465],{"class":83}," -a\n",[62,467,468],{"class":64,"line":90},[62,469,143],{"emptyLinePlaceholder":142},[62,471,472],{"class":64,"line":102},[62,473,474],{"class":68},"# List remote branches only\n",[62,476,477,479,481],{"class":64,"line":151},[62,478,76],{"class":75},[62,480,371],{"class":79},[62,482,483],{"class":83}," -r\n",[62,485,486],{"class":64,"line":157},[62,487,143],{"emptyLinePlaceholder":142},[62,489,490],{"class":64,"line":163},[62,491,492],{"class":68},"# Delete a local branch\n",[62,494,495,497,499,502],{"class":64,"line":168},[62,496,76],{"class":75},[62,498,371],{"class":79},[62,500,501],{"class":83}," -d",[62,503,374],{"class":79},[62,505,506],{"class":64,"line":174},[62,507,143],{"emptyLinePlaceholder":142},[62,509,510],{"class":64,"line":186},[62,511,512],{"class":68},"# Force delete (if not merged)\n",[62,514,515,517,519,522],{"class":64,"line":198},[62,516,76],{"class":75},[62,518,371],{"class":79},[62,520,521],{"class":83}," -D",[62,523,374],{"class":79},[62,525,526],{"class":64,"line":210},[62,527,143],{"emptyLinePlaceholder":142},[62,529,530],{"class":64,"line":318},[62,531,532],{"class":68},"# Delete remote branch\n",[62,534,535,537,540,543,546],{"class":64,"line":324},[62,536,76],{"class":75},[62,538,539],{"class":79}," push",[62,541,542],{"class":79}," origin",[62,544,545],{"class":83}," --delete",[62,547,374],{"class":79},[62,549,551],{"class":64,"line":550},15,[62,552,143],{"emptyLinePlaceholder":142},[62,554,556],{"class":64,"line":555},16,[62,557,558],{"class":68},"# Rename current branch\n",[62,560,562,564,566,568],{"class":64,"line":561},17,[62,563,76],{"class":75},[62,565,371],{"class":79},[62,567,84],{"class":83},[62,569,570],{"class":79}," new-branch-name\n",[15,572,573],{},[49,574,575],{},"My Branching Strategy:",[53,577,579],{"className":55,"code":578,"language":57,"meta":58,"style":58},"# Feature development\ngit switch -c feature/user-authentication\n\n# Bug fixes\ngit switch -c fix/login-validation-error\n\n# Hotfix for production\ngit switch -c hotfix/security-patch\n",[22,580,581,586,597,601,606,617,621,626],{"__ignoreMap":58},[62,582,583],{"class":64,"line":65},[62,584,585],{"class":68},"# Feature development\n",[62,587,588,590,592,594],{"class":64,"line":72},[62,589,76],{"class":75},[62,591,419],{"class":79},[62,593,422],{"class":83},[62,595,596],{"class":79}," feature/user-authentication\n",[62,598,599],{"class":64,"line":90},[62,600,143],{"emptyLinePlaceholder":142},[62,602,603],{"class":64,"line":102},[62,604,605],{"class":68},"# Bug fixes\n",[62,607,608,610,612,614],{"class":64,"line":151},[62,609,76],{"class":75},[62,611,419],{"class":79},[62,613,422],{"class":83},[62,615,616],{"class":79}," fix/login-validation-error\n",[62,618,619],{"class":64,"line":157},[62,620,143],{"emptyLinePlaceholder":142},[62,622,623],{"class":64,"line":163},[62,624,625],{"class":68},"# Hotfix for production\n",[62,627,628,630,632,634],{"class":64,"line":168},[62,629,76],{"class":75},[62,631,419],{"class":79},[62,633,422],{"class":83},[62,635,636],{"class":79}," hotfix/security-patch\n",[10,638,640],{"id":639},"level-3-syncing-with-remote","Level 3: Syncing with Remote",[42,642,644],{"id":643},"fetch-vs-pull-the-difference-that-matters","Fetch vs Pull (The Difference That Matters)",[53,646,648],{"className":55,"code":647,"language":57,"meta":58,"style":58},"# Fetch: Download changes but don't merge\ngit fetch origin\n\n# See what's new\ngit log HEAD..origin/main\n\n# Pull: Fetch + Merge\ngit pull origin main\n\n# Pull with rebase (cleaner history)\ngit pull --rebase origin main\n",[22,649,650,655,665,669,674,684,688,693,704,708,713],{"__ignoreMap":58},[62,651,652],{"class":64,"line":65},[62,653,654],{"class":68},"# Fetch: Download changes but don't merge\n",[62,656,657,659,662],{"class":64,"line":72},[62,658,76],{"class":75},[62,660,661],{"class":79}," fetch",[62,663,664],{"class":79}," origin\n",[62,666,667],{"class":64,"line":90},[62,668,143],{"emptyLinePlaceholder":142},[62,670,671],{"class":64,"line":102},[62,672,673],{"class":68},"# See what's new\n",[62,675,676,678,681],{"class":64,"line":151},[62,677,76],{"class":75},[62,679,680],{"class":79}," log",[62,682,683],{"class":79}," HEAD..origin/main\n",[62,685,686],{"class":64,"line":157},[62,687,143],{"emptyLinePlaceholder":142},[62,689,690],{"class":64,"line":163},[62,691,692],{"class":68},"# Pull: Fetch + Merge\n",[62,694,695,697,700,702],{"class":64,"line":168},[62,696,76],{"class":75},[62,698,699],{"class":79}," pull",[62,701,542],{"class":79},[62,703,442],{"class":79},[62,705,706],{"class":64,"line":174},[62,707,143],{"emptyLinePlaceholder":142},[62,709,710],{"class":64,"line":186},[62,711,712],{"class":68},"# Pull with rebase (cleaner history)\n",[62,714,715,717,719,722,724],{"class":64,"line":198},[62,716,76],{"class":75},[62,718,699],{"class":79},[62,720,721],{"class":83}," --rebase",[62,723,542],{"class":79},[62,725,442],{"class":79},[15,727,728],{},[49,729,730],{},"When I use each:",[732,733,734,741,747],"ul",{},[735,736,737,740],"li",{},[22,738,739],{},"git fetch",": When I want to see what's changed before merging",[735,742,743,746],{},[22,744,745],{},"git pull",": When I'm ready to merge remote changes",[735,748,749,752],{},[22,750,751],{},"git pull --rebase",": When I want to keep my commits on top",[42,754,756],{"id":755},"pushing-with-confidence","Pushing with Confidence",[53,758,760],{"className":55,"code":759,"language":57,"meta":58,"style":58},"# Push current branch\ngit push\n\n# Set upstream and push\ngit push -u origin feature-login\n\n# Force push (use with caution!)\ngit push --force-with-lease\n\n# ⚠️ Never use on shared branches!\ngit push --force\n",[22,761,762,767,774,778,783,796,800,805,814,818,823],{"__ignoreMap":58},[62,763,764],{"class":64,"line":65},[62,765,766],{"class":68},"# Push current branch\n",[62,768,769,771],{"class":64,"line":72},[62,770,76],{"class":75},[62,772,773],{"class":79}," push\n",[62,775,776],{"class":64,"line":90},[62,777,143],{"emptyLinePlaceholder":142},[62,779,780],{"class":64,"line":102},[62,781,782],{"class":68},"# Set upstream and push\n",[62,784,785,787,789,792,794],{"class":64,"line":151},[62,786,76],{"class":75},[62,788,539],{"class":79},[62,790,791],{"class":83}," -u",[62,793,542],{"class":79},[62,795,374],{"class":79},[62,797,798],{"class":64,"line":157},[62,799,143],{"emptyLinePlaceholder":142},[62,801,802],{"class":64,"line":163},[62,803,804],{"class":68},"# Force push (use with caution!)\n",[62,806,807,809,811],{"class":64,"line":168},[62,808,76],{"class":75},[62,810,539],{"class":79},[62,812,813],{"class":83}," --force-with-lease\n",[62,815,816],{"class":64,"line":174},[62,817,143],{"emptyLinePlaceholder":142},[62,819,820],{"class":64,"line":186},[62,821,822],{"class":68},"# ⚠️ Never use on shared branches!\n",[62,824,825,827,829],{"class":64,"line":198},[62,826,76],{"class":75},[62,828,539],{"class":79},[62,830,831],{"class":83}," --force\n",[10,833,835],{"id":834},"level-4-undoing-mistakes-lifesavers","Level 4: Undoing Mistakes (Lifesavers)",[42,837,839],{"id":838},"unstaging-files","Unstaging Files",[53,841,843],{"className":55,"code":842,"language":57,"meta":58,"style":58},"# Unstage a specific file\ngit restore --staged file.ts\n\n# Unstage all files\ngit restore --staged .\n\n# Old way (still works)\ngit reset HEAD file.ts\n",[22,844,845,850,863,867,872,883,887,891],{"__ignoreMap":58},[62,846,847],{"class":64,"line":65},[62,848,849],{"class":68},"# Unstage a specific file\n",[62,851,852,854,857,860],{"class":64,"line":72},[62,853,76],{"class":75},[62,855,856],{"class":79}," restore",[62,858,859],{"class":83}," --staged",[62,861,862],{"class":79}," file.ts\n",[62,864,865],{"class":64,"line":90},[62,866,143],{"emptyLinePlaceholder":142},[62,868,869],{"class":64,"line":102},[62,870,871],{"class":68},"# Unstage all files\n",[62,873,874,876,878,880],{"class":64,"line":151},[62,875,76],{"class":75},[62,877,856],{"class":79},[62,879,859],{"class":83},[62,881,882],{"class":79}," .\n",[62,884,885],{"class":64,"line":157},[62,886,143],{"emptyLinePlaceholder":142},[62,888,889],{"class":64,"line":163},[62,890,364],{"class":68},[62,892,893,895,898,901],{"class":64,"line":168},[62,894,76],{"class":75},[62,896,897],{"class":79}," reset",[62,899,900],{"class":79}," HEAD",[62,902,862],{"class":79},[42,904,906],{"id":905},"discarding-changes","Discarding Changes",[53,908,910],{"className":55,"code":909,"language":57,"meta":58,"style":58},"# Discard changes in a specific file\ngit restore file.ts\n\n# Discard all changes (be careful!)\ngit restore .\n\n# Old way\ngit checkout -- file.ts\n",[22,911,912,917,925,929,934,942,946,951],{"__ignoreMap":58},[62,913,914],{"class":64,"line":65},[62,915,916],{"class":68},"# Discard changes in a specific file\n",[62,918,919,921,923],{"class":64,"line":72},[62,920,76],{"class":75},[62,922,856],{"class":79},[62,924,862],{"class":79},[62,926,927],{"class":64,"line":90},[62,928,143],{"emptyLinePlaceholder":142},[62,930,931],{"class":64,"line":102},[62,932,933],{"class":68},"# Discard all changes (be careful!)\n",[62,935,936,938,940],{"class":64,"line":151},[62,937,76],{"class":75},[62,939,856],{"class":79},[62,941,882],{"class":79},[62,943,944],{"class":64,"line":157},[62,945,143],{"emptyLinePlaceholder":142},[62,947,948],{"class":64,"line":163},[62,949,950],{"class":68},"# Old way\n",[62,952,953,955,957,960],{"class":64,"line":168},[62,954,76],{"class":75},[62,956,381],{"class":79},[62,958,959],{"class":83}," --",[62,961,862],{"class":79},[42,963,965],{"id":964},"undoing-commits","Undoing Commits",[53,967,969],{"className":55,"code":968,"language":57,"meta":58,"style":58},"# Undo last commit, keep changes staged\ngit reset --soft HEAD~1\n\n# Undo last commit, keep changes unstaged\ngit reset HEAD~1\n\n# Undo last commit, discard all changes ⚠️\ngit reset --hard HEAD~1\n\n# Undo multiple commits\ngit reset --soft HEAD~3\n",[22,970,971,976,988,992,997,1005,1009,1014,1025,1029,1034],{"__ignoreMap":58},[62,972,973],{"class":64,"line":65},[62,974,975],{"class":68},"# Undo last commit, keep changes staged\n",[62,977,978,980,982,985],{"class":64,"line":72},[62,979,76],{"class":75},[62,981,897],{"class":79},[62,983,984],{"class":83}," --soft",[62,986,987],{"class":79}," HEAD~1\n",[62,989,990],{"class":64,"line":90},[62,991,143],{"emptyLinePlaceholder":142},[62,993,994],{"class":64,"line":102},[62,995,996],{"class":68},"# Undo last commit, keep changes unstaged\n",[62,998,999,1001,1003],{"class":64,"line":151},[62,1000,76],{"class":75},[62,1002,897],{"class":79},[62,1004,987],{"class":79},[62,1006,1007],{"class":64,"line":157},[62,1008,143],{"emptyLinePlaceholder":142},[62,1010,1011],{"class":64,"line":163},[62,1012,1013],{"class":68},"# Undo last commit, discard all changes ⚠️\n",[62,1015,1016,1018,1020,1023],{"class":64,"line":168},[62,1017,76],{"class":75},[62,1019,897],{"class":79},[62,1021,1022],{"class":83}," --hard",[62,1024,987],{"class":79},[62,1026,1027],{"class":64,"line":174},[62,1028,143],{"emptyLinePlaceholder":142},[62,1030,1031],{"class":64,"line":186},[62,1032,1033],{"class":68},"# Undo multiple commits\n",[62,1035,1036,1038,1040,1042],{"class":64,"line":198},[62,1037,76],{"class":75},[62,1039,897],{"class":79},[62,1041,984],{"class":83},[62,1043,1044],{"class":79}," HEAD~3\n",[15,1046,1047],{},[49,1048,1049],{},"Real scenario I faced:",[53,1051,1053],{"className":55,"code":1052,"language":57,"meta":58,"style":58},"# Oops, committed to main instead of a feature branch!\n\n# 1. Create the feature branch (keeps the commits)\ngit branch feature-my-work\n\n# 2. Reset main to match remote\ngit reset --hard origin/main\n\n# 3. Switch to feature branch\ngit switch feature-my-work\n\n# 4. Now your commits are safe on the feature branch!\n",[22,1054,1055,1060,1064,1069,1078,1082,1087,1098,1102,1107,1115,1119],{"__ignoreMap":58},[62,1056,1057],{"class":64,"line":65},[62,1058,1059],{"class":68},"# Oops, committed to main instead of a feature branch!\n",[62,1061,1062],{"class":64,"line":72},[62,1063,143],{"emptyLinePlaceholder":142},[62,1065,1066],{"class":64,"line":90},[62,1067,1068],{"class":68},"# 1. Create the feature branch (keeps the commits)\n",[62,1070,1071,1073,1075],{"class":64,"line":102},[62,1072,76],{"class":75},[62,1074,371],{"class":79},[62,1076,1077],{"class":79}," feature-my-work\n",[62,1079,1080],{"class":64,"line":151},[62,1081,143],{"emptyLinePlaceholder":142},[62,1083,1084],{"class":64,"line":157},[62,1085,1086],{"class":68},"# 2. Reset main to match remote\n",[62,1088,1089,1091,1093,1095],{"class":64,"line":163},[62,1090,76],{"class":75},[62,1092,897],{"class":79},[62,1094,1022],{"class":83},[62,1096,1097],{"class":79}," origin/main\n",[62,1099,1100],{"class":64,"line":168},[62,1101,143],{"emptyLinePlaceholder":142},[62,1103,1104],{"class":64,"line":174},[62,1105,1106],{"class":68},"# 3. Switch to feature branch\n",[62,1108,1109,1111,1113],{"class":64,"line":186},[62,1110,76],{"class":75},[62,1112,419],{"class":79},[62,1114,1077],{"class":79},[62,1116,1117],{"class":64,"line":198},[62,1118,143],{"emptyLinePlaceholder":142},[62,1120,1121],{"class":64,"line":210},[62,1122,1123],{"class":68},"# 4. Now your commits are safe on the feature branch!\n",[42,1125,1127],{"id":1126},"the-magic-of-revert","The Magic of Revert",[53,1129,1131],{"className":55,"code":1130,"language":57,"meta":58,"style":58},"# Create a new commit that undoes changes\ngit revert abc123\n\n# Revert multiple commits\ngit revert abc123 def456\n\n# Revert without committing yet\ngit revert --no-commit abc123\n",[22,1132,1133,1138,1148,1152,1157,1169,1173,1178],{"__ignoreMap":58},[62,1134,1135],{"class":64,"line":65},[62,1136,1137],{"class":68},"# Create a new commit that undoes changes\n",[62,1139,1140,1142,1145],{"class":64,"line":72},[62,1141,76],{"class":75},[62,1143,1144],{"class":79}," revert",[62,1146,1147],{"class":79}," abc123\n",[62,1149,1150],{"class":64,"line":90},[62,1151,143],{"emptyLinePlaceholder":142},[62,1153,1154],{"class":64,"line":102},[62,1155,1156],{"class":68},"# Revert multiple commits\n",[62,1158,1159,1161,1163,1166],{"class":64,"line":151},[62,1160,76],{"class":75},[62,1162,1144],{"class":79},[62,1164,1165],{"class":79}," abc123",[62,1167,1168],{"class":79}," def456\n",[62,1170,1171],{"class":64,"line":157},[62,1172,143],{"emptyLinePlaceholder":142},[62,1174,1175],{"class":64,"line":163},[62,1176,1177],{"class":68},"# Revert without committing yet\n",[62,1179,1180,1182,1184,1187],{"class":64,"line":168},[62,1181,76],{"class":75},[62,1183,1144],{"class":79},[62,1185,1186],{"class":83}," --no-commit",[62,1188,1147],{"class":79},[15,1190,1191],{},[49,1192,1193],{},"When to use revert vs reset:",[732,1195,1196,1202],{},[735,1197,1198,1201],{},[49,1199,1200],{},"Reset:"," For local commits not pushed yet",[735,1203,1204,1207],{},[49,1205,1206],{},"Revert:"," For commits already pushed (safe for shared branches)",[10,1209,1211],{"id":1210},"level-5-advanced-workflows","Level 5: Advanced Workflows",[42,1213,1215],{"id":1214},"stashing-your-secret-weapon","Stashing: Your Secret Weapon",[15,1217,1218,1221],{},[49,1219,1220],{},"Scenario:"," You're working on a feature, but need to quickly fix a bug on main.",[53,1223,1225],{"className":55,"code":1224,"language":57,"meta":58,"style":58},"# Save current work\ngit stash\n\n# Or with a message\ngit stash save \"WIP: user authentication form\"\n\n# List stashes\ngit stash list\n\n# Apply most recent stash\ngit stash pop\n\n# Apply specific stash\ngit stash apply stash@{1}\n\n# Apply and keep in stash\ngit stash apply\n\n# Delete stash\ngit stash drop stash@{0}\n\n# Clear all stashes\ngit stash clear\n",[22,1226,1227,1232,1239,1243,1248,1261,1265,1270,1279,1283,1288,1297,1301,1306,1324,1328,1333,1342,1347,1353,1370,1375,1381],{"__ignoreMap":58},[62,1228,1229],{"class":64,"line":65},[62,1230,1231],{"class":68},"# Save current work\n",[62,1233,1234,1236],{"class":64,"line":72},[62,1235,76],{"class":75},[62,1237,1238],{"class":79}," stash\n",[62,1240,1241],{"class":64,"line":90},[62,1242,143],{"emptyLinePlaceholder":142},[62,1244,1245],{"class":64,"line":102},[62,1246,1247],{"class":68},"# Or with a message\n",[62,1249,1250,1252,1255,1258],{"class":64,"line":151},[62,1251,76],{"class":75},[62,1253,1254],{"class":79}," stash",[62,1256,1257],{"class":79}," save",[62,1259,1260],{"class":79}," \"WIP: user authentication form\"\n",[62,1262,1263],{"class":64,"line":157},[62,1264,143],{"emptyLinePlaceholder":142},[62,1266,1267],{"class":64,"line":163},[62,1268,1269],{"class":68},"# List stashes\n",[62,1271,1272,1274,1276],{"class":64,"line":168},[62,1273,76],{"class":75},[62,1275,1254],{"class":79},[62,1277,1278],{"class":79}," list\n",[62,1280,1281],{"class":64,"line":174},[62,1282,143],{"emptyLinePlaceholder":142},[62,1284,1285],{"class":64,"line":186},[62,1286,1287],{"class":68},"# Apply most recent stash\n",[62,1289,1290,1292,1294],{"class":64,"line":198},[62,1291,76],{"class":75},[62,1293,1254],{"class":79},[62,1295,1296],{"class":79}," pop\n",[62,1298,1299],{"class":64,"line":210},[62,1300,143],{"emptyLinePlaceholder":142},[62,1302,1303],{"class":64,"line":318},[62,1304,1305],{"class":68},"# Apply specific stash\n",[62,1307,1308,1310,1312,1315,1318,1321],{"class":64,"line":324},[62,1309,76],{"class":75},[62,1311,1254],{"class":79},[62,1313,1314],{"class":79}," apply",[62,1316,1317],{"class":79}," stash@{",[62,1319,1320],{"class":83},"1",[62,1322,1323],{"class":79},"}\n",[62,1325,1326],{"class":64,"line":550},[62,1327,143],{"emptyLinePlaceholder":142},[62,1329,1330],{"class":64,"line":555},[62,1331,1332],{"class":68},"# Apply and keep in stash\n",[62,1334,1335,1337,1339],{"class":64,"line":561},[62,1336,76],{"class":75},[62,1338,1254],{"class":79},[62,1340,1341],{"class":79}," apply\n",[62,1343,1345],{"class":64,"line":1344},18,[62,1346,143],{"emptyLinePlaceholder":142},[62,1348,1350],{"class":64,"line":1349},19,[62,1351,1352],{"class":68},"# Delete stash\n",[62,1354,1356,1358,1360,1363,1365,1368],{"class":64,"line":1355},20,[62,1357,76],{"class":75},[62,1359,1254],{"class":79},[62,1361,1362],{"class":79}," drop",[62,1364,1317],{"class":79},[62,1366,1367],{"class":83},"0",[62,1369,1323],{"class":79},[62,1371,1373],{"class":64,"line":1372},21,[62,1374,143],{"emptyLinePlaceholder":142},[62,1376,1378],{"class":64,"line":1377},22,[62,1379,1380],{"class":68},"# Clear all stashes\n",[62,1382,1384,1386,1388],{"class":64,"line":1383},23,[62,1385,76],{"class":75},[62,1387,1254],{"class":79},[62,1389,1390],{"class":79}," clear\n",[15,1392,1393],{},[49,1394,1395],{},"My typical workflow:",[53,1397,1399],{"className":55,"code":1398,"language":57,"meta":58,"style":58},"# Working on feature-login\ngit stash save \"half-done: login form validation\"\n\n# Switch to main and fix bug\ngit switch main\ngit pull\n# ... make fixes ...\ngit commit -m \"fix: critical security patch\"\ngit push\n\n# Back to feature\ngit switch feature-login\ngit stash pop\n# Continue working\n",[22,1400,1401,1406,1417,1421,1426,1434,1441,1446,1457,1463,1467,1472,1480,1488],{"__ignoreMap":58},[62,1402,1403],{"class":64,"line":65},[62,1404,1405],{"class":68},"# Working on feature-login\n",[62,1407,1408,1410,1412,1414],{"class":64,"line":72},[62,1409,76],{"class":75},[62,1411,1254],{"class":79},[62,1413,1257],{"class":79},[62,1415,1416],{"class":79}," \"half-done: login form validation\"\n",[62,1418,1419],{"class":64,"line":90},[62,1420,143],{"emptyLinePlaceholder":142},[62,1422,1423],{"class":64,"line":102},[62,1424,1425],{"class":68},"# Switch to main and fix bug\n",[62,1427,1428,1430,1432],{"class":64,"line":151},[62,1429,76],{"class":75},[62,1431,419],{"class":79},[62,1433,442],{"class":79},[62,1435,1436,1438],{"class":64,"line":157},[62,1437,76],{"class":75},[62,1439,1440],{"class":79}," pull\n",[62,1442,1443],{"class":64,"line":163},[62,1444,1445],{"class":68},"# ... make fixes ...\n",[62,1447,1448,1450,1452,1454],{"class":64,"line":168},[62,1449,76],{"class":75},[62,1451,80],{"class":79},[62,1453,84],{"class":83},[62,1455,1456],{"class":79}," \"fix: critical security patch\"\n",[62,1458,1459,1461],{"class":64,"line":174},[62,1460,76],{"class":75},[62,1462,773],{"class":79},[62,1464,1465],{"class":64,"line":186},[62,1466,143],{"emptyLinePlaceholder":142},[62,1468,1469],{"class":64,"line":198},[62,1470,1471],{"class":68},"# Back to feature\n",[62,1473,1474,1476,1478],{"class":64,"line":210},[62,1475,76],{"class":75},[62,1477,419],{"class":79},[62,1479,374],{"class":79},[62,1481,1482,1484,1486],{"class":64,"line":318},[62,1483,76],{"class":75},[62,1485,1254],{"class":79},[62,1487,1296],{"class":79},[62,1489,1490],{"class":64,"line":324},[62,1491,1492],{"class":68},"# Continue working\n",[42,1494,1496],{"id":1495},"interactive-rebase-clean-up-your-history","Interactive Rebase: Clean Up Your History",[53,1498,1500],{"className":55,"code":1499,"language":57,"meta":58,"style":58},"# Rebase last 3 commits\ngit rebase -i HEAD~3\n\n# This opens an editor with:\n# pick abc123 feat: add login form\n# pick def456 fix: typo\n# pick ghi789 feat: add validation\n",[22,1501,1502,1507,1519,1523,1528,1533,1538],{"__ignoreMap":58},[62,1503,1504],{"class":64,"line":65},[62,1505,1506],{"class":68},"# Rebase last 3 commits\n",[62,1508,1509,1511,1514,1517],{"class":64,"line":72},[62,1510,76],{"class":75},[62,1512,1513],{"class":79}," rebase",[62,1515,1516],{"class":83}," -i",[62,1518,1044],{"class":79},[62,1520,1521],{"class":64,"line":90},[62,1522,143],{"emptyLinePlaceholder":142},[62,1524,1525],{"class":64,"line":102},[62,1526,1527],{"class":68},"# This opens an editor with:\n",[62,1529,1530],{"class":64,"line":151},[62,1531,1532],{"class":68},"# pick abc123 feat: add login form\n",[62,1534,1535],{"class":64,"line":157},[62,1536,1537],{"class":68},"# pick def456 fix: typo\n",[62,1539,1540],{"class":64,"line":163},[62,1541,1542],{"class":68},"# pick ghi789 feat: add validation\n",[15,1544,1545],{},[49,1546,1547],{},"Available commands in interactive rebase:",[53,1549,1551],{"className":55,"code":1550,"language":57,"meta":58,"style":58},"# pick = use commit\n# reword = change commit message\n# edit = pause to amend commit\n# squash = combine with previous commit\n# fixup = like squash, but discard commit message\n# drop = remove commit\n",[22,1552,1553,1558,1563,1568,1573,1578],{"__ignoreMap":58},[62,1554,1555],{"class":64,"line":65},[62,1556,1557],{"class":68},"# pick = use commit\n",[62,1559,1560],{"class":64,"line":72},[62,1561,1562],{"class":68},"# reword = change commit message\n",[62,1564,1565],{"class":64,"line":90},[62,1566,1567],{"class":68},"# edit = pause to amend commit\n",[62,1569,1570],{"class":64,"line":102},[62,1571,1572],{"class":68},"# squash = combine with previous commit\n",[62,1574,1575],{"class":64,"line":151},[62,1576,1577],{"class":68},"# fixup = like squash, but discard commit message\n",[62,1579,1580],{"class":64,"line":157},[62,1581,1582],{"class":68},"# drop = remove commit\n",[15,1584,1585],{},[49,1586,1587],{},"Example: Cleaning up commits before a PR",[53,1589,1591],{"className":55,"code":1590,"language":57,"meta":58,"style":58},"pick abc123 feat: add login form\nfixup def456 fix: typo in login form\nfixup ghi789 fix: another small fix\nreword jkl012 feat: add validation\n\n# Results in 2 clean commits instead of 4 messy ones\n",[22,1592,1593,1612,1633,1651,1666,1670],{"__ignoreMap":58},[62,1594,1595,1598,1600,1603,1606,1609],{"class":64,"line":65},[62,1596,1597],{"class":75},"pick",[62,1599,1165],{"class":79},[62,1601,1602],{"class":79}," feat:",[62,1604,1605],{"class":79}," add",[62,1607,1608],{"class":79}," login",[62,1610,1611],{"class":79}," form\n",[62,1613,1614,1617,1620,1623,1626,1629,1631],{"class":64,"line":72},[62,1615,1616],{"class":75},"fixup",[62,1618,1619],{"class":79}," def456",[62,1621,1622],{"class":79}," fix:",[62,1624,1625],{"class":79}," typo",[62,1627,1628],{"class":79}," in",[62,1630,1608],{"class":79},[62,1632,1611],{"class":79},[62,1634,1635,1637,1640,1642,1645,1648],{"class":64,"line":90},[62,1636,1616],{"class":75},[62,1638,1639],{"class":79}," ghi789",[62,1641,1622],{"class":79},[62,1643,1644],{"class":79}," another",[62,1646,1647],{"class":79}," small",[62,1649,1650],{"class":79}," fix\n",[62,1652,1653,1656,1659,1661,1663],{"class":64,"line":102},[62,1654,1655],{"class":75},"reword",[62,1657,1658],{"class":79}," jkl012",[62,1660,1602],{"class":79},[62,1662,1605],{"class":79},[62,1664,1665],{"class":79}," validation\n",[62,1667,1668],{"class":64,"line":151},[62,1669,143],{"emptyLinePlaceholder":142},[62,1671,1672],{"class":64,"line":157},[62,1673,1674],{"class":68},"# Results in 2 clean commits instead of 4 messy ones\n",[42,1676,1678],{"id":1677},"cherry-picking-commits","Cherry-Picking Commits",[53,1680,1682],{"className":55,"code":1681,"language":57,"meta":58,"style":58},"# Apply a specific commit from another branch\ngit cherry-pick abc123\n\n# Cherry-pick multiple commits\ngit cherry-pick abc123 def456\n\n# Cherry-pick without committing\ngit cherry-pick --no-commit abc123\n",[22,1683,1684,1689,1698,1702,1707,1717,1721,1726],{"__ignoreMap":58},[62,1685,1686],{"class":64,"line":65},[62,1687,1688],{"class":68},"# Apply a specific commit from another branch\n",[62,1690,1691,1693,1696],{"class":64,"line":72},[62,1692,76],{"class":75},[62,1694,1695],{"class":79}," cherry-pick",[62,1697,1147],{"class":79},[62,1699,1700],{"class":64,"line":90},[62,1701,143],{"emptyLinePlaceholder":142},[62,1703,1704],{"class":64,"line":102},[62,1705,1706],{"class":68},"# Cherry-pick multiple commits\n",[62,1708,1709,1711,1713,1715],{"class":64,"line":151},[62,1710,76],{"class":75},[62,1712,1695],{"class":79},[62,1714,1165],{"class":79},[62,1716,1168],{"class":79},[62,1718,1719],{"class":64,"line":157},[62,1720,143],{"emptyLinePlaceholder":142},[62,1722,1723],{"class":64,"line":163},[62,1724,1725],{"class":68},"# Cherry-pick without committing\n",[62,1727,1728,1730,1732,1734],{"class":64,"line":168},[62,1729,76],{"class":75},[62,1731,1695],{"class":79},[62,1733,1186],{"class":83},[62,1735,1147],{"class":79},[15,1737,1738],{},[49,1739,1740],{},"Use case:",[53,1742,1744],{"className":55,"code":1743,"language":57,"meta":58,"style":58},"# You made a hotfix on main that's also needed on develop\ngit switch develop\ngit cherry-pick \u003Chotfix-commit-hash>\n",[22,1745,1746,1751,1760],{"__ignoreMap":58},[62,1747,1748],{"class":64,"line":65},[62,1749,1750],{"class":68},"# You made a hotfix on main that's also needed on develop\n",[62,1752,1753,1755,1757],{"class":64,"line":72},[62,1754,76],{"class":75},[62,1756,419],{"class":79},[62,1758,1759],{"class":79}," develop\n",[62,1761,1762,1764,1766,1770,1773,1777],{"class":64,"line":90},[62,1763,76],{"class":75},[62,1765,1695],{"class":79},[62,1767,1769],{"class":1768},"so5gQ"," \u003C",[62,1771,1772],{"class":79},"hotfix-commit-has",[62,1774,1776],{"class":1775},"slsVL","h",[62,1778,1779],{"class":1768},">\n",[10,1781,1783],{"id":1782},"level-6-investigating-history","Level 6: Investigating History",[42,1785,1787],{"id":1786},"git-log-more-than-you-think","Git Log: More Than You Think",[53,1789,1791],{"className":55,"code":1790,"language":57,"meta":58,"style":58},"# Basic log\ngit log\n\n# One line per commit\ngit log --oneline\n\n# Last 5 commits\ngit log -5\n\n# Show commits with diffs\ngit log -p\n\n# Graph view (amazing for branches)\ngit log --graph --oneline --all\n\n# Commits by specific author\ngit log --author=\"Your Name\"\n\n# Commits in date range\ngit log --since=\"2 weeks ago\"\n\n# Search commit messages\ngit log --grep=\"login\"\n\n# See what changed in a file\ngit log -p path/to/file.ts\n",[22,1792,1793,1798,1805,1809,1814,1823,1827,1832,1841,1845,1850,1859,1863,1868,1883,1887,1892,1904,1908,1913,1925,1929,1934,1946,1951,1957],{"__ignoreMap":58},[62,1794,1795],{"class":64,"line":65},[62,1796,1797],{"class":68},"# Basic log\n",[62,1799,1800,1802],{"class":64,"line":72},[62,1801,76],{"class":75},[62,1803,1804],{"class":79}," log\n",[62,1806,1807],{"class":64,"line":90},[62,1808,143],{"emptyLinePlaceholder":142},[62,1810,1811],{"class":64,"line":102},[62,1812,1813],{"class":68},"# One line per commit\n",[62,1815,1816,1818,1820],{"class":64,"line":151},[62,1817,76],{"class":75},[62,1819,680],{"class":79},[62,1821,1822],{"class":83}," --oneline\n",[62,1824,1825],{"class":64,"line":157},[62,1826,143],{"emptyLinePlaceholder":142},[62,1828,1829],{"class":64,"line":163},[62,1830,1831],{"class":68},"# Last 5 commits\n",[62,1833,1834,1836,1838],{"class":64,"line":168},[62,1835,76],{"class":75},[62,1837,680],{"class":79},[62,1839,1840],{"class":83}," -5\n",[62,1842,1843],{"class":64,"line":174},[62,1844,143],{"emptyLinePlaceholder":142},[62,1846,1847],{"class":64,"line":186},[62,1848,1849],{"class":68},"# Show commits with diffs\n",[62,1851,1852,1854,1856],{"class":64,"line":198},[62,1853,76],{"class":75},[62,1855,680],{"class":79},[62,1857,1858],{"class":83}," -p\n",[62,1860,1861],{"class":64,"line":210},[62,1862,143],{"emptyLinePlaceholder":142},[62,1864,1865],{"class":64,"line":318},[62,1866,1867],{"class":68},"# Graph view (amazing for branches)\n",[62,1869,1870,1872,1874,1877,1880],{"class":64,"line":324},[62,1871,76],{"class":75},[62,1873,680],{"class":79},[62,1875,1876],{"class":83}," --graph",[62,1878,1879],{"class":83}," --oneline",[62,1881,1882],{"class":83}," --all\n",[62,1884,1885],{"class":64,"line":550},[62,1886,143],{"emptyLinePlaceholder":142},[62,1888,1889],{"class":64,"line":555},[62,1890,1891],{"class":68},"# Commits by specific author\n",[62,1893,1894,1896,1898,1901],{"class":64,"line":561},[62,1895,76],{"class":75},[62,1897,680],{"class":79},[62,1899,1900],{"class":83}," --author=",[62,1902,1903],{"class":79},"\"Your Name\"\n",[62,1905,1906],{"class":64,"line":1344},[62,1907,143],{"emptyLinePlaceholder":142},[62,1909,1910],{"class":64,"line":1349},[62,1911,1912],{"class":68},"# Commits in date range\n",[62,1914,1915,1917,1919,1922],{"class":64,"line":1355},[62,1916,76],{"class":75},[62,1918,680],{"class":79},[62,1920,1921],{"class":83}," --since=",[62,1923,1924],{"class":79},"\"2 weeks ago\"\n",[62,1926,1927],{"class":64,"line":1372},[62,1928,143],{"emptyLinePlaceholder":142},[62,1930,1931],{"class":64,"line":1377},[62,1932,1933],{"class":68},"# Search commit messages\n",[62,1935,1936,1938,1940,1943],{"class":64,"line":1383},[62,1937,76],{"class":75},[62,1939,680],{"class":79},[62,1941,1942],{"class":83}," --grep=",[62,1944,1945],{"class":79},"\"login\"\n",[62,1947,1949],{"class":64,"line":1948},24,[62,1950,143],{"emptyLinePlaceholder":142},[62,1952,1954],{"class":64,"line":1953},25,[62,1955,1956],{"class":68},"# See what changed in a file\n",[62,1958,1960,1962,1964,1967],{"class":64,"line":1959},26,[62,1961,76],{"class":75},[62,1963,680],{"class":79},[62,1965,1966],{"class":83}," -p",[62,1968,331],{"class":79},[15,1970,1971],{},[49,1972,1973],{},"My favorite alias:",[53,1975,1977],{"className":55,"code":1976,"language":57,"meta":58,"style":58},"# Add to ~/.gitconfig\n[alias]\n    lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)\u003C%an>%Creset' --abbrev-commit\n\n# Then use: git lg\n",[22,1978,1979,1984,1989,2010,2014],{"__ignoreMap":58},[62,1980,1981],{"class":64,"line":65},[62,1982,1983],{"class":68},"# Add to ~/.gitconfig\n",[62,1985,1986],{"class":64,"line":72},[62,1987,1988],{"class":1775},"[alias]\n",[62,1990,1991,1994,1997,1999,2001,2004,2007],{"class":64,"line":90},[62,1992,1993],{"class":75},"    lg",[62,1995,1996],{"class":79}," =",[62,1998,680],{"class":79},[62,2000,1876],{"class":83},[62,2002,2003],{"class":83}," --pretty=format:",[62,2005,2006],{"class":79},"'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)\u003C%an>%Creset'",[62,2008,2009],{"class":83}," --abbrev-commit\n",[62,2011,2012],{"class":64,"line":102},[62,2013,143],{"emptyLinePlaceholder":142},[62,2015,2016],{"class":64,"line":151},[62,2017,2018],{"class":68},"# Then use: git lg\n",[42,2020,2022],{"id":2021},"git-blame-find-who-changed-what","Git Blame: Find Who Changed What",[53,2024,2026],{"className":55,"code":2025,"language":57,"meta":58,"style":58},"# See who modified each line\ngit blame file.ts\n\n# Blame for specific lines\ngit blame -L 10,20 file.ts\n\n# Ignore whitespace changes\ngit blame -w file.ts\n",[22,2027,2028,2033,2042,2046,2051,2065,2069,2074],{"__ignoreMap":58},[62,2029,2030],{"class":64,"line":65},[62,2031,2032],{"class":68},"# See who modified each line\n",[62,2034,2035,2037,2040],{"class":64,"line":72},[62,2036,76],{"class":75},[62,2038,2039],{"class":79}," blame",[62,2041,862],{"class":79},[62,2043,2044],{"class":64,"line":90},[62,2045,143],{"emptyLinePlaceholder":142},[62,2047,2048],{"class":64,"line":102},[62,2049,2050],{"class":68},"# Blame for specific lines\n",[62,2052,2053,2055,2057,2060,2063],{"class":64,"line":151},[62,2054,76],{"class":75},[62,2056,2039],{"class":79},[62,2058,2059],{"class":83}," -L",[62,2061,2062],{"class":79}," 10,20",[62,2064,862],{"class":79},[62,2066,2067],{"class":64,"line":157},[62,2068,143],{"emptyLinePlaceholder":142},[62,2070,2071],{"class":64,"line":163},[62,2072,2073],{"class":68},"# Ignore whitespace changes\n",[62,2075,2076,2078,2080,2083],{"class":64,"line":168},[62,2077,76],{"class":75},[62,2079,2039],{"class":79},[62,2081,2082],{"class":83}," -w",[62,2084,862],{"class":79},[42,2086,2088],{"id":2087},"git-show-inspect-commits","Git Show: Inspect Commits",[53,2090,2092],{"className":55,"code":2091,"language":57,"meta":58,"style":58},"# Show commit details\ngit show abc123\n\n# Show changes in a commit\ngit show abc123 --stat\n\n# Show specific file from a commit\ngit show abc123:path/to/file.ts\n",[22,2093,2094,2099,2108,2112,2117,2128,2132,2137],{"__ignoreMap":58},[62,2095,2096],{"class":64,"line":65},[62,2097,2098],{"class":68},"# Show commit details\n",[62,2100,2101,2103,2106],{"class":64,"line":72},[62,2102,76],{"class":75},[62,2104,2105],{"class":79}," show",[62,2107,1147],{"class":79},[62,2109,2110],{"class":64,"line":90},[62,2111,143],{"emptyLinePlaceholder":142},[62,2113,2114],{"class":64,"line":102},[62,2115,2116],{"class":68},"# Show changes in a commit\n",[62,2118,2119,2121,2123,2125],{"class":64,"line":151},[62,2120,76],{"class":75},[62,2122,2105],{"class":79},[62,2124,1165],{"class":79},[62,2126,2127],{"class":83}," --stat\n",[62,2129,2130],{"class":64,"line":157},[62,2131,143],{"emptyLinePlaceholder":142},[62,2133,2134],{"class":64,"line":163},[62,2135,2136],{"class":68},"# Show specific file from a commit\n",[62,2138,2139,2141,2143],{"class":64,"line":168},[62,2140,76],{"class":75},[62,2142,2105],{"class":79},[62,2144,2145],{"class":79}," abc123:path/to/file.ts\n",[10,2147,2149],{"id":2148},"my-essential-git-aliases","My Essential Git Aliases",[15,2151,2152,2153,2156],{},"Add these to ",[22,2154,2155],{},"~/.gitconfig",":",[53,2158,2160],{"className":55,"code":2159,"language":57,"meta":58,"style":58},"[alias]\n    # Short status\n    s = status -s\n    \n    # Add all and commit\n    ac = !git add -A && git commit\n    \n    # Commit with message\n    cm = commit -m\n    \n    # Amend last commit\n    amend = commit --amend --no-edit\n    \n    # Pretty log\n    lg = log --graph --oneline --decorate --all\n    \n    # Undo last commit\n    undo = reset HEAD~1 --mixed\n    \n    # List branches sorted by last modified\n    br = branch --sort=-committerdate\n    \n    # Show current branch\n    current = branch --show-current\n",[22,2161,2162,2166,2171,2184,2189,2194,2217,2221,2226,2238,2242,2247,2262,2266,2271,2288,2292,2297,2312,2316,2321,2333,2337,2342],{"__ignoreMap":58},[62,2163,2164],{"class":64,"line":65},[62,2165,1988],{"class":1775},[62,2167,2168],{"class":64,"line":72},[62,2169,2170],{"class":68},"    # Short status\n",[62,2172,2173,2176,2178,2181],{"class":64,"line":90},[62,2174,2175],{"class":75},"    s",[62,2177,1996],{"class":79},[62,2179,2180],{"class":79}," status",[62,2182,2183],{"class":83}," -s\n",[62,2185,2186],{"class":64,"line":102},[62,2187,2188],{"class":1775},"    \n",[62,2190,2191],{"class":64,"line":151},[62,2192,2193],{"class":68},"    # Add all and commit\n",[62,2195,2196,2199,2201,2204,2206,2209,2212,2214],{"class":64,"line":157},[62,2197,2198],{"class":75},"    ac",[62,2200,1996],{"class":79},[62,2202,2203],{"class":79}," !git",[62,2205,1605],{"class":79},[62,2207,2208],{"class":83}," -A",[62,2210,2211],{"class":1775}," && ",[62,2213,76],{"class":75},[62,2215,2216],{"class":79}," commit\n",[62,2218,2219],{"class":64,"line":163},[62,2220,2188],{"class":1775},[62,2222,2223],{"class":64,"line":168},[62,2224,2225],{"class":68},"    # Commit with message\n",[62,2227,2228,2231,2233,2235],{"class":64,"line":174},[62,2229,2230],{"class":75},"    cm",[62,2232,1996],{"class":79},[62,2234,80],{"class":79},[62,2236,2237],{"class":83}," -m\n",[62,2239,2240],{"class":64,"line":186},[62,2241,2188],{"class":1775},[62,2243,2244],{"class":64,"line":198},[62,2245,2246],{"class":68},"    # Amend last commit\n",[62,2248,2249,2252,2254,2256,2259],{"class":64,"line":210},[62,2250,2251],{"class":75},"    amend",[62,2253,1996],{"class":79},[62,2255,80],{"class":79},[62,2257,2258],{"class":83}," --amend",[62,2260,2261],{"class":83}," --no-edit\n",[62,2263,2264],{"class":64,"line":318},[62,2265,2188],{"class":1775},[62,2267,2268],{"class":64,"line":324},[62,2269,2270],{"class":68},"    # Pretty log\n",[62,2272,2273,2275,2277,2279,2281,2283,2286],{"class":64,"line":550},[62,2274,1993],{"class":75},[62,2276,1996],{"class":79},[62,2278,680],{"class":79},[62,2280,1876],{"class":83},[62,2282,1879],{"class":83},[62,2284,2285],{"class":83}," --decorate",[62,2287,1882],{"class":83},[62,2289,2290],{"class":64,"line":555},[62,2291,2188],{"class":1775},[62,2293,2294],{"class":64,"line":561},[62,2295,2296],{"class":68},"    # Undo last commit\n",[62,2298,2299,2302,2304,2306,2309],{"class":64,"line":1344},[62,2300,2301],{"class":75},"    undo",[62,2303,1996],{"class":79},[62,2305,897],{"class":79},[62,2307,2308],{"class":79}," HEAD~1",[62,2310,2311],{"class":83}," --mixed\n",[62,2313,2314],{"class":64,"line":1349},[62,2315,2188],{"class":1775},[62,2317,2318],{"class":64,"line":1355},[62,2319,2320],{"class":68},"    # List branches sorted by last modified\n",[62,2322,2323,2326,2328,2330],{"class":64,"line":1372},[62,2324,2325],{"class":75},"    br",[62,2327,1996],{"class":79},[62,2329,371],{"class":79},[62,2331,2332],{"class":83}," --sort=-committerdate\n",[62,2334,2335],{"class":64,"line":1377},[62,2336,2188],{"class":1775},[62,2338,2339],{"class":64,"line":1383},[62,2340,2341],{"class":68},"    # Show current branch\n",[62,2343,2344,2347,2349,2351],{"class":64,"line":1948},[62,2345,2346],{"class":75},"    current",[62,2348,1996],{"class":79},[62,2350,371],{"class":79},[62,2352,2353],{"class":83}," --show-current\n",[10,2355,2357],{"id":2356},"the-commands-that-saved-my-project","The Commands That Saved My Project",[15,2359,2360],{},[49,2361,2362],{},"Scenario 1: Accidentally committed sensitive data",[53,2364,2366],{"className":55,"code":2365,"language":57,"meta":58,"style":58},"# Remove file from last commit\ngit rm --cached .env\ngit commit --amend --no-edit\n\n# If already pushed (⚠️ rewrites history)\ngit push --force-with-lease\n",[22,2367,2368,2373,2386,2396,2400,2405],{"__ignoreMap":58},[62,2369,2370],{"class":64,"line":65},[62,2371,2372],{"class":68},"# Remove file from last commit\n",[62,2374,2375,2377,2380,2383],{"class":64,"line":72},[62,2376,76],{"class":75},[62,2378,2379],{"class":79}," rm",[62,2381,2382],{"class":83}," --cached",[62,2384,2385],{"class":79}," .env\n",[62,2387,2388,2390,2392,2394],{"class":64,"line":90},[62,2389,76],{"class":75},[62,2391,80],{"class":79},[62,2393,2258],{"class":83},[62,2395,2261],{"class":83},[62,2397,2398],{"class":64,"line":102},[62,2399,143],{"emptyLinePlaceholder":142},[62,2401,2402],{"class":64,"line":151},[62,2403,2404],{"class":68},"# If already pushed (⚠️ rewrites history)\n",[62,2406,2407,2409,2411],{"class":64,"line":157},[62,2408,76],{"class":75},[62,2410,539],{"class":79},[62,2412,813],{"class":83},[15,2414,2415],{},[49,2416,2417],{},"Scenario 2: Need to find when a bug was introduced",[53,2419,2421],{"className":55,"code":2420,"language":57,"meta":58,"style":58},"# Binary search through commits\ngit bisect start\ngit bisect bad                 # Current commit is bad\ngit bisect good abc123         # This commit was good\n# Git checks out middle commit, test it\ngit bisect bad                 # or git bisect good\n# Repeat until found\ngit bisect reset\n",[22,2422,2423,2428,2438,2450,2464,2469,2480,2485],{"__ignoreMap":58},[62,2424,2425],{"class":64,"line":65},[62,2426,2427],{"class":68},"# Binary search through commits\n",[62,2429,2430,2432,2435],{"class":64,"line":72},[62,2431,76],{"class":75},[62,2433,2434],{"class":79}," bisect",[62,2436,2437],{"class":79}," start\n",[62,2439,2440,2442,2444,2447],{"class":64,"line":90},[62,2441,76],{"class":75},[62,2443,2434],{"class":79},[62,2445,2446],{"class":79}," bad",[62,2448,2449],{"class":68},"                 # Current commit is bad\n",[62,2451,2452,2454,2456,2459,2461],{"class":64,"line":102},[62,2453,76],{"class":75},[62,2455,2434],{"class":79},[62,2457,2458],{"class":79}," good",[62,2460,1165],{"class":79},[62,2462,2463],{"class":68},"         # This commit was good\n",[62,2465,2466],{"class":64,"line":151},[62,2467,2468],{"class":68},"# Git checks out middle commit, test it\n",[62,2470,2471,2473,2475,2477],{"class":64,"line":157},[62,2472,76],{"class":75},[62,2474,2434],{"class":79},[62,2476,2446],{"class":79},[62,2478,2479],{"class":68},"                 # or git bisect good\n",[62,2481,2482],{"class":64,"line":163},[62,2483,2484],{"class":68},"# Repeat until found\n",[62,2486,2487,2489,2491],{"class":64,"line":168},[62,2488,76],{"class":75},[62,2490,2434],{"class":79},[62,2492,2493],{"class":79}," reset\n",[15,2495,2496],{},[49,2497,2498],{},"Scenario 3: Lost commit after hard reset",[53,2500,2502],{"className":55,"code":2501,"language":57,"meta":58,"style":58},"# View all reference changes\ngit reflog\n\n# Find your lost commit\ngit reflog show HEAD\n\n# Restore it\ngit cherry-pick abc123\n",[22,2503,2504,2509,2516,2520,2525,2537,2541,2546],{"__ignoreMap":58},[62,2505,2506],{"class":64,"line":65},[62,2507,2508],{"class":68},"# View all reference changes\n",[62,2510,2511,2513],{"class":64,"line":72},[62,2512,76],{"class":75},[62,2514,2515],{"class":79}," reflog\n",[62,2517,2518],{"class":64,"line":90},[62,2519,143],{"emptyLinePlaceholder":142},[62,2521,2522],{"class":64,"line":102},[62,2523,2524],{"class":68},"# Find your lost commit\n",[62,2526,2527,2529,2532,2534],{"class":64,"line":151},[62,2528,76],{"class":75},[62,2530,2531],{"class":79}," reflog",[62,2533,2105],{"class":79},[62,2535,2536],{"class":79}," HEAD\n",[62,2538,2539],{"class":64,"line":157},[62,2540,143],{"emptyLinePlaceholder":142},[62,2542,2543],{"class":64,"line":163},[62,2544,2545],{"class":68},"# Restore it\n",[62,2547,2548,2550,2552],{"class":64,"line":168},[62,2549,76],{"class":75},[62,2551,1695],{"class":79},[62,2553,1147],{"class":79},[10,2555,2557],{"id":2556},"best-practices-i-live-by","Best Practices I Live By",[2559,2560,2561,2567,2577,2583,2589,2595],"ol",{},[735,2562,2563,2566],{},[49,2564,2565],{},"Commit often, push daily"," - Small commits are easier to review and revert",[735,2568,2569,2572,2573,2576],{},[49,2570,2571],{},"Never force push to shared branches"," - Use ",[22,2574,2575],{},"--force-with-lease"," if you must",[735,2578,2579,2582],{},[49,2580,2581],{},"Write meaningful commit messages"," - Your future self will thank you",[735,2584,2585,2588],{},[49,2586,2587],{},"Keep main/develop protected"," - Always use feature branches",[735,2590,2591,2594],{},[49,2592,2593],{},"Pull before you push"," - Avoid conflicts",[735,2596,2597,2572,2600],{},[49,2598,2599],{},"Review before you commit",[22,2601,2602],{},"git diff --staged",[10,2604,2606],{"id":2605},"conclusion","Conclusion",[15,2608,2609],{},"Git is more than just version control—it's a time machine, a collaboration tool, and a safety net. Master these commands, and you'll spend less time fighting Git and more time building amazing things.",[15,2611,2612],{},[49,2613,2614],{},"Start with the basics, practice regularly, and gradually add more commands to your toolkit.",[15,2616,2617],{},"The difference between a junior and senior developer isn't knowing every Git command—it's knowing which command to use when, and having the confidence to use it.",[15,2619,2620],{},"Happy coding! 🚀",[42,2622,2624],{"id":2623},"quick-reference-card","Quick Reference Card",[53,2626,2628],{"className":55,"code":2627,"language":57,"meta":58,"style":58},"# Daily workflow\ngit status                     # Check status\ngit add .                      # Stage all changes\ngit commit -m \"message\"        # Commit\ngit push                       # Push to remote\n\n# Branching\ngit switch -c feature-name     # Create new branch\ngit switch main                # Switch branch\ngit branch -d feature-name     # Delete branch\n\n# Syncing\ngit pull                       # Update current branch\ngit fetch                      # Download updates\n\n# Fixing mistakes\ngit restore file.ts            # Discard changes\ngit reset HEAD~1               # Undo last commit\ngit stash                      # Save work for later\n\n# History\ngit log --oneline              # View commits\ngit diff                       # See changes\n",[22,2629,2630,2635,2644,2656,2670,2679,2683,2688,2702,2714,2727,2731,2736,2745,2754,2758,2763,2775,2786,2795,2799,2804,2815],{"__ignoreMap":58},[62,2631,2632],{"class":64,"line":65},[62,2633,2634],{"class":68},"# Daily workflow\n",[62,2636,2637,2639,2641],{"class":64,"line":72},[62,2638,76],{"class":75},[62,2640,2180],{"class":79},[62,2642,2643],{"class":68},"                     # Check status\n",[62,2645,2646,2648,2650,2653],{"class":64,"line":90},[62,2647,76],{"class":75},[62,2649,1605],{"class":79},[62,2651,2652],{"class":79}," .",[62,2654,2655],{"class":68},"                      # Stage all changes\n",[62,2657,2658,2660,2662,2664,2667],{"class":64,"line":102},[62,2659,76],{"class":75},[62,2661,80],{"class":79},[62,2663,84],{"class":83},[62,2665,2666],{"class":79}," \"message\"",[62,2668,2669],{"class":68},"        # Commit\n",[62,2671,2672,2674,2676],{"class":64,"line":151},[62,2673,76],{"class":75},[62,2675,539],{"class":79},[62,2677,2678],{"class":68},"                       # Push to remote\n",[62,2680,2681],{"class":64,"line":157},[62,2682,143],{"emptyLinePlaceholder":142},[62,2684,2685],{"class":64,"line":163},[62,2686,2687],{"class":68},"# Branching\n",[62,2689,2690,2692,2694,2696,2699],{"class":64,"line":168},[62,2691,76],{"class":75},[62,2693,419],{"class":79},[62,2695,422],{"class":83},[62,2697,2698],{"class":79}," feature-name",[62,2700,2701],{"class":68},"     # Create new branch\n",[62,2703,2704,2706,2708,2711],{"class":64,"line":174},[62,2705,76],{"class":75},[62,2707,419],{"class":79},[62,2709,2710],{"class":79}," main",[62,2712,2713],{"class":68},"                # Switch branch\n",[62,2715,2716,2718,2720,2722,2724],{"class":64,"line":186},[62,2717,76],{"class":75},[62,2719,371],{"class":79},[62,2721,501],{"class":83},[62,2723,2698],{"class":79},[62,2725,2726],{"class":68},"     # Delete branch\n",[62,2728,2729],{"class":64,"line":198},[62,2730,143],{"emptyLinePlaceholder":142},[62,2732,2733],{"class":64,"line":210},[62,2734,2735],{"class":68},"# Syncing\n",[62,2737,2738,2740,2742],{"class":64,"line":318},[62,2739,76],{"class":75},[62,2741,699],{"class":79},[62,2743,2744],{"class":68},"                       # Update current branch\n",[62,2746,2747,2749,2751],{"class":64,"line":324},[62,2748,76],{"class":75},[62,2750,661],{"class":79},[62,2752,2753],{"class":68},"                      # Download updates\n",[62,2755,2756],{"class":64,"line":550},[62,2757,143],{"emptyLinePlaceholder":142},[62,2759,2760],{"class":64,"line":555},[62,2761,2762],{"class":68},"# Fixing mistakes\n",[62,2764,2765,2767,2769,2772],{"class":64,"line":561},[62,2766,76],{"class":75},[62,2768,856],{"class":79},[62,2770,2771],{"class":79}," file.ts",[62,2773,2774],{"class":68},"            # Discard changes\n",[62,2776,2777,2779,2781,2783],{"class":64,"line":1344},[62,2778,76],{"class":75},[62,2780,897],{"class":79},[62,2782,2308],{"class":79},[62,2784,2785],{"class":68},"               # Undo last commit\n",[62,2787,2788,2790,2792],{"class":64,"line":1349},[62,2789,76],{"class":75},[62,2791,1254],{"class":79},[62,2793,2794],{"class":68},"                      # Save work for later\n",[62,2796,2797],{"class":64,"line":1355},[62,2798,143],{"emptyLinePlaceholder":142},[62,2800,2801],{"class":64,"line":1372},[62,2802,2803],{"class":68},"# History\n",[62,2805,2806,2808,2810,2812],{"class":64,"line":1377},[62,2807,76],{"class":75},[62,2809,680],{"class":79},[62,2811,1879],{"class":83},[62,2813,2814],{"class":68},"              # View commits\n",[62,2816,2817,2819,2821],{"class":64,"line":1383},[62,2818,76],{"class":75},[62,2820,290],{"class":79},[62,2822,2823],{"class":68},"                       # See changes\n",[2825,2826,2827],"style",{},"html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .slsVL, html code.shiki .slsVL{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}",{"title":58,"searchDepth":72,"depth":72,"links":2829},[2830,2831,2835,2839,2843,2849,2854,2859,2860,2861,2862],{"id":12,"depth":72,"text":13},{"id":39,"depth":72,"text":40,"children":2832},[2833,2834],{"id":44,"depth":90,"text":45},{"id":235,"depth":90,"text":236},{"id":344,"depth":72,"text":345,"children":2836},[2837,2838],{"id":348,"depth":90,"text":349},{"id":445,"depth":90,"text":446},{"id":639,"depth":72,"text":640,"children":2840},[2841,2842],{"id":643,"depth":90,"text":644},{"id":755,"depth":90,"text":756},{"id":834,"depth":72,"text":835,"children":2844},[2845,2846,2847,2848],{"id":838,"depth":90,"text":839},{"id":905,"depth":90,"text":906},{"id":964,"depth":90,"text":965},{"id":1126,"depth":90,"text":1127},{"id":1210,"depth":72,"text":1211,"children":2850},[2851,2852,2853],{"id":1214,"depth":90,"text":1215},{"id":1495,"depth":90,"text":1496},{"id":1677,"depth":90,"text":1678},{"id":1782,"depth":72,"text":1783,"children":2855},[2856,2857,2858],{"id":1786,"depth":90,"text":1787},{"id":2021,"depth":90,"text":2022},{"id":2087,"depth":90,"text":2088},{"id":2148,"depth":72,"text":2149},{"id":2356,"depth":72,"text":2357},{"id":2556,"depth":72,"text":2557},{"id":2605,"depth":72,"text":2606,"children":2863},[2864],{"id":2623,"depth":90,"text":2624},"23/09/2025","Wychodzę poza podstawowe git add i git commit. Oto istotne komendy Git i workflowy, które sprawią, że będziesz bardziej pewny i efektywny developer.","md",null,"/articles/simplicity-is-the-ultimate-sophistication.jpg",{},"/pl/articles/git-commands-every-junior-developer-should-master","9",{"title":5,"description":2866},{"loc":2871},"pl/articles/git-commands-every-junior-developer-should-master",[2877,2878,2879,2880],"Git","Version Control","Workflow","Best Practices","1X7HgiH4bN9PeFnobYpSSy37MGxUAP8eBEXCkj_DfdY",{"id":2883,"extension":2884,"items":2885,"meta":2950,"stem":2971,"__hash__":2972},"stack/stack.json","json",[2886,2890,2894,2898,2902,2906,2910,2914,2918,2922,2926,2930,2934,2938,2942,2946],{"name":2887,"link":2888,"icon":2889},"Nuxt","https://nuxt.com/","custom:nuxt",{"name":2891,"link":2892,"icon":2893},"Vue","https://vuejs.org/","custom:vue",{"name":2895,"link":2896,"icon":2897},"TypeScript","https://www.typescriptlang.org/","custom:typescript",{"name":2899,"link":2900,"icon":2901},"Node.js","https://nodejs.org/","custom:node-js",{"name":2903,"link":2904,"icon":2905},"React/React Native","https://react.dev/","custom:reactjs",{"name":2907,"link":2908,"icon":2909},"TailwindCSS","https://tailwindcss.com/","custom:tailwind",{"name":2911,"link":2912,"icon":2913},"Supabase","https://www.prisma.io/","custom:supabase",{"name":2915,"link":2916,"icon":2917},"Postgre","https://www.postgresql.org/","custom:pgsql",{"name":2919,"link":2920,"icon":2921},"Rust","https://www.rust-lang.org/","custom:rust",{"name":2923,"link":2924,"icon":2925},"Python","https://www.python.org/","custom:python",{"name":2927,"link":2928,"icon":2929},"Lua","https://www.lua.org/","custom:lua",{"name":2931,"link":2932,"icon":2933},"C++","https://isocpp.org/","custom:cpp",{"name":2935,"link":2936,"icon":2937},"Golang","https://go.dev/","custom:go",{"name":2939,"link":2940,"icon":2941},"Figma","https://www.figma.com/","custom:figma",{"name":2943,"link":2944,"icon":2945},"Photoshop","https://www.adobe.com/products/photoshop.html","custom:photoshop",{"name":2947,"link":2948,"icon":2949},"Illustrator","https://www.adobe.com/products/illustrator.html","custom:illustrator",{"path":2951,"body":2952,"title":2970},"/stack",{"items":2953},[2954,2955,2956,2957,2958,2959,2960,2961,2962,2963,2964,2965,2966,2967,2968,2969],{"name":2887,"link":2888,"icon":2889},{"name":2891,"link":2892,"icon":2893},{"name":2895,"link":2896,"icon":2897},{"name":2899,"link":2900,"icon":2901},{"name":2903,"link":2904,"icon":2905},{"name":2907,"link":2908,"icon":2909},{"name":2911,"link":2912,"icon":2913},{"name":2915,"link":2916,"icon":2917},{"name":2919,"link":2920,"icon":2921},{"name":2923,"link":2924,"icon":2925},{"name":2927,"link":2928,"icon":2929},{"name":2931,"link":2932,"icon":2933},{"name":2935,"link":2936,"icon":2937},{"name":2939,"link":2940,"icon":2941},{"name":2943,"link":2944,"icon":2945},{"name":2947,"link":2948,"icon":2949},"Stack","stack","aWyFpcVGYuaHymPCKadQyiY7s0WWw_rDYWJaXBNtvoc",{"id":2974,"title":2975,"extension":2884,"faqQuestions":2976,"meta":3019,"stem":3041,"subtitle":3022,"__hash__":3042},"faq_pl/pl/faq.json","FAQ",[2977,2989,3007],{"title":2978,"questions":2979},"O mnie i umiejętnościach",[2980,2983,2986],{"label":2981,"content":2982},"Jakie usługi oferujesz?","**Web Development**: Strony responsywne, landing page'i, aplikacje webowe, UI/UX | **Mobile**: Aplikacje mobilne (uczę się React Native) | **Game Dev**: Skrypty dla FiveM (Lua), Modelowanie 3D (budynki, pojazdy etc) | **Backend**: Node.js, API, bazy danych. Szukam projektów, które pomogą mi rosnąć, a klientowi dostarczę jakość.",{"label":2984,"content":2985},"Czym się zajmujesz?","**Frontend**: HTML, CSS, JavaScript, TypeScript, Vue.js, Nuxt.js, React, Tailwind | **Backend**: Node.js, Express.js, PostgreSQL, MongoDB | **DevOps**: Git, Docker, Linux, wdrażanie aplikacji. Ciągle się uczę i rozwijam swoje umiejętności.",{"label":2987,"content":2988},"Jesteś dostępny do pracy?","Tak! Szukam projektów freelance, staży i pracy pełnoetatowej. Interesują mnie projekty, które pozwolą mi się rozwijać i dostarczać wartość.",{"title":2990,"questions":2991},"Współpraca i ceny",[2992,2995,2998,3001,3004],{"label":2993,"content":2994},"Ile kosztuje?","Stawki są elastyczne - zazwyczaj €25-40 za godzinę dla pracy freelance. Dla większych projektów możemy ustalić cenę całościową lub pakietową.",{"label":2996,"content":2997},"Jak wygląda proces płatności?","Zazwyczaj proszę o 40% zaliczki na start, resztę 60% na koniec. Mogę zaakceptować przelew, PayPal albo inne metody. Dla dużych projektów - płatności etapowe po osiągnięciu milestones'ów.",{"label":2999,"content":3000},"Jak długo trwa projekt?","Zależy od skali. Prosta landing page: 1-2 tygodnie. Złożona aplikacja: 1-3 miesiące. Zawsze daję realny szacunek i informuję o postępach.",{"label":3002,"content":3003},"Jak pracujesz nad projektami?","Zaczynam od zrozumienia wymagań, potem rozbijam to na mniejsze zadania. Wierzę w jasną komunikację i czystym kod. Nie boję się pytać, gdy coś jest niejasne.",{"label":3005,"content":3006},"Pracujesz w zespołach?","Lubię! Pracowałem w zespołach, znam Git, code review, patrzę na kod innych. Staram się być łatwy do pracy i otwarty na feedback.",{"title":3008,"questions":3009},"Osobiste",[3010,3013,3016],{"label":3011,"content":3012},"Co Cię motywuje?","Rozwiązywanie problemów i widzenie, że coś moje działa w prawdziwym życiu. Każdy projekt to szansa, aby się nauczyć czegoś nowego. To satysfakcjonujące!",{"label":3014,"content":3015},"Jak się aktualizujesz?","Czytam blogi, uczestniczę w społecznościach developerów, robię side-projecty, biorę kursy. W tej branży musisz się ciągle uczyć - i lubię to.",{"label":3017,"content":3018},"Czego się uczysz teraz?","Pogłębiam TypeScript, zaawansowane wzorce Vue.js, optymalizację wydajności i accessibility. Chciałbym też więcej wiedzieć o backend'zie i DevOps'ie.",{"path":3020,"body":3021},"/pl/faq",{"title":2975,"subtitle":3022,"faqQuestions":3023},"Często zadawane pytania",[3024,3029,3036],{"title":2978,"questions":3025},[3026,3027,3028],{"label":2981,"content":2982},{"label":2984,"content":2985},{"label":2987,"content":2988},{"title":2990,"questions":3030},[3031,3032,3033,3034,3035],{"label":2993,"content":2994},{"label":2996,"content":2997},{"label":2999,"content":3000},{"label":3002,"content":3003},{"label":3005,"content":3006},{"title":3008,"questions":3037},[3038,3039,3040],{"label":3011,"content":3012},{"label":3014,"content":3015},{"label":3017,"content":3018},"pl/faq","TXjuRP2jHY72uT4DTozaL4U0aHHBGEzUGSD0KbL_qaU",1785840166654]