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