{"id":316,"date":"2026-07-07T07:25:04","date_gmt":"2026-07-06T23:25:04","guid":{"rendered":"https:\/\/numsimlab.com\/?p=316"},"modified":"2026-07-07T07:25:04","modified_gmt":"2026-07-06T23:25:04","slug":"git-%e5%ae%8c%e5%85%a8%e6%95%99%e7%a8%8b","status":"publish","type":"post","link":"https:\/\/numsimlab.com\/?p=316","title":{"rendered":"Git \u5b8c\u5168\u6559\u7a0b"},"content":{"rendered":"\n<!-- Generated by   -->\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Git \u5b8c\u5168\u6559\u7a0b \u00b7 Complete Git Guide<\/title>\n<style>\n*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}\nhtml{scroll-behavior:smooth}\n:root{\n  --bg:#f8f9fa;--bg2:#fff;--ink:#1a1a2e;--muted:#6c7086;--rule:#e2e4eb;\n  --accent:#2563eb;--accent2:#16a34a;--accent3:#dc2626;--accent4:#d97706;--accent5:#7c3aed;\n  --card-bg:#fff;--code-bg:#f1f3f5;\n  --tag-g:#dcfce7;--tag-g-t:#166534;--tag-b:#dbeafe;--tag-b-t:#1e40af;\n  --tag-r:#fee2e2;--tag-r-t:#991b1b;--tag-y:#fef9c3;--tag-y-t:#713f12;--tag-p:#f3e8ff;--tag-p-t:#581c87;\n  --shadow:0 1px 3px rgba(0,0,0,.08);--radius:8px;--max-w:940px\n}\n[data-theme=\"dark\"]{\n  --bg:#0b0b1a;--bg2:#16162a;--ink:#e2e4f0;--muted:#7f8396;--rule:#26263e;\n  --accent:#60a5fa;--accent2:#4ade80;--accent3:#f87171;--accent4:#fbbf24;--accent5:#a78bfa;\n  --card-bg:#16162a;--code-bg:#1e1e36;\n  --tag-g:#14532d;--tag-g-t:#bbf7d0;--tag-b:#1e3a5f;--tag-b-t:#bfdbfe;\n  --tag-r:#7f1d1d;--tag-r-t:#fecaca;--tag-y:#713f12;--tag-y-t:#fef08a;\n  --tag-p:#3b1f6e;--tag-p-t:#e9d5ff;--shadow:0 1px 3px rgba(0,0,0,.3)\n}\nbody{font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"Noto Sans SC\",\"PingFang SC\",\"Microsoft YaHei\",sans-serif;background:var(--bg);color:var(--ink);line-height:1.7;font-size:15px;transition:background .3s,color .3s}\nheader{position:fixed;top:0;left:0;right:0;z-index:100;background:var(--bg2);border-bottom:1px solid var(--rule);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);transition:background .3s}\n.header-inner{max-width:var(--max-w);margin:0 auto;display:flex;align-items:center;justify-content:space-between;padding:0 1.5rem;height:56px}\n.logo{font-weight:700;font-size:.95rem;color:var(--accent);display:flex;align-items:center;gap:.4rem}\n.controls{display:flex;align-items:center;gap:.5rem}\n.lang-switch{display:flex;border:1px solid var(--rule);border-radius:6px;overflow:hidden}\n.lang-switch button{background:0 0;border:none;color:var(--muted);padding:.3rem .7rem;font-size:.8rem;cursor:pointer;transition:all .2s;font-family:inherit}\n.lang-switch button.active{background:var(--accent);color:#fff}\n.lang-switch button:not(.active):hover{color:var(--ink);background:var(--rule)}\n.theme-toggle{background:0 0;border:1px solid var(--rule);border-radius:6px;color:var(--muted);width:34px;height:34px;font-size:1rem;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s}\n.theme-toggle:hover{color:var(--ink);background:var(--rule)}\nmain{max-width:var(--max-w);margin:0 auto;padding:80px 1.5rem 3rem}\n.lang-section{display:none}.lang-section.active{display:block}\nh1{font-size:1.9rem;font-weight:800;line-height:1.3;margin-bottom:.5rem;letter-spacing:-.02em}\nh1 .sub{display:block;font-size:.85rem;font-weight:400;color:var(--muted);margin-top:.25rem;letter-spacing:0}\nh2{font-size:1.35rem;font-weight:700;margin:2.5rem 0 1rem;padding-bottom:.5rem;border-bottom:2px solid var(--accent);letter-spacing:-.01em}\nh3{font-size:1.05rem;font-weight:600;margin:1.5rem 0 .6rem;color:var(--accent)}\nh4{font-size:.95rem;font-weight:600;margin:1rem 0 .4rem;color:var(--ink)}\np{margin-bottom:.8rem}\na{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}\n.hero{text-align:center;padding:2rem 0 1rem}\n.hero p{font-size:1rem;color:var(--muted);max-width:700px;margin:0 auto}\n.tag{display:inline-block;padding:.12rem .5rem;border-radius:4px;font-size:.72rem;font-weight:600;margin-right:.25rem;white-space:nowrap}\n.tag-g{background:var(--tag-g);color:var(--tag-g-t)}.tag-b{background:var(--tag-b);color:var(--tag-b-t)}\n.tag-r{background:var(--tag-r);color:var(--tag-r-t)}.tag-y{background:var(--tag-y);color:var(--tag-y-t)}\n.tag-p{background:var(--tag-p);color:var(--tag-p-t)}\n.card{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1.25rem;margin-bottom:1rem;box-shadow:var(--shadow)}\n.info-box{background:var(--bg);border-left:4px solid var(--accent);padding:.9rem 1.1rem;margin:1rem 0;border-radius:0 var(--radius) var(--radius) 0;font-size:.88rem}\n.info-box strong{color:var(--accent)}\n.info-box.warn{border-left-color:var(--accent4)}.info-box.warn strong{color:var(--accent4)}\n.info-box.danger{border-left-color:var(--accent3)}.info-box.danger strong{color:var(--accent3)}\n.toc{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1.15rem 1.4rem;margin-bottom:2rem;box-shadow:var(--shadow)}\n.toc h3{margin:0 0 .5rem;font-size:.9rem;color:var(--muted);text-transform:uppercase;letter-spacing:.05em}\n.toc ol{padding-left:1.1rem;columns:2;column-gap:2rem}\n.toc li{margin-bottom:.25rem;font-size:.88rem}.toc a{color:var(--ink)}.toc a:hover{color:var(--accent);text-decoration:none}\npre.code-block{background:var(--code-bg);padding:.85rem 1rem;border-radius:var(--radius);overflow-x:auto;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.82rem;line-height:1.5;margin:.6rem 0;border:1px solid var(--rule)}\ncode,.inline-code{background:var(--code-bg);padding:.12rem .4rem;border-radius:4px;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.83rem;border:1px solid var(--rule)}\n.table-wrap{overflow-x:auto;margin:1.2rem 0}\ntable{width:100%;border-collapse:collapse;font-size:.82rem}\nthead th{background:var(--accent);color:#fff;padding:.6rem .5rem;text-align:center;font-weight:600;white-space:nowrap}\nthead th:first-child{border-radius:6px 0 0 0}thead th:last-child{border-radius:0 6px 0 0}\ntbody td{padding:.55rem .5rem;border-bottom:1px solid var(--rule);text-align:center;vertical-align:middle}\ntbody tr:nth-child(even){background:var(--bg)}\ntbody td:first-child{text-align:left;font-weight:600}\n.terminal{background:#1a1a2e;color:#a8e6cf;border-radius:var(--radius);padding:.9rem 1rem;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.82rem;line-height:1.6;margin:.6rem 0;overflow-x:auto;border:1px solid #333}\n.terminal .prompt{color:#60a5fa}.terminal .comment{color:#6c7086;font-style:italic}.terminal .output{color:#e2e4f0}\n[data-theme=\"dark\"] .terminal{background:#08081a}\n.steps{counter-reset:step;list-style:none;padding:0}\n.steps li{counter-increment:step;position:relative;padding:.85rem 1rem .85rem 2.8rem;margin-bottom:.5rem;border-left:2px solid var(--rule);border-radius:0 var(--radius) var(--radius) 0;background:var(--card-bg);box-shadow:var(--shadow)}\n.steps li::before{content:counter(step);position:absolute;left:-13px;top:.85rem;width:26px;height:26px;border-radius:50%;background:var(--accent);color:#fff;display:flex;align-items:center;justify-content:center;font-size:.78rem;font-weight:700}\n.steps li .cmd{display:block;background:var(--code-bg);padding:.4rem .7rem;border-radius:5px;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.82rem;margin:.3rem 0;overflow-x:auto;border:1px solid var(--rule)}\n.steps li .note{display:block;color:var(--muted);font-size:.82rem;margin-top:.2rem}\n.flow-diagram{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1.25rem;margin:1.25rem 0;text-align:center}\n.flow-row{display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:.35rem;margin:.4rem 0}\n.flow-item{display:inline-block;padding:.4rem .8rem;border-radius:6px;font-weight:600;font-size:.82rem;text-align:center;background:var(--accent);color:#fff;min-width:60px}\n.flow-item.green{background:var(--accent2)}.flow-item.red{background:var(--accent3)}.flow-item.yellow{background:var(--accent4);color:#1a1a2e}.flow-item.purple{background:var(--accent5)}\n.flow-arrow{color:var(--muted);font-size:1rem}\n.cmd-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:.75rem;margin:1rem 0}\n.cmd-card{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:.9rem;box-shadow:var(--shadow)}\n.cmd-card h4{margin:0 0 .35rem;font-size:.88rem;color:var(--accent)}\n.cmd-card .cmd{font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.8rem;background:var(--code-bg);padding:.3rem .5rem;border-radius:4px;display:block;margin-bottom:.3rem;border:1px solid var(--rule)}\n.cmd-card .desc{font-size:.8rem;color:var(--muted)}\n.two-col{display:grid;grid-template-columns:1fr 1fr;gap:1.25rem;margin:1.25rem 0}\n.col{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1.25rem;box-shadow:var(--shadow)}\n.col h4{margin-top:0}\nfooter{max-width:var(--max-w);margin:3rem auto 0;padding:2rem 1.5rem 3rem;border-top:1px solid var(--rule);text-align:center;font-size:.82rem;color:var(--muted)}\nfooter .links{display:flex;justify-content:center;gap:1.5rem;flex-wrap:wrap;margin-bottom:.8rem}\nfooter .links a{color:var(--muted)}footer .links a:hover{color:var(--accent)}\n@media(max-width:640px){\n  h1{font-size:1.4rem}.toc ol{columns:1}.header-inner{padding:0 1rem}main{padding:72px 1rem 2rem}\n  .steps li{padding-left:2.4rem}.steps li::before{left:-11px;width:22px;height:22px;font-size:.7rem}\n  .two-col{grid-template-columns:1fr}.cmd-grid{grid-template-columns:1fr}\n}\n<\/style>\n<\/head>\n<body>\n\n<header>\n  <div class=\"header-inner\">\n    <div class=\"logo\"><span>\u2387<\/span> Complete Git Guide<\/div>\n    <div class=\"controls\">\n      <div class=\"lang-switch\">\n        <button class=\"active\" onclick=\"setLang('zh')\" id=\"btn-zh\">\u4e2d\u6587<\/button>\n        <button onclick=\"setLang('en')\" id=\"btn-en\">English<\/button>\n      <\/div>\n      <button class=\"theme-toggle\" onclick=\"toggleTheme()\" title=\"Toggle theme\">&#9788;<\/button>\n    <\/div>\n  <\/div>\n<\/header>\n\n<main>\n\n<!-- ==================== ZH ==================== -->\n<div class=\"lang-section active\" id=\"lang-zh\">\n<div class=\"hero\">\n  <h1>Git \u5b8c\u5168\u6559\u7a0b<\/h1>\n  <p>\u4ece\u96f6\u5f00\u59cb\u7406\u89e3 Git\uff1a\u5b83\u662f\u4ec0\u4e48\u3001\u4e3a\u4ec0\u4e48\u9700\u8981\u5b83\u3001\u6838\u5fc3\u6982\u5ff5\u3001\u5e38\u7528\u547d\u4ee4\u4e0e\u5b9e\u6218\u5de5\u4f5c\u6d41<\/p>\n<\/div>\n\n<div class=\"toc\">\n  <h3>\u76ee\u5f55<\/h3>\n  <ol>\n    <li><a href=\"#zh-what\">\u4ec0\u4e48\u662f Git<\/a><\/li>\n    <li><a href=\"#zh-why\">\u4e3a\u4ec0\u4e48\u9700\u8981 Git<\/a><\/li>\n    <li><a href=\"#zh-concepts\">\u6838\u5fc3\u6982\u5ff5<\/a><\/li>\n    <li><a href=\"#zh-install\">\u5b89\u88c5\u4e0e\u521d\u59cb\u914d\u7f6e<\/a><\/li>\n    <li><a href=\"#zh-basics\">\u57fa\u7840\u547d\u4ee4\uff1a\u521b\u5efa\u4e0e\u63d0\u4ea4<\/a><\/li>\n    <li><a href=\"#zh-branch\">\u5206\u652f\u7ba1\u7406<\/a><\/li>\n    <li><a href=\"#zh-remote\">\u8fdc\u7a0b\u4ed3\u5e93\u534f\u4f5c<\/a><\/li>\n    <li><a href=\"#zh-history\">\u67e5\u770b\u5386\u53f2\u4e0e\u56de\u9000<\/a><\/li>\n    <li><a href=\"#zh-stash\">\u6682\u5b58\u4e0e\u6e05\u7406<\/a><\/li>\n    <li><a href=\"#zh-merge\">\u5408\u5e76\u4e0e\u51b2\u7a81\u89e3\u51b3<\/a><\/li>\n    <li><a href=\"#zh-advanced\">\u9ad8\u7ea7\u6280\u5de7<\/a><\/li>\n    <li><a href=\"#zh-workflow\">\u63a8\u8350\u5de5\u4f5c\u6d41<\/a><\/li>\n  <\/ol>\n<\/div>\n\n<!-- Section 1 -->\n<h2 id=\"zh-what\">\u4e00\u3001\u4ec0\u4e48\u662f Git<\/h2>\n<p>Git \u662f\u4e00\u4e2a<strong>\u5206\u5e03\u5f0f\u7248\u672c\u63a7\u5236\u7cfb\u7edf<\/strong>\uff08Distributed Version Control System\uff09\uff0c\u7531 Linus Torvalds \u4e8e 2005 \u5e74\u521b\u5efa\uff0c\u6700\u521d\u7528\u4e8e\u7ba1\u7406 Linux \u5185\u6838\u7684\u6e90\u4ee3\u7801\u3002<\/p>\n\n<div class=\"card\">\n  <h4>\u5173\u952e\u7279\u6027<\/h4>\n  <p><strong>\u5206\u5e03\u5f0f\uff1a<\/strong>\u6bcf\u4e2a\u4eba\u7684\u672c\u5730\u7535\u8111\u90fd\u62e5\u6709\u5b8c\u6574\u7684\u4ed3\u5e93\u526f\u672c\uff08\u5305\u62ec\u6240\u6709\u5386\u53f2\u8bb0\u5f55\uff09\uff0c\u4e0d\u4f9d\u8d56\u4e2d\u592e\u670d\u52a1\u5668\u5373\u53ef\u5de5\u4f5c\u3002<\/p>\n  <p><strong>\u5feb\u7167\u5f0f\u5b58\u50a8\uff1a<\/strong>Git \u4e0d\u662f\u8bb0\u5f55\u6587\u4ef6\u7684\u5dee\u5f02\uff0c\u800c\u662f\u6bcf\u6b21\u63d0\u4ea4\u90fd\u4fdd\u5b58\u5b8c\u6574\u7684\u6587\u4ef6\u5feb\u7167\u3002\u672a\u53d8\u66f4\u7684\u6587\u4ef6\u4f1a\u4ee5\u6307\u9488\u5f15\u7528\u4e4b\u524d\u7684\u7248\u672c\uff0c\u65e2\u9ad8\u6548\u53c8\u53ef\u9760\u3002<\/p>\n  <p><strong>\u51e0\u4e4e\u6240\u6709\u7684\u64cd\u4f5c\u90fd\u5728\u672c\u5730\u6267\u884c\uff1a<\/strong>\u67e5\u770b\u65e5\u5fd7\u3001\u521b\u5efa\u5206\u652f\u3001\u63d0\u4ea4\u4ee3\u7801\u7b49\u64cd\u4f5c\u65e0\u9700\u7f51\u7edc\u8fde\u63a5\uff0c\u901f\u5ea6\u6781\u5feb\u3002<\/p>\n  <p><strong>\u6570\u636e\u5b8c\u6574\u6027\u4fdd\u969c\uff1a<\/strong>\u6bcf\u4e2a\u6587\u4ef6\u7684\u5185\u5bb9\u90fd\u901a\u8fc7 SHA-1 \u54c8\u5e0c\u503c\u6821\u9a8c\uff0c\u4efb\u4f55\u7be1\u6539\u90fd\u4f1a\u88ab\u7acb\u523b\u53d1\u73b0\u3002<\/p>\n<\/div>\n\n<div class=\"info-box\">\n  <strong>\u4e00\u53e5\u8bdd\u603b\u7ed3\uff1a<\/strong>Git \u5c31\u50cf\u4e00\u4e2a&#8221;\u65f6\u5149\u673a&#8221;\u2014\u2014\u5b83\u80fd\u8bb0\u5f55\u4ee3\u7801\u7684\u6bcf\u4e00\u6b21\u53d8\u66f4\u5386\u53f2\uff0c\u968f\u65f6\u56de\u5230\u8fc7\u53bb\u7684\u4efb\u610f\u7248\u672c\uff0c\u8fd8\u80fd\u8ba9\u591a\u4eba\u540c\u65f6\u5f00\u53d1\u540c\u4e00\u9879\u76ee\u800c\u4e0d\u4e92\u76f8\u51b2\u7a81\u3002\n<\/div>\n\n<!-- Section 2 -->\n<h2 id=\"zh-why\">\u4e8c\u3001\u4e3a\u4ec0\u4e48\u9700\u8981 Git<\/h2>\n\n<div class=\"card\">\n  <h4>\u6ca1\u6709 Git \u7684\u4e16\u754c<\/h4>\n  <p>\u5047\u8bbe\u6ca1\u6709\u7248\u672c\u63a7\u5236\uff0c\u5f00\u53d1\u8005\u901a\u5e38\u7684\u505a\u6cd5\u662f\u624b\u52a8\u590d\u5236\u6587\u4ef6\u5939\u5e76\u91cd\u547d\u540d\uff1a<code>project_v1<\/code>\u3001<code>project_v2<\/code>\u3001<code>project_final<\/code>\u3001<code>project_final_v2<\/code>\u2026\u2026 \u8fd9\u79cd\u65b9\u5f0f\u5b58\u5728\u4e25\u91cd\u95ee\u9898\uff1a<\/p>\n  <ul style=\"margin-left:1.2rem;margin-bottom:.5rem;\">\n    <li>\u65e0\u6cd5\u8ffd\u6eaf\u6bcf\u4e2a\u7248\u672c\u5177\u4f53\u6539\u4e86\u4ec0\u4e48<\/li>\n    <li>\u591a\u4eba\u534f\u4f5c\u65f6\u5bb9\u6613\u8986\u76d6\u5f7c\u6b64\u7684\u4ee3\u7801<\/li>\n    <li>\u8bef\u5220\u6587\u4ef6\u540e\u65e0\u6cd5\u6062\u590d<\/li>\n    <li>\u6587\u4ef6\u540d\u6df7\u4e71\u3001\u7248\u672c\u5173\u7cfb\u4e0d\u6e05\u6670<\/li>\n    <li>\u6d6a\u8d39\u5927\u91cf\u78c1\u76d8\u7a7a\u95f4\uff08\u6bcf\u6b21\u90fd\u662f\u5b8c\u6574\u590d\u5236\uff09<\/li>\n  <\/ul>\n<\/div>\n\n<div class=\"card\">\n  <h4>Git \u89e3\u51b3\u7684\u6838\u5fc3\u95ee\u9898<\/h4>\n  <div class=\"two-col\" style=\"margin-top:.5rem;\">\n    <div class=\"col\">\n      <h4><span class=\"tag tag-g\">\u7248\u672c\u8ffd\u8e2a<\/span><\/h4>\n      <p>\u5b8c\u6574\u8bb0\u5f55\u6bcf\u6b21\u6539\u52a8\u7684<strong>\u8c01\u3001\u4ec0\u4e48\u65f6\u95f4\u3001\u6539\u4e86\u4ec0\u4e48\u5185\u5bb9<\/strong>\uff0c\u968f\u65f6\u67e5\u770b\u5dee\u5f02\u5bf9\u6bd4\u3002<\/p>\n    <\/div>\n    <div class=\"col\">\n      <h4><span class=\"tag tag-b\">\u591a\u4eba\u534f\u4f5c<\/span><\/h4>\n      <p>\u5206\u652f\uff08Branch\uff09\u673a\u5236\u8ba9\u591a\u4eba\u53ef\u4ee5<strong>\u5e76\u884c\u5f00\u53d1<\/strong>\u4e0d\u540c\u529f\u80fd\uff0c\u6700\u7ec8\u5408\u5e76\u5230\u4e00\u8d77\u3002<\/p>\n    <\/div>\n    <div class=\"col\">\n      <h4><span class=\"tag tag-y\">\u968f\u65f6\u56de\u9000<\/span><\/h4>\n      <p>\u53d1\u73b0\u4e25\u91cd Bug \u53ef\u4ee5<strong>\u4e00\u952e\u56de\u9000<\/strong>\u5230\u4e4b\u524d\u7684\u7a33\u5b9a\u7248\u672c\uff0c\u4e0d\u7528\u62c5\u5fc3\u8bef\u64cd\u4f5c\u3002<\/p>\n    <\/div>\n    <div class=\"col\">\n      <h4><span class=\"tag tag-p\">\u4ee3\u7801\u5907\u4efd<\/span><\/h4>\n      <p>\u63a8\u9001\u5230\u8fdc\u7a0b\u4ed3\u5e93\uff08GitHub\/GitLab\uff09\u540e\uff0c\u5373\u4f7f\u672c\u5730\u7535\u8111\u635f\u574f\uff0c<strong>\u4ee3\u7801\u4e5f\u4e0d\u4f1a\u4e22\u5931<\/strong>\u3002<\/p>\n    <\/div>\n  <\/div>\n<\/div>\n\n<!-- Section 3 -->\n<h2 id=\"zh-concepts\">\u4e09\u3001\u6838\u5fc3\u6982\u5ff5<\/h2>\n\n<h3>3.1 Git \u7684\u56db\u4e2a\u533a\u57df<\/h3>\n<div class=\"flow-diagram\">\n  <div class=\"flow-row\">\n    <span class=\"flow-item\">\u5de5\u4f5c\u533a<br><small>Working Dir<\/small><\/span>\n    <span class=\"flow-arrow\">\u2192 <code>git add<\/code> \u2192<\/span>\n    <span class=\"flow-item yellow\">\u6682\u5b58\u533a<br><small>Staging Area<\/small><\/span>\n    <span class=\"flow-arrow\">\u2192 <code>git commit<\/code> \u2192<\/span>\n    <span class=\"flow-item green\">\u672c\u5730\u4ed3\u5e93<br><small>Local Repo<\/small><\/span>\n    <span class=\"flow-arrow\">\u2192 <code>git push<\/code> \u2192<\/span>\n    <span class=\"flow-item purple\">\u8fdc\u7a0b\u4ed3\u5e93<br><small>Remote Repo<\/small><\/span>\n  <\/div>\n<\/div>\n<div class=\"info-box\">\n  <strong>\u7406\u89e3\u8fd9\u56db\u4e2a\u533a\u57df\u662f\u638c\u63e1 Git \u7684\u5173\u952e\u3002<\/strong><br>\n  <strong>\u5de5\u4f5c\u533a<\/strong> = \u7535\u8111\u4e0a\u770b\u5230\u7684\u6587\u4ef6\uff1b<strong>\u6682\u5b58\u533a<\/strong> = \u51c6\u5907\u63d0\u4ea4\u7684\u6539\u52a8\u6e05\u5355\uff1b<strong>\u672c\u5730\u4ed3\u5e93<\/strong> = \u672c\u5730\u7684\u7248\u672c\u6570\u636e\u5e93\uff1b<strong>\u8fdc\u7a0b\u4ed3\u5e93<\/strong> = GitHub\/GitLab \u4e0a\u7684\u670d\u52a1\u5668\u7aef\u4ed3\u5e93\u3002\n<\/div>\n\n<h3>3.2 \u4ed3\u5e93\uff08Repository \/ Repo\uff09<\/h3>\n<p>\u4ed3\u5e93\u662f Git \u7ba1\u7406\u7684\u57fa\u672c\u5355\u5143\u3002\u4e00\u4e2a\u4ed3\u5e93\u5bf9\u5e94\u4e00\u4e2a\u9879\u76ee\uff0c\u5305\u542b\u8be5\u9879\u76ee\u7684\u6240\u6709\u6587\u4ef6\u3001\u7248\u672c\u5386\u53f2\u3001\u5206\u652f\u7b49\u4fe1\u606f\u3002\u901a\u8fc7 <code>git init<\/code> \u6216 <code>git clone<\/code> \u521b\u5efa\u3002<\/p>\n\n<h3>3.3 \u63d0\u4ea4\uff08Commit\uff09<\/h3>\n<p>\u63d0\u4ea4\u662f Git \u4e2d\u6700\u57fa\u672c\u7684\u64cd\u4f5c\u5355\u5143\u3002\u6bcf\u6b21 <code>git commit<\/code> \u90fd\u4f1a\u521b\u5efa\u4e00\u4e2a\u65b0\u7684<strong>\u5feb\u7167<\/strong>\uff08Snapshot\uff09\uff0c\u8bb0\u5f55\u5f53\u524d\u6682\u5b58\u533a\u4e2d\u6240\u6709\u6587\u4ef6\u7684\u72b6\u6001\u3002\u6bcf\u4e2a\u63d0\u4ea4\u6709\u552f\u4e00\u7684 SHA-1 \u54c8\u5e0c ID\uff08\u5982 <code>a1b2c3d<\/code>\uff09\u3002<\/p>\n\n<h3>3.4 \u5206\u652f\uff08Branch\uff09<\/h3>\n<p>\u5206\u652f\u662f\u4ee3\u7801\u7684<strong>\u72ec\u7acb\u53d1\u5c55\u7ebf<\/strong>\u3002\u9ed8\u8ba4\u5206\u652f\u662f <code>main<\/code>\uff08\u65e7\u7248\u672c\u53eb <code>master<\/code>\uff09\u3002\u53ef\u4ee5\u5728\u5206\u652f\u4e0a\u5f00\u53d1\u65b0\u529f\u80fd\u3001\u4fee\u590d Bug\uff0c\u5b8c\u6210\u540e\u5408\u5e76\u56de\u4e3b\u5206\u652f\uff0c\u4e92\u4e0d\u5f71\u54cd\u3002<\/p>\n\n<h3>3.5 HEAD<\/h3>\n<p><code>HEAD<\/code> \u662f\u4e00\u4e2a\u7279\u6b8a\u6307\u9488\uff0c\u6307\u5411\u5f53\u524d\u5de5\u4f5c\u6240\u5728\u7684<strong>\u6700\u65b0\u63d0\u4ea4<\/strong>\u3002\u5207\u6362\u5206\u652f\u65f6\uff0cHEAD \u4f1a\u79fb\u52a8\u5230\u76ee\u6807\u5206\u652f\u7684\u6700\u65b0\u63d0\u4ea4\u3002<\/p>\n\n<h3>3.6 \u6807\u7b7e\uff08Tag\uff09<\/h3>\n<p>\u6807\u7b7e\u662f\u5bf9\u67d0\u4e2a\u63d0\u4ea4\u7684<strong>\u56fa\u5b9a\u547d\u540d\u5f15\u7528<\/strong>\uff0c\u901a\u5e38\u7528\u4e8e\u6807\u8bb0\u7248\u672c\u53d1\u5e03\uff0c\u5982 <code>v1.0.0<\/code>\u3001<code>v2.1.3<\/code>\u3002<\/p>\n\n<!-- Section 4 -->\n<h2 id=\"zh-install\">\u56db\u3001\u5b89\u88c5\u4e0e\u521d\u59cb\u914d\u7f6e<\/h2>\n\n<h3>4.1 \u5b89\u88c5 Git<\/h3>\n<div class=\"cmd-grid\">\n  <div class=\"cmd-card\">\n    <h4><span class=\"tag tag-b\">Windows<\/span><\/h4>\n    <div class=\"cmd\">winget install Git.Git<\/div>\n    <div class=\"desc\">\u6216\u4ece <a href=\"https:\/\/git-scm.com\/download\/win\" target=\"_blank\" rel=\"noopener\">git-scm.com<\/a> \u4e0b\u8f7d\u5b89\u88c5\u5305<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4><span class=\"tag tag-g\">macOS<\/span><\/h4>\n    <div class=\"cmd\">brew install git<\/div>\n    <div class=\"desc\">\u6216\u5b89\u88c5 Xcode Command Line Tools<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4><span class=\"tag tag-y\">Linux (Debian\/Ubuntu)<\/span><\/h4>\n    <div class=\"cmd\">sudo apt install git<\/div>\n    <div class=\"desc\">\u6216\u4f7f\u7528\u5404\u53d1\u884c\u7248\u7684\u5305\u7ba1\u7406\u5668<\/div>\n  <\/div>\n<\/div>\n\n<h3>4.2 \u521d\u59cb\u914d\u7f6e<\/h3>\n<pre class=\"code-block\"># \u8bbe\u7f6e\u7528\u6237\u540d\uff08\u4f1a\u663e\u793a\u5728\u63d0\u4ea4\u8bb0\u5f55\u4e2d\uff09\ngit config --global user.name \"Your Name\"\n\n# \u8bbe\u7f6e\u90ae\u7bb1\uff08\u5efa\u8bae\u4e0e GitHub\/GitLab \u6ce8\u518c\u90ae\u7bb1\u4e00\u81f4\uff09\ngit config --global user.email \"you@example.com\"\n\n# \u8bbe\u7f6e\u9ed8\u8ba4\u5206\u652f\u540d\u4e3a main\uff08\u65b0\u7248 Git \u5df2\u9ed8\u8ba4\uff09\ngit config --global init.defaultBranch main\n\n# \u67e5\u770b\u5f53\u524d\u914d\u7f6e\ngit config --list\n\n# \u67e5\u770b\u67d0\u4e2a\u914d\u7f6e\u9879\ngit config user.name<\/pre>\n\n<div class=\"info-box\">\n  <strong>\u63d0\u793a\uff1a<\/strong><code>--global<\/code> \u8868\u793a\u5168\u5c40\u914d\u7f6e\uff08\u5bf9\u6240\u6709\u4ed3\u5e93\u751f\u6548\uff09\u3002\u5982\u679c\u53ea\u60f3\u5bf9\u67d0\u4e2a\u4ed3\u5e93\u5355\u72ec\u8bbe\u7f6e\uff0c\u53bb\u6389 <code>--global<\/code> \u5728\u4ed3\u5e93\u76ee\u5f55\u4e0b\u6267\u884c\u5373\u53ef\u3002\n<\/div>\n\n<!-- Section 5 -->\n<h2 id=\"zh-basics\">\u4e94\u3001\u57fa\u7840\u547d\u4ee4\uff1a\u521b\u5efa\u4e0e\u63d0\u4ea4<\/h2>\n\n<h3>5.1 \u521b\u5efa\u4ed3\u5e93<\/h3>\n<div class=\"two-col\">\n  <div class=\"col\">\n    <h4><span class=\"tag tag-b\">\u65b9\u5f0f A\uff1agit init<\/span> \u4ece\u96f6\u521b\u5efa<\/h4>\n    <pre class=\"code-block\"># \u8fdb\u5165\u9879\u76ee\u6587\u4ef6\u5939\ncd \/path\/to\/project\n\n# \u521d\u59cb\u5316\u4e3a Git \u4ed3\u5e93\uff08\u521b\u5efa .git \u9690\u85cf\u6587\u4ef6\u5939\uff09\ngit init\n\n# \u67e5\u770b\u4ed3\u5e93\u72b6\u6001\ngit status<\/pre>\n  <\/div>\n  <div class=\"col\">\n    <h4><span class=\"tag tag-g\">\u65b9\u5f0f B\uff1agit clone<\/span> \u514b\u9686\u5df2\u6709\u4ed3\u5e93<\/h4>\n    <pre class=\"code-block\"># HTTPS\ngit clone https:\/\/github.com\/user\/repo.git\n\n# SSH\ngit clone git@github.com:user\/repo.git\n\n# \u514b\u9686\u5230\u6307\u5b9a\u6587\u4ef6\u5939\u540d\ngit clone https:\/\/... my-project<\/pre>\n  <\/div>\n<\/div>\n\n<h3>5.2 \u6587\u4ef6\u72b6\u6001\u751f\u547d\u5468\u671f<\/h3>\n<div class=\"flow-diagram\">\n  <div class=\"flow-row\">\n    <span class=\"flow-item\" style=\"background:var(--muted);color:#fff\">Untracked<br><small>\u672a\u8ffd\u8e2a<\/small><\/span>\n    <span class=\"flow-arrow\">\u2192 <code>git add<\/code><\/span>\n    <span class=\"flow-item yellow\">Staged<br><small>\u5df2\u6682\u5b58<\/small><\/span>\n    <span class=\"flow-arrow\">\u2192 <code>git commit<\/code><\/span>\n    <span class=\"flow-item green\">Committed<br><small>\u5df2\u63d0\u4ea4<\/small><\/span>\n  <\/div>\n<\/div>\n\n<div class=\"cmd-grid\">\n  <div class=\"cmd-card\">\n    <h4>git status<\/h4>\n    <div class=\"cmd\">git status<\/div>\n    <div class=\"desc\">\u67e5\u770b\u5f53\u524d\u5de5\u4f5c\u533a\u548c\u6682\u5b58\u533a\u72b6\u6001\uff1a\u54ea\u4e9b\u6587\u4ef6\u88ab\u4fee\u6539\u3001\u54ea\u4e9b\u5df2\u6682\u5b58\u3001\u54ea\u4e9b\u672a\u8ffd\u8e2a<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git add<\/h4>\n    <div class=\"cmd\">git add .          # \u6dfb\u52a0\u6240\u6709\u53d8\u66f4\ngit add file.py   # \u6dfb\u52a0\u6307\u5b9a\u6587\u4ef6<\/div>\n    <div class=\"desc\">\u5c06\u6587\u4ef6\u4ece\u5de5\u4f5c\u533a\u79fb\u5230\u6682\u5b58\u533a<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git commit<\/h4>\n    <div class=\"cmd\">git commit -m &#8220;feat: add login page&#8221;<\/div>\n    <div class=\"desc\">\u5c06\u6682\u5b58\u533a\u7684\u6539\u52a8\u63d0\u4ea4\u5230\u672c\u5730\u4ed3\u5e93\uff0c-m \u6307\u5b9a\u63d0\u4ea4\u4fe1\u606f<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git diff<\/h4>\n    <div class=\"cmd\">git diff          # \u5de5\u4f5c\u533a vs \u6682\u5b58\u533a\ngit diff &#8211;staged # \u6682\u5b58\u533a vs \u6700\u65b0\u63d0\u4ea4<\/div>\n    <div class=\"desc\">\u67e5\u770b\u6587\u4ef6\u7684\u5177\u4f53\u6539\u52a8\u5185\u5bb9<\/div>\n  <\/div>\n<\/div>\n\n<h3>5.3 .gitignore \u6587\u4ef6<\/h3>\n<p><code>.gitignore<\/code> \u6587\u4ef6\u6307\u5b9a\u54ea\u4e9b\u6587\u4ef6\/\u76ee\u5f55<strong>\u4e0d\u7eb3\u5165 Git \u7ba1\u7406<\/strong>\uff08\u5982\u7f16\u8bd1\u4ea7\u7269\u3001\u7cfb\u7edf\u6587\u4ef6\u3001\u654f\u611f\u4fe1\u606f\uff09\uff1a<\/p>\n<pre class=\"code-block\"># \u7f16\u8bd1\u4ea7\u7269\nnode_modules\/\n__pycache__\/\n*.pyc\nbuild\/\ndist\/\n\n# \u7cfb\u7edf\u6587\u4ef6\n.DS_Store\nThumbs.db\n\n# \u73af\u5883\u914d\u7f6e\uff08\u5305\u542b\u654f\u611f\u4fe1\u606f\uff09\n.env\n.env.local\n\n# IDE \u914d\u7f6e\n.vscode\/\n.idea\/<\/pre>\n\n<!-- Section 6 -->\n<h2 id=\"zh-branch\">\u516d\u3001\u5206\u652f\u7ba1\u7406<\/h2>\n<p>\u5206\u652f\u662f Git \u6700\u5f3a\u5927\u7684\u529f\u80fd\u4e4b\u4e00\u2014\u2014\u5b83\u5141\u8bb8<strong>\u5e76\u884c\u5f00\u53d1<\/strong>\u4e0d\u540c\u529f\u80fd\uff0c\u4e92\u4e0d\u5e72\u6270\u3002<\/p>\n\n<div class=\"flow-diagram\">\n  <div class=\"flow-row\">\n    <span class=\"flow-item\">main<\/span>\n    <span class=\"flow-arrow\" style=\"transform:rotate(25deg)\">\u2197<\/span>\n    <span class=\"flow-item yellow\">feature\/login<\/span>\n    <span class=\"flow-arrow\" style=\"transform:rotate(-25deg)\">\u2198<\/span>\n    <span class=\"flow-item purple\">bugfix\/fix-crash<\/span>\n  <\/div>\n  <div class=\"flow-row\" style=\"margin-top:.3rem;\">\n    <span style=\"color:var(--muted);font-size:.8rem\">\u2190 \u4e3b\u5206\u652f\uff08\u7a33\u5b9a\u4ee3\u7801\uff09 \u2190<\/span>\n  <\/div>\n<\/div>\n\n<div class=\"cmd-grid\">\n  <div class=\"cmd-card\">\n    <h4>git branch<\/h4>\n    <div class=\"cmd\">git branch              # \u67e5\u770b\u672c\u5730\u5206\u652f\ngit branch -a           # \u67e5\u770b\u6240\u6709\u5206\u652f\uff08\u542b\u8fdc\u7a0b\uff09\ngit branch feature\/api   # \u521b\u5efa\u65b0\u5206\u652f<\/div>\n    <div class=\"desc\">\u67e5\u770b\u548c\u521b\u5efa\u5206\u652f\uff08\u4e0d\u5207\u6362\uff09<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git checkout \/ switch<\/h4>\n    <div class=\"cmd\">git checkout feature\/api     # \u5207\u6362\u5230\u5206\u652f\ngit switch -c feature\/api   # \u521b\u5efa\u5e76\u5207\u6362\uff08\u63a8\u8350\uff09<\/div>\n    <div class=\"desc\">\u5207\u6362\u5de5\u4f5c\u5206\u652f\u3002<code>git switch<\/code> \u662f\u65b0\u7248\u63a8\u8350\u547d\u4ee4<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git merge<\/h4>\n    <div class=\"cmd\">git checkout main\ngit merge feature\/api      # \u5408\u5e76\u5230 main<\/div>\n    <div class=\"desc\">\u5c06\u6307\u5b9a\u5206\u652f\u7684\u6539\u52a8\u5408\u5e76\u5230\u5f53\u524d\u5206\u652f<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git branch -d<\/h4>\n    <div class=\"cmd\">git branch -d feature\/api    # \u5b89\u5168\u5220\u9664\uff08\u5df2\u5408\u5e76\uff09\ngit branch -D feature\/api    # \u5f3a\u5236\u5220\u9664\uff08\u672a\u5408\u5e76\u4e5f\u53ef\u5220\uff09<\/div>\n    <div class=\"desc\">\u5220\u9664\u5df2\u5b8c\u6210\u7684\u5206\u652f\uff0c\u4fdd\u6301\u5206\u652f\u5217\u8868\u6574\u6d01<\/div>\n  <\/div>\n<\/div>\n\n<div class=\"info-box warn\">\n  <strong>\u5206\u652f\u547d\u540d\u5efa\u8bae\uff1a<\/strong>\u4f7f\u7528\u6709\u610f\u4e49\u7684\u540d\u79f0\uff0c\u5e38\u89c1\u524d\u7f00\uff1a <code>feature\/<\/code>\uff08\u65b0\u529f\u80fd\uff09\u3001<code>bugfix\/<\/code> \u6216 <code>fix\/<\/code>\uff08\u4fee\u590d\uff09\u3001<code>hotfix\/<\/code>\uff08\u7d27\u6025\u4fee\u590d\uff09\u3001<code>docs\/<\/code>\uff08\u6587\u6863\uff09\u3001<code>refactor\/<\/code>\uff08\u91cd\u6784\uff09\u3002\n<\/div>\n\n<!-- Section 7 -->\n<h2 id=\"zh-remote\">\u4e03\u3001\u8fdc\u7a0b\u4ed3\u5e93\u534f\u4f5c<\/h2>\n\n<h3>7.1 \u5173\u8054\u8fdc\u7a0b\u4ed3\u5e93<\/h3>\n<pre class=\"code-block\"># \u67e5\u770b\u8fdc\u7a0b\u4ed3\u5e93\ngit remote -v\n\n# \u6dfb\u52a0\u8fdc\u7a0b\u4ed3\u5e93\uff08\u901a\u5e38\u5728 git clone \u65f6\u81ea\u52a8\u5b8c\u6210\uff09\ngit remote add origin https:\/\/github.com\/user\/repo.git\n\n# \u4fee\u6539\u8fdc\u7a0b\u4ed3\u5e93\u5730\u5740\ngit remote set-url origin https:\/\/new-url\/repo.git<\/pre>\n\n<h3>7.2 \u63a8\u9001\u4e0e\u62c9\u53d6<\/h3>\n<div class=\"cmd-grid\">\n  <div class=\"cmd-card\">\n    <h4>git push<\/h4>\n    <div class=\"cmd\">git push origin main       # \u63a8\u9001\u5230\u8fdc\u7a0b main \u5206\u652f\ngit push -u origin main     # \u9996\u6b21\u63a8\u9001\u5e76\u5efa\u7acb\u8ffd\u8e2a\u5173\u7cfb\ngit push                     # \u7b80\u5199\uff08\u5df2\u6709\u8ffd\u8e2a\u5173\u7cfb\u65f6\uff09<\/div>\n    <div class=\"desc\">\u5c06\u672c\u5730\u63d0\u4ea4\u63a8\u9001\u5230\u8fdc\u7a0b\u4ed3\u5e93<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git pull<\/h4>\n    <div class=\"cmd\">git pull origin main        # \u62c9\u53d6\u5e76\u81ea\u52a8\u5408\u5e76\ngit pull &#8211;rebase origin main  # \u62c9\u53d6\u5e76\u53d8\u57fa\uff08\u4fdd\u6301\u7ebf\u6027\u5386\u53f2\uff09<\/div>\n    <div class=\"desc\">\u83b7\u53d6\u8fdc\u7a0b\u6700\u65b0\u4ee3\u7801\u5e76\u5408\u5e76\u5230\u672c\u5730<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git fetch<\/h4>\n    <div class=\"cmd\">git fetch origin            # \u83b7\u53d6\u8fdc\u7a0b\u66f4\u65b0\uff08\u4e0d\u81ea\u52a8\u5408\u5e76\uff09<\/div>\n    <div class=\"desc\">\u53ea\u4e0b\u8f7d\u8fdc\u7a0b\u6570\u636e\uff0c\u4e0d\u6539\u53d8\u672c\u5730\u5206\u652f\u3002\u9002\u5408\u5148\u67e5\u770b\u518d\u51b3\u5b9a\u662f\u5426\u5408\u5e76<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git clone<\/h4>\n    <div class=\"cmd\">git clone https:\/\/github.com\/user\/repo.git<\/div>\n    <div class=\"desc\">\u514b\u9686\u8fdc\u7a0b\u4ed3\u5e93\u5230\u672c\u5730\uff08\u81ea\u52a8\u521b\u5efa\u76ee\u5f55\u3001\u8bbe\u7f6e remote\uff09<\/div>\n  <\/div>\n<\/div>\n\n<div class=\"info-box\">\n  <strong>push vs pull vs fetch\uff1a<\/strong><code>push<\/code> = \u672c\u5730\u2192\u8fdc\u7a0b\uff1b<code>pull<\/code> = \u8fdc\u7a0b\u2192\u672c\u5730\uff08\u81ea\u52a8\u5408\u5e76\uff09\uff1b<code>fetch<\/code> = \u8fdc\u7a0b\u2192\u672c\u5730\uff08\u4ec5\u4e0b\u8f7d\u4e0d\u5408\u5e76\uff09\u3002\u5efa\u8bae\u6bcf\u6b21\u5f00\u53d1\u524d\u5148 <code>git pull<\/code>\uff0c\u51cf\u5c11\u51b2\u7a81\u3002\n<\/div>\n\n<!-- Section 8 -->\n<h2 id=\"zh-history\">\u516b\u3001\u67e5\u770b\u5386\u53f2\u4e0e\u56de\u9000<\/h2>\n\n<div class=\"cmd-grid\">\n  <div class=\"cmd-card\">\n    <h4>git log<\/h4>\n    <div class=\"cmd\">git log                     # \u5b8c\u6574\u65e5\u5fd7\ngit log &#8211;oneline             # \u7b80\u6d01\u6a21\u5f0f\uff08\u4e00\u884c\u4e00\u6761\uff09\ngit log &#8211;oneline &#8211;graph      # \u56fe\u5f62\u5316\u5206\u652f\u5386\u53f2\ngit log &#8211;author=&#8221;name&#8221;       # \u6309\u4f5c\u8005\u8fc7\u6ee4\ngit log &#8211;since=&#8221;2 weeks ago&#8221;  # \u6309\u65f6\u95f4\u8fc7\u6ee4<\/div>\n    <div class=\"desc\">\u67e5\u770b\u63d0\u4ea4\u5386\u53f2<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git show<\/h4>\n    <div class=\"cmd\">git show abc1234   # \u67e5\u770b\u67d0\u6b21\u63d0\u4ea4\u7684\u8be6\u60c5\ngit show abc1234 &#8211;stat  # \u53ea\u770b\u6539\u4e86\u54ea\u4e9b\u6587\u4ef6<\/div>\n    <div class=\"desc\">\u67e5\u770b\u67d0\u6b21\u5177\u4f53\u63d0\u4ea4\u7684\u5185\u5bb9<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git reset<\/h4>\n    <div class=\"cmd\">git reset &#8211;soft HEAD~1   # \u56de\u9000\u63d0\u4ea4\uff0c\u4fdd\u7559\u6539\u52a8\u5728\u6682\u5b58\u533a\ngit reset &#8211;mixed HEAD~1   # \u56de\u9000\u63d0\u4ea4\uff0c\u4fdd\u7559\u6539\u52a8\u5728\u5de5\u4f5c\u533a\uff08\u9ed8\u8ba4\uff09\ngit reset &#8211;hard HEAD~1    # \u56de\u9000\u63d0\u4ea4\uff0c\u4e22\u5f03\u6240\u6709\u6539\u52a8\uff08\u5371\u9669!\uff09<\/div>\n    <div class=\"desc\">\u64a4\u9500\u63d0\u4ea4\uff08\u53ef\u6307\u5b9a\u56de\u9000\u7a0b\u5ea6\uff09<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git revert<\/h4>\n    <div class=\"cmd\">git revert abc1234<\/div>\n    <div class=\"desc\">\u521b\u5efa\u4e00\u4e2a\u65b0\u63d0\u4ea4\u6765&#8221;\u64a4\u9500&#8221;\u6307\u5b9a\u63d0\u4ea4\u7684\u6539\u52a8\uff08\u5b89\u5168\uff0c\u4e0d\u6539\u5199\u5386\u53f2\uff09<\/div>\n  <\/div>\n<\/div>\n\n<div class=\"info-box danger\">\n  <strong>reset vs revert\uff1a<\/strong><code>reset --hard<\/code> \u4f1a\u6539\u5199\u5386\u53f2\u5e76<strong>\u6c38\u4e45\u4e22\u5931<\/strong>\u4ee3\u7801\uff0c\u4ec5\u9002\u7528\u4e8e\u672a\u63a8\u9001\u7684\u672c\u5730\u63d0\u4ea4\u3002<code>revert<\/code> \u4f1a\u521b\u5efa\u65b0\u7684\u63d0\u4ea4\u6765\u64a4\u9500\uff0c<strong>\u4e0d\u6539\u5199\u5386\u53f2<\/strong>\uff0c\u9002\u5408\u5df2\u63a8\u9001\u7684\u516c\u5171\u5206\u652f\u3002\n<\/div>\n\n<!-- Section 9 -->\n<h2 id=\"zh-stash\">\u4e5d\u3001\u6682\u5b58\u4e0e\u6e05\u7406<\/h2>\n\n<div class=\"cmd-grid\">\n  <div class=\"cmd-card\">\n    <h4>git stash<\/h4>\n    <div class=\"cmd\">git stash             # \u6682\u5b58\u5f53\u524d\u6539\u52a8\ngit stash save &#8220;msg&#8221;   # \u5e26\u5907\u6ce8\u4fe1\u606f\u6682\u5b58\ngit stash list         # \u67e5\u770b\u6240\u6709\u6682\u5b58<\/div>\n    <div class=\"desc\">\u4e34\u65f6\u4fdd\u5b58\u672a\u63d0\u4ea4\u7684\u6539\u52a8\uff08\u5207\u6362\u5206\u652f\u524d\u5e38\u7528\uff09<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git stash pop \/ apply<\/h4>\n    <div class=\"cmd\">git stash pop          # \u6062\u590d\u6700\u8fd1\u7684\u6682\u5b58\u5e76\u5220\u9664\u8bb0\u5f55\ngit stash apply stash@{0}  # \u6062\u590d\u6307\u5b9a\u6682\u5b58\uff08\u4fdd\u7559\u8bb0\u5f55\uff09\ngit stash drop stash@{0}    # \u624b\u52a8\u5220\u9664\u6682\u5b58\u8bb0\u5f55<\/div>\n    <div class=\"desc\">\u6062\u590d\u4e4b\u524d\u6682\u5b58\u7684\u6539\u52a8<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git clean<\/h4>\n    <div class=\"cmd\">git clean -n           # \u9884\u89c8\u5c06\u88ab\u6e05\u7406\u7684\u6587\u4ef6\ngit clean -f           # \u5220\u9664\u672a\u8ffd\u8e2a\u7684\u6587\u4ef6\ngit clean -fd          # \u5220\u9664\u672a\u8ffd\u8e2a\u7684\u6587\u4ef6\u548c\u6587\u4ef6\u5939<\/div>\n    <div class=\"desc\">\u6e05\u7406\u5de5\u4f5c\u533a\u4e2d\u672a\u8ffd\u8e2a\u7684\u6587\u4ef6\uff08\u4e0d\u5f71\u54cd\u5df2\u63d0\u4ea4\u7684\u5185\u5bb9\uff09<\/div>\n  <\/div>\n<\/div>\n\n<div class=\"info-box\">\n  <strong>\u5178\u578b\u4f7f\u7528\u573a\u666f\uff1a<\/strong>\u6b63\u5728\u5f00\u53d1\u65b0\u529f\u80fd\uff0c\u7a81\u7136\u9700\u8981\u5207\u5230 main \u5206\u652f\u4fee\u4e00\u4e2a\u7d27\u6025 Bug\u3002\u7528 <code>git stash<\/code> \u6682\u5b58\u5f53\u524d\u6539\u52a8 \u2192 <code>git checkout main<\/code> \u2192 \u4fee Bug \u2192 <code>git checkout feature<\/code> \u2192 <code>git stash pop<\/code> \u6062\u590d\u7ee7\u7eed\u5f00\u53d1\u3002\n<\/div>\n\n<!-- Section 10 -->\n<h2 id=\"zh-merge\">\u5341\u3001\u5408\u5e76\u4e0e\u51b2\u7a81\u89e3\u51b3<\/h2>\n\n<h3>10.1 \u5408\u5e76\u65b9\u5f0f<\/h3>\n<div class=\"cmd-grid\">\n  <div class=\"cmd-card\">\n    <h4>git merge\uff08\u5408\u5e76\u63d0\u4ea4\uff09<\/h4>\n    <div class=\"cmd\">git checkout main\ngit merge feature\/api<\/div>\n    <div class=\"desc\">\u4fdd\u7559\u5b8c\u6574\u5206\u652f\u5386\u53f2\uff0c\u521b\u5efa\u4e00\u4e2a\u5408\u5e76\u63d0\u4ea4\u8282\u70b9<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git rebase\uff08\u53d8\u57fa\uff09<\/h4>\n    <div class=\"cmd\">git checkout feature\/api\ngit rebase main<\/div>\n    <div class=\"desc\">\u5c06\u5f53\u524d\u5206\u652f\u7684\u63d0\u4ea4&#8221;\u91cd\u653e&#8221;\u5230\u76ee\u6807\u5206\u652f\u6700\u65b0\u63d0\u4ea4\u4e4b\u4e0a\uff0c\u5386\u53f2\u66f4\u7ebf\u6027\u3002\u26a0\ufe0f \u4e0d\u8981\u5bf9\u5df2\u63a8\u9001\u7684\u516c\u5171\u5206\u652f\u6267\u884c rebase<\/div>\n  <\/div>\n<\/div>\n\n<h3>10.2 \u51b2\u7a81\u89e3\u51b3\u6d41\u7a0b<\/h3>\n<p>\u5f53\u4e24\u4e2a\u5206\u652f\u4fee\u6539\u4e86<strong>\u540c\u4e00\u6587\u4ef6\u7684\u540c\u4e00\u4f4d\u7f6e<\/strong>\u65f6\uff0cGit \u65e0\u6cd5\u81ea\u52a8\u5408\u5e76\uff0c\u4ea7\u751f\u51b2\u7a81\uff08CONFLICT\uff09\u3002<\/p>\n<ol class=\"steps\">\n  <li>\n    Git \u4f1a\u6807\u8bb0\u51b2\u7a81\u6587\u4ef6\n    <span class=\"cmd\">git status<\/span>\n    <span class=\"note\">\u51b2\u7a81\u6587\u4ef6\u663e\u793a\u4e3a &#8220;both modified&#8221;<\/span>\n  <\/li>\n  <li>\n    \u6253\u5f00\u51b2\u7a81\u6587\u4ef6\uff0c\u641c\u7d22\u51b2\u7a81\u6807\u8bb0\n    <span class=\"note\"><code>&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD<\/code>\uff08\u5f53\u524d\u5206\u652f\u6539\u52a8\uff09\u548c <code>=======<\/code>\uff08\u5206\u9694\u7ebf\uff09\u548c <code>&gt;&gt;&gt;&gt;&gt;&gt;&gt; incoming<\/code>\uff08\u53e6\u4e00\u5206\u652f\u6539\u52a8\uff09<\/span>\n  <\/li>\n  <li>\n    \u624b\u52a8\u7f16\u8f91\u4fdd\u7559\u6b63\u786e\u5185\u5bb9\uff0c\u5220\u9664\u6240\u6709\u51b2\u7a81\u6807\u8bb0\n    <span class=\"note\">VS Code \u7b49\u7f16\u8f91\u5668\u63d0\u4f9b\u53ef\u89c6\u5316\u51b2\u7a81\u89e3\u51b3\u754c\u9762\uff08Accept Current \/ Incoming \/ Both\uff09<\/span>\n  <\/li>\n  <li>\n    \u6807\u8bb0\u51b2\u7a81\u5df2\u89e3\u51b3\u5e76\u63d0\u4ea4\n    <span class=\"cmd\">git add .&nbsp;&nbsp;git commit -m &#8220;resolve merge conflict in config.py&#8221;<\/span>\n  <\/li>\n<\/ol>\n\n<!-- Section 11 -->\n<h2 id=\"zh-advanced\">\u5341\u4e00\u3001\u9ad8\u7ea7\u6280\u5de7<\/h2>\n\n<div class=\"cmd-grid\">\n  <div class=\"cmd-card\">\n    <h4>git cherry-pick<\/h4>\n    <div class=\"cmd\">git cherry-pick abc1234<\/div>\n    <div class=\"desc\">\u5c06\u67d0\u4e2a\u63d0\u4ea4&#8221;\u6458&#8221;\u5230\u5f53\u524d\u5206\u652f\uff0c\u4e0d\u9700\u8981\u5408\u5e76\u6574\u4e2a\u5206\u652f<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git tag<\/h4>\n    <div class=\"cmd\">git tag v1.0.0                    # \u8f7b\u91cf\u6807\u7b7e\ngit tag -a v1.0.0 -m &#8220;Release 1.0&#8221;   # \u9644\u6ce8\u6807\u7b7e\ngit push origin v1.0.0               # \u63a8\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\ngit tag -d v1.0.0                    # \u5220\u9664\u672c\u5730\u6807\u7b7e<\/div>\n    <div class=\"desc\">\u6807\u8bb0\u7248\u672c\u53d1\u5e03\u70b9<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git bisect<\/h4>\n    <div class=\"cmd\">git bisect start\ngit bisect bad          # \u5f53\u524d\u7248\u672c\u6709 Bug\ngit bisect good abc1234  # \u8fd9\u4e2a\u7248\u672c\u6ca1\u6709 Bug<\/div>\n    <div class=\"desc\">\u4e8c\u5206\u67e5\u627e\u5b9a\u4f4d\u5f15\u5165 Bug \u7684\u63d0\u4ea4\uff08\u81ea\u52a8\u8df3\u8f6c\u4e2d\u95f4\u7248\u672c\uff09<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git blame<\/h4>\n    <div class=\"cmd\">git blame file.py\ngit blame -L 10,20 file.py<\/div>\n    <div class=\"desc\">\u67e5\u770b\u6587\u4ef6\u6bcf\u4e00\u884c\u6700\u540e\u662f\u8c01\u5728\u4ec0\u4e48\u65f6\u5019\u4fee\u6539\u7684<\/div>\n  <\/div>\n<\/div>\n\n<!-- Section 12 -->\n<h2 id=\"zh-workflow\">\u5341\u4e8c\u3001\u63a8\u8350\u5de5\u4f5c\u6d41<\/h2>\n\n<h3>12.1 \u4e2a\u4eba\u9879\u76ee<\/h3>\n<div class=\"flow-diagram\">\n  <div class=\"flow-row\">\n    <span class=\"flow-item green\">git pull<\/span>\n    <span class=\"flow-arrow\">\u2192<\/span>\n    <span class=\"flow-item\">\u5199\u4ee3\u7801<\/span>\n    <span class=\"flow-arrow\">\u2192<\/span>\n    <span class=\"flow-item yellow\">git add .<\/span>\n    <span class=\"flow-arrow\">\u2192<\/span>\n    <span class=\"flow-item yellow\">git commit -m<\/span>\n    <span class=\"flow-arrow\">\u2192<\/span>\n    <span class=\"flow-item purple\">git push<\/span>\n  <\/div>\n<\/div>\n\n<h3>12.2 \u56e2\u961f\u534f\u4f5c\uff08Feature Branch Workflow\uff09<\/h3>\n<ol class=\"steps\">\n  <li>\n    \u4ece main \u521b\u5efa\u529f\u80fd\u5206\u652f\n    <span class=\"cmd\">git checkout main&nbsp;&nbsp;git pull&nbsp;&nbsp;git checkout -b feature\/user-auth<\/span>\n  <\/li>\n  <li>\n    \u5728\u529f\u80fd\u5206\u652f\u4e0a\u5f00\u53d1\u548c\u63d0\u4ea4\n    <span class=\"cmd\">git add .&nbsp;&nbsp;git commit -m &#8220;feat: add user authentication&#8221;<\/span>\n    <span class=\"note\">\u53ef\u4ee5\u591a\u6b21 commit<\/span>\n  <\/li>\n  <li>\n    \u63a8\u9001\u529f\u80fd\u5206\u652f\u5230\u8fdc\u7a0b\n    <span class=\"cmd\">git push -u origin feature\/user-auth<\/span>\n  <\/li>\n  <li>\n    \u5728 GitHub\/GitLab \u4e0a\u521b\u5efa Pull Request (PR)\n    <span class=\"note\">\u56e2\u961f\u6210\u5458 Code Review \u901a\u8fc7\u540e\u5408\u5e76<\/span>\n  <\/li>\n  <li>\n    \u5408\u5e76\u540e\u5220\u9664\u529f\u80fd\u5206\u652f\n    <span class=\"cmd\">git checkout main&nbsp;&nbsp;git pull&nbsp;&nbsp;git branch -d feature\/user-auth<\/span>\n  <\/li>\n<\/ol>\n\n<h3>12.3 \u5e38\u7528\u547d\u4ee4\u901f\u67e5\u8868<\/h3>\n<div class=\"table-wrap\">\n<table>\n  <thead>\n    <tr><th>\u573a\u666f<\/th><th>\u547d\u4ee4<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr><td>\u521d\u59cb\u5316\u4ed3\u5e93<\/td><td><code>git init<\/code><\/td><\/tr>\n    <tr><td>\u514b\u9686\u4ed3\u5e93<\/td><td><code>git clone &lt;url&gt;<\/code><\/td><\/tr>\n    <tr><td>\u67e5\u770b\u72b6\u6001<\/td><td><code>git status<\/code><\/td><\/tr>\n    <tr><td>\u6dfb\u52a0\u5230\u6682\u5b58\u533a<\/td><td><code>git add .<\/code><\/td><\/tr>\n    <tr><td>\u63d0\u4ea4<\/td><td><code>git commit -m \"message\"<\/code><\/td><\/tr>\n    <tr><td>\u63a8\u9001\u5230\u8fdc\u7a0b<\/td><td><code>git push<\/code><\/td><\/tr>\n    <tr><td>\u62c9\u53d6\u8fdc\u7a0b\u66f4\u65b0<\/td><td><code>git pull<\/code><\/td><\/tr>\n    <tr><td>\u521b\u5efa\u5206\u652f<\/td><td><code>git checkout -b &lt;branch&gt;<\/code><\/td><\/tr>\n    <tr><td>\u5207\u6362\u5206\u652f<\/td><td><code>git checkout &lt;branch&gt;<\/code><\/td><\/tr>\n    <tr><td>\u5408\u5e76\u5206\u652f<\/td><td><code>git merge &lt;branch&gt;<\/code><\/td><\/tr>\n    <tr><td>\u67e5\u770b\u65e5\u5fd7<\/td><td><code>git log --oneline<\/code><\/td><\/tr>\n    <tr><td>\u64a4\u9500\u4e0a\u6b21\u63d0\u4ea4\uff08\u4fdd\u7559\u6539\u52a8\uff09<\/td><td><code>git reset --soft HEAD~1<\/code><\/td><\/tr>\n    <tr><td>\u64a4\u9500\u67d0\u6b21\u63d0\u4ea4\uff08\u5b89\u5168\uff09<\/td><td><code>git revert &lt;hash&gt;<\/code><\/td><\/tr>\n    <tr><td>\u6682\u5b58\u5f53\u524d\u6539\u52a8<\/td><td><code>git stash<\/code><\/td><\/tr>\n    <tr><td>\u6062\u590d\u6682\u5b58<\/td><td><code>git stash pop<\/code><\/td><\/tr>\n  <\/tbody>\n<\/table>\n<\/div>\n\n<\/div><!-- \/zh -->\n\n\n<!-- ==================== EN ==================== -->\n<div class=\"lang-section\" id=\"lang-en\">\n<div class=\"hero\">\n  <h1>Complete Git Guide<\/h1>\n  <p>Learn Git from scratch: what it is, why you need it, core concepts, commands, and practical workflows<\/p>\n<\/div>\n\n<div class=\"toc\">\n  <h3>Table of Contents<\/h3>\n  <ol>\n    <li><a href=\"#en-what\">What is Git<\/a><\/li>\n    <li><a href=\"#en-why\">Why Git<\/a><\/li>\n    <li><a href=\"#en-concepts\">Core Concepts<\/a><\/li>\n    <li><a href=\"#en-install\">Installation &amp; Setup<\/a><\/li>\n    <li><a href=\"#en-basics\">Basics: Create &amp; Commit<\/a><\/li>\n    <li><a href=\"#en-branch\">Branch Management<\/a><\/li>\n    <li><a href=\"#en-remote\">Remote Repositories<\/a><\/li>\n    <li><a href=\"#en-history\">History &amp; Rollback<\/a><\/li>\n    <li><a href=\"#en-stash\">Stash &amp; Clean<\/a><\/li>\n    <li><a href=\"#en-merge\">Merge &amp; Conflict Resolution<\/a><\/li>\n    <li><a href=\"#en-advanced\">Advanced Tips<\/a><\/li>\n    <li><a href=\"#en-workflow\">Recommended Workflows<\/a><\/li>\n  <\/ol>\n<\/div>\n\n<!-- Section 1 -->\n<h2 id=\"en-what\">1. What is Git<\/h2>\n<p>Git is a <strong>Distributed Version Control System<\/strong> (DVCS), created by Linus Torvalds in 2005, originally to manage the Linux kernel source code.<\/p>\n\n<div class=\"card\">\n  <h4>Key Characteristics<\/h4>\n  <p><strong>Distributed:<\/strong> Every developer&#8217;s local machine has a <strong>complete copy<\/strong> of the repository (including all history). No central server is required for most operations.<\/p>\n  <p><strong>Snapshot-based:<\/strong> Git doesn&#8217;t store file diffs \u2014 each commit saves a full snapshot. Unchanged files are referenced by pointers to previous versions, making it both efficient and reliable.<\/p>\n  <p><strong>Local operations:<\/strong> Viewing logs, creating branches, committing code \u2014 all work offline without network access, making it extremely fast.<\/p>\n  <p><strong>Data integrity:<\/strong> Every file is checksummed with SHA-1 hashes. Any corruption or tampering is immediately detected.<\/p>\n<\/div>\n\n<div class=\"info-box\">\n  <strong>In a nutshell:<\/strong> Git is like a &#8220;time machine&#8221; for your code \u2014 it records every change, lets you travel back to any previous version at any time, and enables multiple people to work on the same project simultaneously without conflicts.\n<\/div>\n\n<!-- Section 2 -->\n<h2 id=\"en-why\">2. Why Git<\/h2>\n\n<div class=\"card\">\n  <h4>Life Without Git<\/h4>\n  <p>Without version control, developers resort to manually copying and renaming folders: <code>project_v1<\/code>, <code>project_v2<\/code>, <code>project_final<\/code>, <code>project_final_v2<\/code>\u2026 This approach has serious problems:<\/p>\n  <ul style=\"margin-left:1.2rem;margin-bottom:.5rem;\">\n    <li>No way to trace what changed between versions<\/li>\n    <li>Team members easily overwrite each other&#8217;s code<\/li>\n    <li>Deleted files cannot be recovered<\/li>\n    <li>Confusing file names with unclear version relationships<\/li>\n    <li>Massive disk waste (each copy is a full duplicate)<\/li>\n  <\/ul>\n<\/div>\n\n<div class=\"card\">\n  <h4>What Git Solves<\/h4>\n  <div class=\"two-col\" style=\"margin-top:.5rem;\">\n    <div class=\"col\">\n      <h4><span class=\"tag tag-g\">Version Tracking<\/span><\/h4>\n      <p>Records <strong>who changed what, when, and why<\/strong> for every modification. View diffs at any time.<\/p>\n    <\/div>\n    <div class=\"col\">\n      <h4><span class=\"tag tag-b\">Team Collaboration<\/span><\/h4>\n      <p>Branches let multiple people <strong>work in parallel<\/strong> on different features, then merge seamlessly.<\/p>\n    <\/div>\n    <div class=\"col\">\n      <h4><span class=\"tag tag-y\">Easy Rollback<\/span><\/h4>\n      <p>Found a critical bug? <strong>Revert to any stable version<\/strong> instantly. No more fear of mistakes.<\/p>\n    <\/div>\n    <div class=\"col\">\n      <h4><span class=\"tag tag-p\">Code Backup<\/span><\/h4>\n      <p>Push to GitHub\/GitLab and your code is safe \u2014 even if your computer dies, <strong>nothing is lost<\/strong>.<\/p>\n    <\/div>\n  <\/div>\n<\/div>\n\n<!-- Section 3 -->\n<h2 id=\"en-concepts\">3. Core Concepts<\/h2>\n\n<h3>3.1 The Four Areas<\/h3>\n<div class=\"flow-diagram\">\n  <div class=\"flow-row\">\n    <span class=\"flow-item\">Working Dir<\/span>\n    <span class=\"flow-arrow\">\u2192 <code>git add<\/code> \u2192<\/span>\n    <span class=\"flow-item yellow\">Staging Area<\/span>\n    <span class=\"flow-arrow\">\u2192 <code>git commit<\/code> \u2192<\/span>\n    <span class=\"flow-item green\">Local Repo<\/span>\n    <span class=\"flow-arrow\">\u2192 <code>git push<\/code> \u2192<\/span>\n    <span class=\"flow-item purple\">Remote Repo<\/span>\n  <\/div>\n<\/div>\n<div class=\"info-box\">\n  <strong>Understanding these four areas is the key to mastering Git.<\/strong><br>\n  <strong>Working Dir<\/strong> = files on your computer; <strong>Staging Area<\/strong> = a checklist of changes ready to commit; <strong>Local Repo<\/strong> = your local version database; <strong>Remote Repo<\/strong> = the server-side repository on GitHub\/GitLab.\n<\/div>\n\n<h3>3.2 Repository (Repo)<\/h3>\n<p>A repository is the basic unit managed by Git. One repo = one project, containing all files, version history, branches, etc. Created via <code>git init<\/code> or <code>git clone<\/code>.<\/p>\n\n<h3>3.3 Commit<\/h3>\n<p>A commit is the fundamental unit of work in Git. Each <code>git commit<\/code> creates a new <strong>snapshot<\/strong> of all staged files. Every commit has a unique SHA-1 hash ID (e.g. <code>a1b2c3d<\/code>).<\/p>\n\n<h3>3.4 Branch<\/h3>\n<p>A branch is an <strong>independent line of development<\/strong>. The default branch is <code>main<\/code> (older versions used <code>master<\/code>). Develop features or fix bugs on branches, then merge back \u2014 no interference.<\/p>\n\n<h3>3.5 HEAD<\/h3>\n<p><code>HEAD<\/code> is a special pointer to the <strong>latest commit<\/strong> of your current branch. Switching branches moves HEAD to the target branch&#8217;s latest commit.<\/p>\n\n<h3>3.6 Tag<\/h3>\n<p>A tag is a <strong>named reference to a specific commit<\/strong>, typically used for version releases like <code>v1.0.0<\/code>, <code>v2.1.3<\/code>.<\/p>\n\n<!-- Section 4 -->\n<h2 id=\"en-install\">4. Installation &amp; Setup<\/h2>\n\n<h3>4.1 Install Git<\/h3>\n<div class=\"cmd-grid\">\n  <div class=\"cmd-card\">\n    <h4><span class=\"tag tag-b\">Windows<\/span><\/h4>\n    <div class=\"cmd\">winget install Git.Git<\/div>\n    <div class=\"desc\">Or download from <a href=\"https:\/\/git-scm.com\/download\/win\" target=\"_blank\" rel=\"noopener\">git-scm.com<\/a><\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4><span class=\"tag tag-g\">macOS<\/span><\/h4>\n    <div class=\"cmd\">brew install git<\/div>\n    <div class=\"desc\">Or install Xcode Command Line Tools<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4><span class=\"tag tag-y\">Linux (Debian\/Ubuntu)<\/span><\/h4>\n    <div class=\"cmd\">sudo apt install git<\/div>\n    <div class=\"desc\">Or use your distro&#8217;s package manager<\/div>\n  <\/div>\n<\/div>\n\n<h3>4.2 Initial Configuration<\/h3>\n<pre class=\"code-block\"># Set username (shown in commit history)\ngit config --global user.name \"Your Name\"\n\n# Set email (should match your GitHub\/GitLab registration)\ngit config --global user.email \"you@example.com\"\n\n# Set default branch name to main\ngit config --global init.defaultBranch main\n\n# View current config\ngit config --list\n\n# View a specific config value\ngit config user.name<\/pre>\n\n<div class=\"info-box\">\n  <strong>Tip:<\/strong><code>--global<\/code> applies to all repos. Omit it to set per-repo configuration.\n<\/div>\n\n<!-- Section 5 -->\n<h2 id=\"en-basics\">5. Basics: Create &amp; Commit<\/h2>\n\n<h3>5.1 Create a Repository<\/h3>\n<div class=\"two-col\">\n  <div class=\"col\">\n    <h4><span class=\"tag tag-b\">Method A: git init<\/span> From Scratch<\/h4>\n    <pre class=\"code-block\">cd \/path\/to\/project\ngit init\ngit status<\/pre>\n  <\/div>\n  <div class=\"col\">\n    <h4><span class=\"tag tag-g\">Method B: git clone<\/span> Clone Existing<\/h4>\n    <pre class=\"code-block\"># HTTPS\ngit clone https:\/\/github.com\/user\/repo.git\n\n# SSH\ngit clone git@github.com:user\/repo.git\n\n# Clone to custom folder name\ngit clone https:\/\/... my-project<\/pre>\n  <\/div>\n<\/div>\n\n<h3>5.2 File Lifecycle<\/h3>\n<div class=\"flow-diagram\">\n  <div class=\"flow-row\">\n    <span class=\"flow-item\" style=\"background:var(--muted);color:#fff\">Untracked<\/span>\n    <span class=\"flow-arrow\">\u2192 <code>git add<\/code><\/span>\n    <span class=\"flow-item yellow\">Staged<\/span>\n    <span class=\"flow-arrow\">\u2192 <code>git commit<\/code><\/span>\n    <span class=\"flow-item green\">Committed<\/span>\n  <\/div>\n<\/div>\n\n<div class=\"cmd-grid\">\n  <div class=\"cmd-card\">\n    <h4>git status<\/h4>\n    <div class=\"cmd\">git status<\/div>\n    <div class=\"desc\">Show working tree status: modified files, staged files, untracked files<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git add<\/h4>\n    <div class=\"cmd\">git add .          # Stage all changes\ngit add file.py   # Stage specific file<\/div>\n    <div class=\"desc\">Move files from working dir to staging area<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git commit<\/h4>\n    <div class=\"cmd\">git commit -m &#8220;feat: add login page&#8221;<\/div>\n    <div class=\"desc\">Commit staged changes to local repo. -m specifies the message.<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git diff<\/h4>\n    <div class=\"cmd\">git diff          # Working dir vs staging\ngit diff &#8211;staged # Staging vs last commit<\/div>\n    <div class=\"desc\">View detailed changes in files<\/div>\n  <\/div>\n<\/div>\n\n<h3>5.3 .gitignore<\/h3>\n<p>Specifies files\/directories to <strong>exclude from Git tracking<\/strong>:<\/p>\n<pre class=\"code-block\"># Build artifacts\nnode_modules\/\n__pycache__\/\n*.pyc\nbuild\/\ndist\/\n\n# OS files\n.DS_Store\nThumbs.db\n\n# Environment configs (may contain secrets)\n.env\n.env.local\n\n# IDE configs\n.vscode\/\n.idea\/<\/pre>\n\n<!-- Section 6 -->\n<h2 id=\"en-branch\">6. Branch Management<\/h2>\n<p>Branches are one of Git&#8217;s most powerful features \u2014 enabling <strong>parallel development<\/strong> without interference.<\/p>\n\n<div class=\"cmd-grid\">\n  <div class=\"cmd-card\">\n    <h4>git branch<\/h4>\n    <div class=\"cmd\">git branch              # List local branches\ngit branch -a           # List all (including remote)\ngit branch feature\/api   # Create branch<\/div>\n    <div class=\"desc\">View and create branches (without switching)<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git checkout \/ switch<\/h4>\n    <div class=\"cmd\">git checkout feature\/api     # Switch to branch\ngit switch -c feature\/api   # Create + switch (recommended)<\/div>\n    <div class=\"desc\">Switch working branch. <code>git switch<\/code> is the modern recommended command.<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git merge<\/h4>\n    <div class=\"cmd\">git checkout main\ngit merge feature\/api<\/div>\n    <div class=\"desc\">Merge target branch into current branch<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git branch -d<\/h4>\n    <div class=\"cmd\">git branch -d feature\/api   # Safe delete (merged)\ngit branch -D feature\/api   # Force delete (even unmerged)<\/div>\n    <div class=\"desc\">Delete finished branches to keep things tidy<\/div>\n  <\/div>\n<\/div>\n\n<div class=\"info-box warn\">\n  <strong>Naming convention:<\/strong> Use descriptive names with prefixes: <code>feature\/<\/code>, <code>bugfix\/<\/code> or <code>fix\/<\/code>, <code>hotfix\/<\/code>, <code>docs\/<\/code>, <code>refactor\/<\/code>.\n<\/div>\n\n<!-- Section 7 -->\n<h2 id=\"en-remote\">7. Remote Repositories<\/h2>\n\n<h3>7.1 Link Remote<\/h3>\n<pre class=\"code-block\"># View remotes\ngit remote -v\n\n# Add remote (usually auto-configured by git clone)\ngit remote add origin https:\/\/github.com\/user\/repo.git\n\n# Change remote URL\ngit remote set-url origin https:\/\/new-url\/repo.git<\/pre>\n\n<h3>7.2 Push &amp; Pull<\/h3>\n<div class=\"cmd-grid\">\n  <div class=\"cmd-card\">\n    <h4>git push<\/h4>\n    <div class=\"cmd\">git push origin main       # Push to remote main\ngit push -u origin main     # First push + set tracking\ngit push                     # Shortcut (with tracking)<\/div>\n    <div class=\"desc\">Push local commits to remote<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git pull<\/h4>\n    <div class=\"cmd\">git pull origin main           # Pull + auto-merge\ngit pull &#8211;rebase origin main  # Pull + rebase<\/div>\n    <div class=\"desc\">Fetch remote changes and merge into local<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git fetch<\/h4>\n    <div class=\"cmd\">git fetch origin<\/div>\n    <div class=\"desc\">Download remote data without auto-merging. Good for reviewing before merging.<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git clone<\/h4>\n    <div class=\"cmd\">git clone https:\/\/github.com\/user\/repo.git<\/div>\n    <div class=\"desc\">Clone remote repo locally (auto-creates directory and sets remote)<\/div>\n  <\/div>\n<\/div>\n\n<div class=\"info-box\">\n  <strong>push vs pull vs fetch:<\/strong><code>push<\/code> = local\u2192remote; <code>pull<\/code> = remote\u2192local (auto-merge); <code>fetch<\/code> = remote\u2192local (download only). Always <code>git pull<\/code> before starting work to minimize conflicts.\n<\/div>\n\n<!-- Section 8 -->\n<h2 id=\"en-history\">8. History &amp; Rollback<\/h2>\n\n<div class=\"cmd-grid\">\n  <div class=\"cmd-card\">\n    <h4>git log<\/h4>\n    <div class=\"cmd\">git log &#8211;oneline &#8211;graph\ngit log &#8211;author=&#8221;name&#8221;\ngit log &#8211;since=&#8221;2 weeks ago&#8221;<\/div>\n    <div class=\"desc\">View commit history<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git show<\/h4>\n    <div class=\"cmd\">git show abc1234\ngit show abc1234 &#8211;stat<\/div>\n    <div class=\"desc\">View details of a specific commit<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git reset<\/h4>\n    <div class=\"cmd\">git reset &#8211;soft HEAD~1   # Keep changes staged\ngit reset &#8211;mixed HEAD~1   # Keep changes in working dir\ngit reset &#8211;hard HEAD~1    # Discard all changes (danger!)<\/div>\n    <div class=\"desc\">Undo commits (with varying levels of preservation)<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git revert<\/h4>\n    <div class=\"cmd\">git revert abc1234<\/div>\n    <div class=\"desc\">Create a new commit that undoes a previous commit (safe, doesn&#8217;t rewrite history)<\/div>\n  <\/div>\n<\/div>\n\n<div class=\"info-box danger\">\n  <strong>reset vs revert:<\/strong><code>reset --hard<\/code> rewrites history and <strong>permanently loses<\/strong> code \u2014 only use for local, unpushed commits. <code>revert<\/code> creates a new commit to undo \u2014 safe for pushed\/shared branches.\n<\/div>\n\n<!-- Section 9 -->\n<h2 id=\"en-stash\">9. Stash &amp; Clean<\/h2>\n\n<div class=\"cmd-grid\">\n  <div class=\"cmd-card\">\n    <h4>git stash<\/h4>\n    <div class=\"cmd\">git stash\ngit stash save &#8220;WIP: login form&#8221;\ngit stash list<\/div>\n    <div class=\"desc\">Temporarily save uncommitted changes<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git stash pop \/ apply<\/h4>\n    <div class=\"cmd\">git stash pop            # Restore + remove\ngit stash apply stash@{0} # Restore + keep\ngit stash drop stash@{0}   # Remove stash<\/div>\n    <div class=\"desc\">Restore previously stashed changes<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git clean<\/h4>\n    <div class=\"cmd\">git clean -n    # Preview\ngit clean -f    # Delete untracked files\ngit clean -fd   # Delete files + folders<\/div>\n    <div class=\"desc\">Remove untracked files from working directory<\/div>\n  <\/div>\n<\/div>\n\n<div class=\"info-box\">\n  <strong>Typical scenario:<\/strong>Working on a feature, need to switch to <code>main<\/code> to fix an urgent bug. <code>git stash<\/code> \u2192 <code>git checkout main<\/code> \u2192 fix bug \u2192 <code>git checkout feature<\/code> \u2192 <code>git stash pop<\/code>.\n<\/div>\n\n<!-- Section 10 -->\n<h2 id=\"en-merge\">10. Merge &amp; Conflict Resolution<\/h2>\n\n<h3>10.1 Merge Methods<\/h3>\n<div class=\"cmd-grid\">\n  <div class=\"cmd-card\">\n    <h4>git merge<\/h4>\n    <div class=\"cmd\">git checkout main\ngit merge feature\/api<\/div>\n    <div class=\"desc\">Creates a merge commit node, preserving full branch history<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git rebase<\/h4>\n    <div class=\"cmd\">git checkout feature\/api\ngit rebase main<\/div>\n    <div class=\"desc\">Replays commits on top of target branch for linear history. \u26a0\ufe0f Never rebase shared\/public branches.<\/div>\n  <\/div>\n<\/div>\n\n<h3>10.2 Conflict Resolution<\/h3>\n<p>When two branches modify the <strong>same lines in the same file<\/strong>, Git cannot auto-merge \u2192 CONFLICT.<\/p>\n<ol class=\"steps\">\n  <li>\n    Check conflicted files\n    <span class=\"cmd\">git status<\/span>\n    <span class=\"note\">Shows &#8220;both modified&#8221; for conflicted files<\/span>\n  <\/li>\n  <li>\n    Open conflicted file, find markers\n    <span class=\"note\"><code>&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD<\/code> (your changes), <code>=======<\/code> (divider), <code>&gt;&gt;&gt;&gt;&gt;&gt;&gt; incoming<\/code> (their changes)<\/span>\n  <\/li>\n  <li>\n    Edit to keep correct content, remove all conflict markers\n    <span class=\"note\">VS Code provides visual conflict resolution (Accept Current \/ Incoming \/ Both)<\/span>\n  <\/li>\n  <li>\n    Mark resolved and commit\n    <span class=\"cmd\">git add .&nbsp;&nbsp;git commit -m &#8220;resolve merge conflict&#8221;<\/span>\n  <\/li>\n<\/ol>\n\n<!-- Section 11 -->\n<h2 id=\"en-advanced\">11. Advanced Tips<\/h2>\n\n<div class=\"cmd-grid\">\n  <div class=\"cmd-card\">\n    <h4>git cherry-pick<\/h4>\n    <div class=\"cmd\">git cherry-pick abc1234<\/div>\n    <div class=\"desc\">Apply a specific commit to the current branch without merging the whole branch<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git tag<\/h4>\n    <div class=\"cmd\">git tag v1.0.0\ngit tag -a v1.0.0 -m &#8220;Release 1.0&#8221;\ngit push origin v1.0.0\ngit tag -d v1.0.0<\/div>\n    <div class=\"desc\">Mark release points<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git bisect<\/h4>\n    <div class=\"cmd\">git bisect start\ngit bisect bad\ngit bisect good abc1234<\/div>\n    <div class=\"desc\">Binary search to find the commit that introduced a bug<\/div>\n  <\/div>\n  <div class=\"cmd-card\">\n    <h4>git blame<\/h4>\n    <div class=\"cmd\">git blame file.py\ngit blame -L 10,20 file.py<\/div>\n    <div class=\"desc\">See who last modified each line and when<\/div>\n  <\/div>\n<\/div>\n\n<!-- Section 12 -->\n<h2 id=\"en-workflow\">12. Recommended Workflows<\/h2>\n\n<h3>12.1 Personal Projects<\/h3>\n<div class=\"flow-diagram\">\n  <div class=\"flow-row\">\n    <span class=\"flow-item green\">git pull<\/span>\n    <span class=\"flow-arrow\">\u2192<\/span>\n    <span class=\"flow-item\">Code<\/span>\n    <span class=\"flow-arrow\">\u2192<\/span>\n    <span class=\"flow-item yellow\">git add .<\/span>\n    <span class=\"flow-arrow\">\u2192<\/span>\n    <span class=\"flow-item yellow\">git commit -m<\/span>\n    <span class=\"flow-arrow\">\u2192<\/span>\n    <span class=\"flow-item purple\">git push<\/span>\n  <\/div>\n<\/div>\n\n<h3>12.2 Team Collaboration (Feature Branch Workflow)<\/h3>\n<ol class=\"steps\">\n  <li>\n    Create a feature branch from main\n    <span class=\"cmd\">git checkout main&nbsp;&nbsp;git pull&nbsp;&nbsp;git checkout -b feature\/user-auth<\/span>\n  <\/li>\n  <li>\n    Develop and commit on the feature branch\n    <span class=\"cmd\">git add .&nbsp;&nbsp;git commit -m &#8220;feat: add user authentication&#8221;<\/span>\n    <span class=\"note\">Multiple commits are fine<\/span>\n  <\/li>\n  <li>\n    Push the feature branch to remote\n    <span class=\"cmd\">git push -u origin feature\/user-auth<\/span>\n  <\/li>\n  <li>\n    Create a Pull Request on GitHub\/GitLab\n    <span class=\"note\">Team reviews code, then merges after approval<\/span>\n  <\/li>\n  <li>\n    Delete the feature branch after merge\n    <span class=\"cmd\">git checkout main&nbsp;&nbsp;git pull&nbsp;&nbsp;git branch -d feature\/user-auth<\/span>\n  <\/li>\n<\/ol>\n\n<h3>12.3 Command Cheat Sheet<\/h3>\n<div class=\"table-wrap\">\n<table>\n  <thead>\n    <tr><th>Scenario<\/th><th>Command<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr><td>Init repo<\/td><td><code>git init<\/code><\/td><\/tr>\n    <tr><td>Clone repo<\/td><td><code>git clone &lt;url&gt;<\/code><\/td><\/tr>\n    <tr><td>Check status<\/td><td><code>git status<\/code><\/td><\/tr>\n    <tr><td>Stage changes<\/td><td><code>git add .<\/code><\/td><\/tr>\n    <tr><td>Commit<\/td><td><code>git commit -m \"msg\"<\/code><\/td><\/tr>\n    <tr><td>Push to remote<\/td><td><code>git push<\/code><\/td><\/tr>\n    <tr><td>Pull remote changes<\/td><td><code>git pull<\/code><\/td><\/tr>\n    <tr><td>Create branch<\/td><td><code>git checkout -b &lt;branch&gt;<\/code><\/td><\/tr>\n    <tr><td>Switch branch<\/td><td><code>git checkout &lt;branch&gt;<\/code><\/td><\/tr>\n    <tr><td>Merge branch<\/td><td><code>git merge &lt;branch&gt;<\/code><\/td><\/tr>\n    <tr><td>View log<\/td><td><code>git log --oneline<\/code><\/td><\/tr>\n    <tr><td>Undo last commit (keep changes)<\/td><td><code>git reset --soft HEAD~1<\/code><\/td><\/tr>\n    <tr><td>Revert a commit (safe)<\/td><td><code>git revert &lt;hash&gt;<\/code><\/td><\/tr>\n    <tr><td>Stash changes<\/td><td><code>git stash<\/code><\/td><\/tr>\n    <tr><td>Restore stash<\/td><td><code>git stash pop<\/code><\/td><\/tr>\n  <\/tbody>\n<\/table>\n<\/div>\n\n<\/div><!-- \/en -->\n\n<\/main>\n\n<footer>\n  <div class=\"links\">\n    <a href=\"https:\/\/git-scm.com\/doc\" target=\"_blank\" rel=\"noopener\">Git Official Docs<\/a>\n    <a href=\"https:\/\/git-scm.com\/book\/en\/v2\" target=\"_blank\" rel=\"noopener\">Pro Git Book<\/a>\n    <a href=\"https:\/\/docs.github.com\" target=\"_blank\" rel=\"noopener\">GitHub Docs<\/a>\n    <a href=\"https:\/\/learngitbranching.js.org\/\" target=\"_blank\" rel=\"noopener\">Learn Git Branching<\/a>\n  <\/div>\n  <p>Complete Git Guide \u00b7 Git \u5b8c\u5168\u6559\u7a0b<\/p>\n<\/footer>\n\n<script>\nfunction setLang(lang){\n  document.querySelectorAll('.lang-section').forEach(function(el){el.classList.remove('active')});\n  document.getElementById('lang-'+lang).classList.add('active');\n  document.querySelectorAll('.lang-switch button').forEach(function(btn){btn.classList.remove('active')});\n  document.getElementById('btn-'+lang).classList.add('active');\n  document.documentElement.lang=lang==='zh'?'zh-CN':'en';\n  var p=lang==='zh'?'zh':'en';\n  var h=window.location.hash.replace(\/^#(zh|en)-\/,p+'-');\n  if(h)window.location.hash=h;\n}\nfunction toggleTheme(){\n  var html=document.documentElement;\n  if(html.hasAttribute('data-theme')){html.removeAttribute('data-theme');localStorage.removeItem('theme')}\n  else{html.setAttribute('data-theme','dark');localStorage.setItem('theme','dark')}\n}\n(function(){\n  if(localStorage.getItem('theme')==='dark')document.documentElement.setAttribute('data-theme','dark');\n  var h=window.location.hash;\n  if(h){var t=document.querySelector(h);if(t)setTimeout(function(){t.scrollIntoView({behavior:'smooth'})},100)}\n})();\n<\/script>\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>Git \u5b8c\u5168\u6559\u7a0b \u00b7 Complete Git Guide \u2387 Complete Git Guide \u4e2d\u6587 E [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11,9],"tags":[],"class_list":["post-316","post","type-post","status-publish","format-standard","hentry","category-cad","category-ai"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts\/316","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=316"}],"version-history":[{"count":1,"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts\/316\/revisions"}],"predecessor-version":[{"id":317,"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts\/316\/revisions\/317"}],"wp:attachment":[{"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=316"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=316"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=316"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}