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