[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"knowledge-\u002Fapi\u002Fknowledge\u002Fbooklet\u002Fuphold\u002Fgit\u002Fgit-workflow":3,"knowledge-related-\u002Fknowledge\u002Fbooklet\u002Fuphold\u002Fgit\u002Fgit-workflow":1535,"knowledge-series-\u002Fknowledge\u002Fbooklet\u002Fuphold\u002Fgit\u002Fgit-workflow":1558},{"source":4,"connector":5,"page":6},"sqlite","better-sqlite3",{"path":7,"title":8,"description":9,"category":10,"tags":11,"date":13,"pinned":14,"draft":14,"body":15,"seo":1531,"stem":1532,"id":1533,"extension":1534},"\u002Fknowledge\u002Fbooklet\u002Fuphold\u002Fgit\u002Fgit-workflow","Git 基础工作流与协作场景","涵盖日常文件级操作（状态查看、暂存、提交、撤销、删除、重命名）与团队协作中的常见场景示例（个人提交、功能分支开发、同步主分支、误提交撤销等）。","技能小册",[12],"git","2026-07-23",false,{"type":16,"value":17,"toc":1511},"minimark",[18,22,35,40,45,85,91,99,103,146,167,171,218,224,245,254,258,270,290,299,303,338,345,364,368,399,411,415,436,442,474,488,492,677,681,685,688,753,779,783,786,885,894,898,905,910,971,976,1042,1059,1063,1067,1199,1203,1220,1281,1290,1294,1404,1408,1443,1446,1449,1507],[19,20,8],"h1",{"id":21},"git-基础工作流与协作场景",[23,24,25,26,30,31,34],"p",{},"本文分为两部分：第一部分是日常使用中最常用的",[27,28,29],"strong",{},"文件操作命令","（状态查看、暂存、提交、撤销、删除、重命名）；第二部分是团队协作中常见的",[27,32,33],{},"场景化流程","（个人提交、功能分支开发、同步主分支、误提交撤销等），帮助你把命令用在正确的场景里。",[36,37,39],"h2",{"id":38},"一日常文件操作","一、日常文件操作",[41,42,44],"h3",{"id":43},"_1-查看状态","1. 查看状态",[46,47,52],"pre",{"className":48,"code":49,"language":50,"meta":51,"style":51},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","git status          # 完整状态（显示哪些文件被修改、新增、删除）\ngit status -s       # 简洁状态（?? 未跟踪，M 修改，A 新增，D 删除）\n","bash","",[53,54,55,71],"code",{"__ignoreMap":51},[56,57,60,63,67],"span",{"class":58,"line":59},"line",1,[56,61,12],{"class":62},"sbgvK",[56,64,66],{"class":65},"s_sjI"," status",[56,68,70],{"class":69},"sutJx","          # 完整状态（显示哪些文件被修改、新增、删除）\n",[56,72,74,76,78,82],{"class":58,"line":73},2,[56,75,12],{"class":62},[56,77,66],{"class":65},[56,79,81],{"class":80},"stzsN"," -s",[56,83,84],{"class":69},"       # 简洁状态（?? 未跟踪，M 修改，A 新增，D 删除）\n",[23,86,87,90],{},[27,88,89],{},"示例输出","（简洁模式）：",[46,92,97],{"className":93,"code":95,"language":96},[94],"language-text"," M README.md        # 已修改但未暂存\nA  new.txt          # 已新增并已暂存\n?? unknown.txt      # 未跟踪文件\n","text",[53,98,95],{"__ignoreMap":51},[41,100,102],{"id":101},"_2-添加文件到暂存区","2. 添加文件到暂存区",[46,104,106],{"className":48,"code":105,"language":50,"meta":51,"style":51},"git add file.txt          # 添加单个文件\ngit add .                 # 添加当前目录下所有变化（包括新建、修改、删除）\ngit add --all             # 添加所有变化（等价于 git add -A）\n",[53,107,108,121,133],{"__ignoreMap":51},[56,109,110,112,115,118],{"class":58,"line":59},[56,111,12],{"class":62},[56,113,114],{"class":65}," add",[56,116,117],{"class":65}," file.txt",[56,119,120],{"class":69},"          # 添加单个文件\n",[56,122,123,125,127,130],{"class":58,"line":73},[56,124,12],{"class":62},[56,126,114],{"class":65},[56,128,129],{"class":65}," .",[56,131,132],{"class":69},"                 # 添加当前目录下所有变化（包括新建、修改、删除）\n",[56,134,136,138,140,143],{"class":58,"line":135},3,[56,137,12],{"class":62},[56,139,114],{"class":65},[56,141,142],{"class":80}," --all",[56,144,145],{"class":69},"             # 添加所有变化（等价于 git add -A）\n",[147,148,149,157],"ul",{},[150,151,152,153,156],"li",{},"暂存区是下次 ",[53,154,155],{},"commit"," 的内容集合。",[150,158,159,162,163,166],{},[53,160,161],{},"git add"," 后，文件状态变为 ",[53,164,165],{},"staged","（已暂存）。",[41,168,170],{"id":169},"_3-提交到本地仓库","3. 提交到本地仓库",[46,172,174],{"className":48,"code":173,"language":50,"meta":51,"style":51},"git commit -m \"提交说明\"   # 提交暂存区内容\ngit commit -am \"说明\"      # 跳过暂存区，直接提交已跟踪文件的修改（不包含新添加的未跟踪文件）\n",[53,175,176,199],{"__ignoreMap":51},[56,177,178,180,183,186,190,193,196],{"class":58,"line":59},[56,179,12],{"class":62},[56,181,182],{"class":65}," commit",[56,184,185],{"class":80}," -m",[56,187,189],{"class":188},"sjJ54"," \"",[56,191,192],{"class":65},"提交说明",[56,194,195],{"class":188},"\"",[56,197,198],{"class":69},"   # 提交暂存区内容\n",[56,200,201,203,205,208,210,213,215],{"class":58,"line":73},[56,202,12],{"class":62},[56,204,182],{"class":65},[56,206,207],{"class":80}," -am",[56,209,189],{"class":188},[56,211,212],{"class":65},"说明",[56,214,195],{"class":188},[56,216,217],{"class":69},"      # 跳过暂存区，直接提交已跟踪文件的修改（不包含新添加的未跟踪文件）\n",[23,219,220,223],{},[27,221,222],{},"示例","：",[46,225,227],{"className":48,"code":226,"language":50,"meta":51,"style":51},"git commit -m \"fix: 修复登录页面的样式问题\"\n",[53,228,229],{"__ignoreMap":51},[56,230,231,233,235,237,239,242],{"class":58,"line":59},[56,232,12],{"class":62},[56,234,182],{"class":65},[56,236,185],{"class":80},[56,238,189],{"class":188},[56,240,241],{"class":65},"fix: 修复登录页面的样式问题",[56,243,244],{"class":188},"\"\n",[147,246,247],{},[150,248,249,250,253],{},"提交后会生成一个唯一的 commit ID（如 ",[53,251,252],{},"a1b2c3d","），记录版本快照和说明。",[41,255,257],{"id":256},"_4-撤销修改未提交","4. 撤销修改（未提交）",[259,260,262,263,265,266,269],"h4",{"id":261},"撤销工作区的修改还原到最近一次-commit-或-add-的状态","撤销工作区的修改（还原到最近一次 ",[53,264,155],{}," 或 ",[53,267,268],{},"add"," 的状态）",[46,271,273],{"className":48,"code":272,"language":50,"meta":51,"style":51},"git checkout -- file.txt       # 丢弃工作区中对该文件的修改\n",[53,274,275],{"__ignoreMap":51},[56,276,277,279,282,285,287],{"class":58,"line":59},[56,278,12],{"class":62},[56,280,281],{"class":65}," checkout",[56,283,284],{"class":80}," --",[56,286,117],{"class":65},[56,288,289],{"class":69},"       # 丢弃工作区中对该文件的修改\n",[291,292,293],"blockquote",{},[23,294,295,298],{},[27,296,297],{},"注意","：此操作不可恢复，请谨慎使用。",[259,300,302],{"id":301},"将文件从暂存区撤回到工作区保留修改内容","将文件从暂存区撤回到工作区（保留修改内容）",[46,304,306],{"className":48,"code":305,"language":50,"meta":51,"style":51},"git reset HEAD file.txt        # 旧语法\ngit restore --staged file.txt  # Git 2.23+ 推荐\n",[53,307,308,323],{"__ignoreMap":51},[56,309,310,312,315,318,320],{"class":58,"line":59},[56,311,12],{"class":62},[56,313,314],{"class":65}," reset",[56,316,317],{"class":65}," HEAD",[56,319,117],{"class":65},[56,321,322],{"class":69},"        # 旧语法\n",[56,324,325,327,330,333,335],{"class":58,"line":73},[56,326,12],{"class":62},[56,328,329],{"class":65}," restore",[56,331,332],{"class":80}," --staged",[56,334,117],{"class":65},[56,336,337],{"class":69},"  # Git 2.23+ 推荐\n",[23,339,340,341,344],{},"执行后，文件变为 ",[53,342,343],{},"modified","（已修改但未暂存），你可以在工作区继续编辑。",[291,346,347],{},[23,348,349,350,353,354,357,358,363],{},"更完整的提交回退（",[53,351,352],{},"reset --soft\u002F--mixed\u002F--hard","）与安全撤销（",[53,355,356],{},"revert","）说明，见 ",[359,360,362],"a",{"href":361},"\u002Fknowledge\u002Fbooklet\u002Fuphold\u002Fgit\u002Fgit-history","查看历史与撤销","。",[41,365,367],{"id":366},"_5-删除文件","5. 删除文件",[46,369,371],{"className":48,"code":370,"language":50,"meta":51,"style":51},"git rm file.txt           # 删除文件并自动暂存删除操作（git add 的等效）\ngit rm --cached file.txt  # 仅从 Git 中删除跟踪（不再管理），但保留工作区文件\n",[53,372,373,385],{"__ignoreMap":51},[56,374,375,377,380,382],{"class":58,"line":59},[56,376,12],{"class":62},[56,378,379],{"class":65}," rm",[56,381,117],{"class":65},[56,383,384],{"class":69},"           # 删除文件并自动暂存删除操作（git add 的等效）\n",[56,386,387,389,391,394,396],{"class":58,"line":73},[56,388,12],{"class":62},[56,390,379],{"class":65},[56,392,393],{"class":80}," --cached",[56,395,117],{"class":65},[56,397,398],{"class":69},"  # 仅从 Git 中删除跟踪（不再管理），但保留工作区文件\n",[147,400,401],{},[150,402,403,406,407,410],{},[53,404,405],{},"git rm"," 后需要 ",[53,408,409],{},"git commit"," 才能最终从版本库中删除。",[41,412,414],{"id":413},"_6-重命名-移动文件","6. 重命名 \u002F 移动文件",[46,416,418],{"className":48,"code":417,"language":50,"meta":51,"style":51},"git mv old_name new_name   # 重命名文件，自动暂存新旧路径\n",[53,419,420],{"__ignoreMap":51},[56,421,422,424,427,430,433],{"class":58,"line":59},[56,423,12],{"class":62},[56,425,426],{"class":65}," mv",[56,428,429],{"class":65}," old_name",[56,431,432],{"class":65}," new_name",[56,434,435],{"class":69},"   # 重命名文件，自动暂存新旧路径\n",[23,437,438,441],{},[53,439,440],{},"git mv"," 相当于：",[46,443,445],{"className":48,"code":444,"language":50,"meta":51,"style":51},"mv old_name new_name\ngit add new_name\ngit rm old_name\n",[53,446,447,457,465],{"__ignoreMap":51},[56,448,449,452,454],{"class":58,"line":59},[56,450,451],{"class":62},"mv",[56,453,429],{"class":65},[56,455,456],{"class":65}," new_name\n",[56,458,459,461,463],{"class":58,"line":73},[56,460,12],{"class":62},[56,462,114],{"class":65},[56,464,456],{"class":65},[56,466,467,469,471],{"class":58,"line":135},[56,468,12],{"class":62},[56,470,379],{"class":65},[56,472,473],{"class":65}," old_name\n",[23,475,476,477,480,481,484,485,487],{},"执行后使用 ",[53,478,479],{},"git status"," 会看到 ",[53,482,483],{},"renamed"," 状态，直接 ",[53,486,155],{}," 即可完成重命名。",[41,489,491],{"id":490},"_7-典型工作流示例","7. 典型工作流示例",[46,493,495],{"className":48,"code":494,"language":50,"meta":51,"style":51},"# 1. 查看状态\ngit status\n\n# 2. 修改文件并添加\necho \"hello\" >> README.md\ngit add README.md\n\n# 3. 提交\ngit commit -m \"update README\"\n\n# 4. 不小心修改了文件，想撤销\ngit checkout -- README.md\n\n# 5. 删除不需要的文件\ngit rm old.txt\ngit commit -m \"remove old.txt\"\n\n# 6. 重命名文件\ngit mv src\u002Fapp.js src\u002Fmain.js\ngit commit -m \"rename app.js to main.js\"\n",[53,496,497,502,509,515,521,542,551,556,562,578,583,589,600,605,611,621,637,642,648,661],{"__ignoreMap":51},[56,498,499],{"class":58,"line":59},[56,500,501],{"class":69},"# 1. 查看状态\n",[56,503,504,506],{"class":58,"line":73},[56,505,12],{"class":62},[56,507,508],{"class":65}," status\n",[56,510,511],{"class":58,"line":135},[56,512,514],{"emptyLinePlaceholder":513},true,"\n",[56,516,518],{"class":58,"line":517},4,[56,519,520],{"class":69},"# 2. 修改文件并添加\n",[56,522,524,528,530,533,535,539],{"class":58,"line":523},5,[56,525,527],{"class":526},"sptTA","echo",[56,529,189],{"class":188},[56,531,532],{"class":65},"hello",[56,534,195],{"class":188},[56,536,538],{"class":537},"smGrS"," >>",[56,540,541],{"class":65}," README.md\n",[56,543,545,547,549],{"class":58,"line":544},6,[56,546,12],{"class":62},[56,548,114],{"class":65},[56,550,541],{"class":65},[56,552,554],{"class":58,"line":553},7,[56,555,514],{"emptyLinePlaceholder":513},[56,557,559],{"class":58,"line":558},8,[56,560,561],{"class":69},"# 3. 提交\n",[56,563,565,567,569,571,573,576],{"class":58,"line":564},9,[56,566,12],{"class":62},[56,568,182],{"class":65},[56,570,185],{"class":80},[56,572,189],{"class":188},[56,574,575],{"class":65},"update README",[56,577,244],{"class":188},[56,579,581],{"class":58,"line":580},10,[56,582,514],{"emptyLinePlaceholder":513},[56,584,586],{"class":58,"line":585},11,[56,587,588],{"class":69},"# 4. 不小心修改了文件，想撤销\n",[56,590,592,594,596,598],{"class":58,"line":591},12,[56,593,12],{"class":62},[56,595,281],{"class":65},[56,597,284],{"class":80},[56,599,541],{"class":65},[56,601,603],{"class":58,"line":602},13,[56,604,514],{"emptyLinePlaceholder":513},[56,606,608],{"class":58,"line":607},14,[56,609,610],{"class":69},"# 5. 删除不需要的文件\n",[56,612,614,616,618],{"class":58,"line":613},15,[56,615,12],{"class":62},[56,617,379],{"class":65},[56,619,620],{"class":65}," old.txt\n",[56,622,624,626,628,630,632,635],{"class":58,"line":623},16,[56,625,12],{"class":62},[56,627,182],{"class":65},[56,629,185],{"class":80},[56,631,189],{"class":188},[56,633,634],{"class":65},"remove old.txt",[56,636,244],{"class":188},[56,638,640],{"class":58,"line":639},17,[56,641,514],{"emptyLinePlaceholder":513},[56,643,645],{"class":58,"line":644},18,[56,646,647],{"class":69},"# 6. 重命名文件\n",[56,649,651,653,655,658],{"class":58,"line":650},19,[56,652,12],{"class":62},[56,654,426],{"class":65},[56,656,657],{"class":65}," src\u002Fapp.js",[56,659,660],{"class":65}," src\u002Fmain.js\n",[56,662,664,666,668,670,672,675],{"class":58,"line":663},20,[56,665,12],{"class":62},[56,667,182],{"class":65},[56,669,185],{"class":80},[56,671,189],{"class":188},[56,673,674],{"class":65},"rename app.js to main.js",[56,676,244],{"class":188},[36,678,680],{"id":679},"二常见协作场景","二、常见协作场景",[41,682,684],{"id":683},"场景-1个人项目简单提交","场景 1：个人项目简单提交",[23,686,687],{},"适合单人开发的小项目，或对主分支有直接推送权限的场景。",[46,689,691],{"className":48,"code":690,"language":50,"meta":51,"style":51},"# 将所有修改添加到暂存区\ngit add .\n\n# 提交到本地仓库（使用规范的提交信息）\ngit commit -m \"feat: 添加用户登录功能\"\n\n# 推送到远程 main 分支\ngit push origin main\n",[53,692,693,698,707,711,716,731,735,740],{"__ignoreMap":51},[56,694,695],{"class":58,"line":59},[56,696,697],{"class":69},"# 将所有修改添加到暂存区\n",[56,699,700,702,704],{"class":58,"line":73},[56,701,12],{"class":62},[56,703,114],{"class":65},[56,705,706],{"class":65}," .\n",[56,708,709],{"class":58,"line":135},[56,710,514],{"emptyLinePlaceholder":513},[56,712,713],{"class":58,"line":517},[56,714,715],{"class":69},"# 提交到本地仓库（使用规范的提交信息）\n",[56,717,718,720,722,724,726,729],{"class":58,"line":523},[56,719,12],{"class":62},[56,721,182],{"class":65},[56,723,185],{"class":80},[56,725,189],{"class":188},[56,727,728],{"class":65},"feat: 添加用户登录功能",[56,730,244],{"class":188},[56,732,733],{"class":58,"line":544},[56,734,514],{"emptyLinePlaceholder":513},[56,736,737],{"class":58,"line":553},[56,738,739],{"class":69},"# 推送到远程 main 分支\n",[56,741,742,744,747,750],{"class":58,"line":558},[56,743,12],{"class":62},[56,745,746],{"class":65}," push",[56,748,749],{"class":65}," origin",[56,751,752],{"class":65}," main\n",[291,754,755],{},[23,756,757,760,761,767,768,771,772,771,775,778],{},[27,758,759],{},"提示","：提交信息建议遵循 ",[359,762,766],{"href":763,"rel":764},"https:\u002F\u002Fwww.conventionalcommits.org\u002F",[765],"nofollow","Conventional Commits"," 规范，如 ",[53,769,770],{},"feat:","、",[53,773,774],{},"fix:",[53,776,777],{},"docs:"," 等。",[41,780,782],{"id":781},"场景-2基于主分支开发新功能","场景 2：基于主分支开发新功能",[23,784,785],{},"团队协作的标准流程，使用功能分支（feature branch）隔离开发，然后通过 Pull Request (PR) \u002F Merge Request (MR) 合并。",[46,787,789],{"className":48,"code":788,"language":50,"meta":51,"style":51},"# 1. 从主分支创建并切换到新功能分支\ngit checkout -b feature-login\n\n# 2. 进行代码修改（编辑、添加文件等）\n\n# 3. 将修改添加到暂存区并提交\ngit add .\ngit commit -m \"feat: 实现登录页面\"\n\n# 4. 将新分支推送到远程仓库（并设置上游跟踪）\ngit push -u origin feature-login\n\n# 5. 在 GitHub \u002F GitLab 上发起 Pull Request (PR) 或 Merge Request (MR)\n# 等待 Code Review 和 CI 检查通过后，由维护者合并到 main 分支\n",[53,790,791,796,808,812,817,821,826,834,849,853,858,871,875,880],{"__ignoreMap":51},[56,792,793],{"class":58,"line":59},[56,794,795],{"class":69},"# 1. 从主分支创建并切换到新功能分支\n",[56,797,798,800,802,805],{"class":58,"line":73},[56,799,12],{"class":62},[56,801,281],{"class":65},[56,803,804],{"class":80}," -b",[56,806,807],{"class":65}," feature-login\n",[56,809,810],{"class":58,"line":135},[56,811,514],{"emptyLinePlaceholder":513},[56,813,814],{"class":58,"line":517},[56,815,816],{"class":69},"# 2. 进行代码修改（编辑、添加文件等）\n",[56,818,819],{"class":58,"line":523},[56,820,514],{"emptyLinePlaceholder":513},[56,822,823],{"class":58,"line":544},[56,824,825],{"class":69},"# 3. 将修改添加到暂存区并提交\n",[56,827,828,830,832],{"class":58,"line":553},[56,829,12],{"class":62},[56,831,114],{"class":65},[56,833,706],{"class":65},[56,835,836,838,840,842,844,847],{"class":58,"line":558},[56,837,12],{"class":62},[56,839,182],{"class":65},[56,841,185],{"class":80},[56,843,189],{"class":188},[56,845,846],{"class":65},"feat: 实现登录页面",[56,848,244],{"class":188},[56,850,851],{"class":58,"line":564},[56,852,514],{"emptyLinePlaceholder":513},[56,854,855],{"class":58,"line":580},[56,856,857],{"class":69},"# 4. 将新分支推送到远程仓库（并设置上游跟踪）\n",[56,859,860,862,864,867,869],{"class":58,"line":585},[56,861,12],{"class":62},[56,863,746],{"class":65},[56,865,866],{"class":80}," -u",[56,868,749],{"class":65},[56,870,807],{"class":65},[56,872,873],{"class":58,"line":591},[56,874,514],{"emptyLinePlaceholder":513},[56,876,877],{"class":58,"line":602},[56,878,879],{"class":69},"# 5. 在 GitHub \u002F GitLab 上发起 Pull Request (PR) 或 Merge Request (MR)\n",[56,881,882],{"class":58,"line":607},[56,883,884],{"class":69},"# 等待 Code Review 和 CI 检查通过后，由维护者合并到 main 分支\n",[291,886,887],{},[23,888,889,890,363],{},"分支相关命令（创建、切换、删除、合并）详见 ",[359,891,893],{"href":892},"\u002Fknowledge\u002Fbooklet\u002Fuphold\u002Fgit\u002Fgit-branching","分支与标签管理",[41,895,897],{"id":896},"场景-3同步远程-main-的最新代码到当前分支","场景 3：同步远程 main 的最新代码到当前分支",[23,899,900,901,904],{},"当其他开发者已向 ",[53,902,903],{},"main"," 推送了新代码，你需要将这些更新合并到你正在工作的功能分支中。",[23,906,907],{},[27,908,909],{},"方式一：使用 merge（产生一个合并提交）",[46,911,913],{"className":48,"code":912,"language":50,"meta":51,"style":51},"# 确保当前在功能分支\ngit checkout feature-login\n\n# 获取远程最新提交（不自动合并）\ngit fetch origin\n\n# 将远程 main 合并到当前分支\ngit merge origin\u002Fmain\n# 如有冲突，解决后 git add . && git commit\n",[53,914,915,920,928,932,937,947,951,956,966],{"__ignoreMap":51},[56,916,917],{"class":58,"line":59},[56,918,919],{"class":69},"# 确保当前在功能分支\n",[56,921,922,924,926],{"class":58,"line":73},[56,923,12],{"class":62},[56,925,281],{"class":65},[56,927,807],{"class":65},[56,929,930],{"class":58,"line":135},[56,931,514],{"emptyLinePlaceholder":513},[56,933,934],{"class":58,"line":517},[56,935,936],{"class":69},"# 获取远程最新提交（不自动合并）\n",[56,938,939,941,944],{"class":58,"line":523},[56,940,12],{"class":62},[56,942,943],{"class":65}," fetch",[56,945,946],{"class":65}," origin\n",[56,948,949],{"class":58,"line":544},[56,950,514],{"emptyLinePlaceholder":513},[56,952,953],{"class":58,"line":553},[56,954,955],{"class":69},"# 将远程 main 合并到当前分支\n",[56,957,958,960,963],{"class":58,"line":558},[56,959,12],{"class":62},[56,961,962],{"class":65}," merge",[56,964,965],{"class":65}," origin\u002Fmain\n",[56,967,968],{"class":58,"line":564},[56,969,970],{"class":69},"# 如有冲突，解决后 git add . && git commit\n",[23,972,973],{},[27,974,975],{},"方式二：使用 rebase（保持线性历史，更干净）",[46,977,979],{"className":48,"code":978,"language":50,"meta":51,"style":51},"git checkout feature-login\n\n# 拉取远程 main 并变基\ngit fetch origin\ngit rebase origin\u002Fmain\n\n# 如果出现冲突，解决后 git add . && git rebase --continue\n# 变基完成后，由于历史改变，需要强制推送（若已推送过）\ngit push --force-with-lease origin feature-login\n",[53,980,981,989,993,998,1006,1015,1019,1024,1029],{"__ignoreMap":51},[56,982,983,985,987],{"class":58,"line":59},[56,984,12],{"class":62},[56,986,281],{"class":65},[56,988,807],{"class":65},[56,990,991],{"class":58,"line":73},[56,992,514],{"emptyLinePlaceholder":513},[56,994,995],{"class":58,"line":135},[56,996,997],{"class":69},"# 拉取远程 main 并变基\n",[56,999,1000,1002,1004],{"class":58,"line":517},[56,1001,12],{"class":62},[56,1003,943],{"class":65},[56,1005,946],{"class":65},[56,1007,1008,1010,1013],{"class":58,"line":523},[56,1009,12],{"class":62},[56,1011,1012],{"class":65}," rebase",[56,1014,965],{"class":65},[56,1016,1017],{"class":58,"line":544},[56,1018,514],{"emptyLinePlaceholder":513},[56,1020,1021],{"class":58,"line":553},[56,1022,1023],{"class":69},"# 如果出现冲突，解决后 git add . && git rebase --continue\n",[56,1025,1026],{"class":58,"line":558},[56,1027,1028],{"class":69},"# 变基完成后，由于历史改变，需要强制推送（若已推送过）\n",[56,1030,1031,1033,1035,1038,1040],{"class":58,"line":564},[56,1032,12],{"class":62},[56,1034,746],{"class":65},[56,1036,1037],{"class":80}," --force-with-lease",[56,1039,749],{"class":65},[56,1041,807],{"class":65},[291,1043,1044],{},[23,1045,1046,1049,1050,1053,1054,1056,1057,363],{},[27,1047,1048],{},"选择建议","：个人或小团队可以使用 ",[53,1051,1052],{},"rebase"," 保持历史整洁；公共分支上已推送的提交尽量避免 ",[53,1055,1052],{},"（除非团队约定）。若合并时出现冲突，解决步骤见 ",[359,1058,362],{"href":361},[41,1060,1062],{"id":1061},"场景-4误提交到-main需要撤销","场景 4：误提交到 main，需要撤销",[259,1064,1066],{"id":1065},"情况一尚未推送到远程","情况一：尚未推送到远程",[46,1068,1070],{"className":48,"code":1069,"language":50,"meta":51,"style":51},"# 1. 撤销最近一次提交（保留修改在暂存区）\ngit reset --soft HEAD~1\n\n# 2. 暂存当前的修改（可选，为了切换到正确分支）\ngit stash\n\n# 3. 创建正确的功能分支\ngit switch -c correct-branch\n\n# 4. 恢复暂存的修改\ngit stash pop\n\n# 5. 添加并提交到正确分支\ngit add .\ngit commit -m \"feat: 正确的功能\"\n\n# 6. 后续推送新分支\ngit push -u origin correct-branch\n",[53,1071,1072,1077,1089,1093,1098,1105,1109,1114,1127,1131,1136,1146,1150,1155,1163,1178,1182,1187],{"__ignoreMap":51},[56,1073,1074],{"class":58,"line":59},[56,1075,1076],{"class":69},"# 1. 撤销最近一次提交（保留修改在暂存区）\n",[56,1078,1079,1081,1083,1086],{"class":58,"line":73},[56,1080,12],{"class":62},[56,1082,314],{"class":65},[56,1084,1085],{"class":80}," --soft",[56,1087,1088],{"class":65}," HEAD~1\n",[56,1090,1091],{"class":58,"line":135},[56,1092,514],{"emptyLinePlaceholder":513},[56,1094,1095],{"class":58,"line":517},[56,1096,1097],{"class":69},"# 2. 暂存当前的修改（可选，为了切换到正确分支）\n",[56,1099,1100,1102],{"class":58,"line":523},[56,1101,12],{"class":62},[56,1103,1104],{"class":65}," stash\n",[56,1106,1107],{"class":58,"line":544},[56,1108,514],{"emptyLinePlaceholder":513},[56,1110,1111],{"class":58,"line":553},[56,1112,1113],{"class":69},"# 3. 创建正确的功能分支\n",[56,1115,1116,1118,1121,1124],{"class":58,"line":558},[56,1117,12],{"class":62},[56,1119,1120],{"class":65}," switch",[56,1122,1123],{"class":80}," -c",[56,1125,1126],{"class":65}," correct-branch\n",[56,1128,1129],{"class":58,"line":564},[56,1130,514],{"emptyLinePlaceholder":513},[56,1132,1133],{"class":58,"line":580},[56,1134,1135],{"class":69},"# 4. 恢复暂存的修改\n",[56,1137,1138,1140,1143],{"class":58,"line":585},[56,1139,12],{"class":62},[56,1141,1142],{"class":65}," stash",[56,1144,1145],{"class":65}," pop\n",[56,1147,1148],{"class":58,"line":591},[56,1149,514],{"emptyLinePlaceholder":513},[56,1151,1152],{"class":58,"line":602},[56,1153,1154],{"class":69},"# 5. 添加并提交到正确分支\n",[56,1156,1157,1159,1161],{"class":58,"line":607},[56,1158,12],{"class":62},[56,1160,114],{"class":65},[56,1162,706],{"class":65},[56,1164,1165,1167,1169,1171,1173,1176],{"class":58,"line":613},[56,1166,12],{"class":62},[56,1168,182],{"class":65},[56,1170,185],{"class":80},[56,1172,189],{"class":188},[56,1174,1175],{"class":65},"feat: 正确的功能",[56,1177,244],{"class":188},[56,1179,1180],{"class":58,"line":623},[56,1181,514],{"emptyLinePlaceholder":513},[56,1183,1184],{"class":58,"line":639},[56,1185,1186],{"class":69},"# 6. 后续推送新分支\n",[56,1188,1189,1191,1193,1195,1197],{"class":58,"line":644},[56,1190,12],{"class":62},[56,1192,746],{"class":65},[56,1194,866],{"class":80},[56,1196,749],{"class":65},[56,1198,1126],{"class":65},[259,1200,1202],{"id":1201},"情况二已经推送到远程-main公共分支","情况二：已经推送到远程 main（公共分支）",[23,1204,1205,1212,1213,1216,1217,1219],{},[27,1206,1207,1208,1211],{},"务必不要使用 ",[53,1209,1210],{},"git reset"," 改写公共历史","，应使用 ",[53,1214,1215],{},"git revert"," 反向撤销，安全且不影响协作者（原理见 ",[359,1218,362],{"href":361},"）。",[46,1221,1223],{"className":48,"code":1222,"language":50,"meta":51,"style":51},"# 1. 找到误提交的 commit hash（假设为 abc123）\ngit log --oneline\n\n# 2. 创建一个抵消该提交的新提交\ngit revert abc123 --no-edit\n\n# 3. 推送撤销后的结果\ngit push origin main\n",[53,1224,1225,1230,1240,1244,1249,1262,1266,1271],{"__ignoreMap":51},[56,1226,1227],{"class":58,"line":59},[56,1228,1229],{"class":69},"# 1. 找到误提交的 commit hash（假设为 abc123）\n",[56,1231,1232,1234,1237],{"class":58,"line":73},[56,1233,12],{"class":62},[56,1235,1236],{"class":65}," log",[56,1238,1239],{"class":80}," --oneline\n",[56,1241,1242],{"class":58,"line":135},[56,1243,514],{"emptyLinePlaceholder":513},[56,1245,1246],{"class":58,"line":517},[56,1247,1248],{"class":69},"# 2. 创建一个抵消该提交的新提交\n",[56,1250,1251,1253,1256,1259],{"class":58,"line":523},[56,1252,12],{"class":62},[56,1254,1255],{"class":65}," revert",[56,1257,1258],{"class":65}," abc123",[56,1260,1261],{"class":80}," --no-edit\n",[56,1263,1264],{"class":58,"line":544},[56,1265,514],{"emptyLinePlaceholder":513},[56,1267,1268],{"class":58,"line":553},[56,1269,1270],{"class":69},"# 3. 推送撤销后的结果\n",[56,1272,1273,1275,1277,1279],{"class":58,"line":558},[56,1274,12],{"class":62},[56,1276,746],{"class":65},[56,1278,749],{"class":65},[56,1280,752],{"class":65},[23,1282,1283,1285,1286,1289],{},[53,1284,1215],{}," 会生成一个新的提交，其内容正好是误提交的逆操作，其他开发者正常 ",[53,1287,1288],{},"git pull"," 即可同步。",[36,1291,1293],{"id":1292},"三场景与命令总结","三、场景与命令总结",[1295,1296,1297,1313],"table",{},[1298,1299,1300],"thead",{},[1301,1302,1303,1307,1310],"tr",{},[1304,1305,1306],"th",{},"场景",[1304,1308,1309],{},"核心命令",[1304,1311,1312],{},"注意事项",[1314,1315,1316,1337,1361,1383],"tbody",{},[1301,1317,1318,1322,1334],{},[1319,1320,1321],"td",{},"简单提交",[1319,1323,1324,1327,1328,1327,1331],{},[53,1325,1326],{},"git add ."," → ",[53,1329,1330],{},"git commit -m \"...\"",[53,1332,1333],{},"git push",[1319,1335,1336],{},"确保当前分支正确",[1301,1338,1339,1342,1351],{},[1319,1340,1341],{},"功能分支开发",[1319,1343,1344,1327,1347,1350],{},[53,1345,1346],{},"git checkout -b",[53,1348,1349],{},"git push -u origin"," → 创建 PR",[1319,1352,1353,1354,771,1357,1360],{},"分支命名可包含 ",[53,1355,1356],{},"feature\u002F",[53,1358,1359],{},"fix\u002F"," 前缀",[1301,1362,1363,1366,1377],{},[1319,1364,1365],{},"同步远程 main",[1319,1367,1368,1327,1371,265,1374],{},[53,1369,1370],{},"git fetch origin",[53,1372,1373],{},"git merge origin\u002Fmain",[53,1375,1376],{},"git rebase origin\u002Fmain",[1319,1378,1379,1380,1382],{},"公共分支上避免 ",[53,1381,1052],{}," 已推送的提交",[1301,1384,1385,1388,1398],{},[1319,1386,1387],{},"误提交到 main",[1319,1389,1390,1391,1394,1395],{},"未推送：",[53,1392,1393],{},"git reset --soft HEAD~1"," + 重建分支；已推送：",[53,1396,1397],{},"git revert \u003Chash>",[1319,1399,1400,1403],{},[27,1401,1402],{},"已推送禁止用 reset","，使用 revert 安全撤销",[36,1405,1407],{"id":1406},"四注意事项","四、注意事项",[147,1409,1410,1423,1440],{},[150,1411,1412,771,1415,1418,1419,1422],{},[53,1413,1414],{},"git checkout -- \u003Cfile>",[53,1416,1417],{},"git reset --hard"," 等命令",[27,1420,1421],{},"不可逆","，操作前请确认改动已备份或确实不需要。",[150,1424,1425,1426,1428,1429,771,1431,771,1434,1437,1438,363],{},"已推送到公共分支（如 ",[53,1427,903],{},"）的提交，避免使用 ",[53,1430,1052],{},[53,1432,1433],{},"reset",[53,1435,1436],{},"amend"," 改写历史，优先用 ",[53,1439,356],{},[150,1441,1442],{},"团队协作中，提交信息建议统一规范（如 Conventional Commits），便于自动生成 changelog 与代码追溯。",[23,1444,1445],{},"掌握本文的日常操作与协作场景，即可高效地进行版本管理与团队协作。",[36,1447,1448],{"id":1448},"参考文献",[1295,1450,1451,1460],{},[1298,1452,1453],{},[1301,1454,1455,1458],{},[1304,1456,1457],{},"资料",[1304,1459,212],{},[1314,1461,1462,1474,1486,1496],{},[1301,1463,1464,1471],{},[1319,1465,1466],{},[359,1467,1470],{"href":1468,"rel":1469},"https:\u002F\u002Fgit-scm.com\u002Fbook\u002Fen\u002Fv2",[765],"Pro Git",[1319,1472,1473],{},"官方书",[1301,1475,1476,1483],{},[1319,1477,1478],{},[359,1479,1482],{"href":1480,"rel":1481},"https:\u002F\u002Fgit-scm.com\u002Fdocs",[765],"Git 文档",[1319,1484,1485],{},"命令",[1301,1487,1488,1493],{},[1319,1489,1490],{},[359,1491,766],{"href":763,"rel":1492},[765],[1319,1494,1495],{},"提交信息规范",[1301,1497,1498,1504],{},[1319,1499,1500],{},[359,1501,1503],{"href":1502},"\u002Fknowledge\u002Fbooklet\u002Fuphold","运维导读",[1319,1505,1506],{},"学习路径",[1508,1509,1510],"style",{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--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 .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sptTA, html code.shiki .sptTA{--shiki-light:#6182B8;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}",{"title":51,"searchDepth":73,"depth":73,"links":1512},[1513,1522,1528,1529,1530],{"id":38,"depth":73,"text":39,"children":1514},[1515,1516,1517,1518,1519,1520,1521],{"id":43,"depth":135,"text":44},{"id":101,"depth":135,"text":102},{"id":169,"depth":135,"text":170},{"id":256,"depth":135,"text":257},{"id":366,"depth":135,"text":367},{"id":413,"depth":135,"text":414},{"id":490,"depth":135,"text":491},{"id":679,"depth":73,"text":680,"children":1523},[1524,1525,1526,1527],{"id":683,"depth":135,"text":684},{"id":781,"depth":135,"text":782},{"id":896,"depth":135,"text":897},{"id":1061,"depth":135,"text":1062},{"id":1292,"depth":73,"text":1293},{"id":1406,"depth":73,"text":1407},{"id":1448,"depth":73,"text":1448},{"title":8,"description":9},"knowledge\u002Fbooklet\u002Fuphold\u002FGit\u002Fgit-workflow","knowledge\u002Fknowledge\u002Fbooklet\u002Fuphold\u002FGit\u002Fgit-workflow.md","md",{"items":1536},[1537,1540,1543,1547,1551,1554],{"path":892,"title":1538,"description":1539,"category":10,"score":544},"Git 分支、远程协作与标签管理","涵盖分支的创建、切换、合并与删除，远程仓库的管理、推送与拉取，以及标签（Tag）的创建、查看、推送与删除，是团队协作的核心内容。",{"path":361,"title":1541,"description":1542,"category":10,"score":544},"Git 查看历史、撤销回退与冲突解决","涵盖 git log \u002F git diff 查看提交历史与差异，commit --amend \u002F reset \u002F revert 的撤销与回退方式对比，以及合并、拉取、变基时冲突的产生原因与解决步骤。",{"path":1544,"title":1545,"description":1546,"category":10,"score":544},"\u002Fknowledge\u002Fbooklet\u002Fuphold\u002Fgit\u002Fgit-intro","Git 基础概念与命令速查","Git 是目前最流行的分布式版本控制系统。本文介绍工作区\u002F暂存区\u002F仓库等核心概念、文件状态流转，并附上日常开发最常用的命令速查表，适合入门学习与日常查阅。",{"path":1548,"title":1549,"description":1550,"category":10,"score":544},"\u002Fknowledge\u002Fbooklet\u002Fuphold\u002Fgit\u002Fgit-setup","Git 安装、配置与仓库初始化","涵盖 Windows \u002F macOS \u002F Linux 下 Git 的安装方式、首次使用的全局配置（用户名、邮箱、别名等）、创建或克隆仓库的方式，以及 .gitignore 忽略规则的编写方法。",{"path":1502,"title":1552,"description":1553,"category":10,"score":517},"运维与协作导读","本目录覆盖日常开发运维中的 Git 版本控制、Docker 容器化与 Nginx 服务网关，与 工程化 · Git、部署相关 等章节互补，提供完整的十阶段学习路径。",{"path":1555,"title":1556,"description":1557,"category":10,"score":517},"\u002Fknowledge\u002Fbooklet\u002Fproject\u002Fproject\u002Fgit","Git 配置","版本控制常用 .gitignore（忽略不需纳入仓库的文件）与 .gitattributes（统一换行、diff、合并策略等）。见 工程化概览。",{"series":1559,"title":12,"items":1560,"index":517,"prev":1566,"next":1567},"booklet\u002Fuphold\u002Fgit",[1561,1562,1563,1564,1565],{"path":892,"title":1538,"date":13,"pinned":14},{"path":361,"title":1541,"date":13,"pinned":14},{"path":1544,"title":1545,"date":13,"pinned":14},{"path":1548,"title":1549,"date":13,"pinned":14},{"path":7,"title":8,"date":13,"pinned":14},{"path":1548,"title":1549,"date":13,"pinned":14},null]