[{"data":1,"prerenderedAt":3602},["ShallowReactive",2],{"blog:\u002Fblog\u002Fgit\u002Fnote":3},{"id":4,"title":5,"author":6,"body":7,"category":3587,"date":3588,"description":3589,"draft":3590,"extension":3591,"image":3592,"meta":3593,"navigation":3594,"path":3595,"seo":3596,"series":3592,"seriesOrder":3592,"seriesTitle":3592,"stem":3597,"tags":3598,"updatedAt":3600,"__hash__":3601},"blog\u002Fblog\u002Fgit\u002Fnote.md","Git 筆記","charles",{"type":8,"value":9,"toc":3505},"minimark",[10,15,22,40,51,61,71,75,79,88,95,102,106,111,116,133,138,149,225,229,249,253,266,269,278,281,289,318,330,339,348,351,355,358,379,381,384,388,396,404,409,412,417,506,512,517,533,548,631,635,651,657,661,665,672,678,685,691,698,704,711,715,718,724,734,740,747,753,757,764,771,775,778,847,850,856,858,1049,1054,1061,1066,1099,1102,1106,1110,1113,1138,1147,1153,1161,1167,1172,1181,1186,1189,1195,1210,1217,1234,1238,1245,1343,1354,1359,1382,1384,1390,1395,1398,1401,1406,1409,1427,1432,1435,1442,1448,1451,1454,1458,1472,1476,1494,1504,1509,1512,1523,1526,1534,1537,1540,1543,1547,1553,1556,1560,1567,1586,1604,1612,1615,1624,1634,1637,1641,1697,1701,1744,1748,1770,1774,1777,1781,1790,1800,1810,1814,1818,1854,1858,1870,1874,1896,1902,1916,1920,1934,1938,1943,1954,1964,1968,1973,1987,1993,1997,2002,2020,2024,2030,2033,2036,2040,2044,2053,2056,2088,2093,2098,2130,2134,2137,2151,2160,2164,2758,2762,2767,2770,2926,2928,3046,3059,3061,3108,3111,3218,3220,3328,3330,3366,3368,3465,3467,3501],[11,12,14],"h2",{"id":13},"參考教學","參考教學：",[16,17,18],"blockquote",{},[19,20,21],"p",{},"此篇 HackMD 筆記以 Git 2.38.1 為基準，因此會有像是 switch、restore 等新指令用法",[16,23,24],{},[19,25,26,27,32,33,39],{},"前半段的示範教學較多，後半段多為整理常用指令，可以搭配 ",[28,29,31],"a",{"href":30},"#git-command%E7%B8%BD%E8%A6%BD","git command"," 查看，透過",[28,34,38],{"href":35,"rel":36},"https:\u002F\u002Fw3c.hexschool.com\u002Fgit\u002Fcfdbd310",[37],"nofollow","🔗W3Hexschool - Git & GitHub 教學手冊","輔助學習",[16,41,42],{},[19,43,44,45,50],{},"另外可以善用",[28,46,49],{"href":47,"rel":48},"https:\u002F\u002Flearngitbranching.js.org\u002F?locale=zh_TW",[37],"🔗Learn Git Branching"," 線上練習 Git 管理操作",[16,52,53],{},[19,54,55,56],{},"最完整實例的",[28,57,60],{"href":58,"rel":59},"https:\u002F\u002Fgitbook.tw\u002F",[37],"🔗繁中 Git 教學",[16,62,63],{},[19,64,65,66],{},"使用 VS Code 開發可以參考此教學",[28,67,70],{"href":68,"rel":69},"https:\u002F\u002Fwww.roboleary.net\u002Fvscode\u002F2020\u002F09\u002F15\u002Fvscode-git.html",[37],"🔗進行初始設定",[11,72,74],{"id":73},"認識-git-github","認識 Git & GitHub",[76,77,78],"h4",{"id":78},"如何備份程式碼",[16,80,81],{},[19,82,83],{},[84,85],"img",{"alt":86,"src":87},"","https:\u002F\u002Fhackmd.io\u002F_uploads\u002FSkKfTwjWa.jpg",[16,89,90],{},[19,91,92],{},[84,93],{"alt":86,"src":94},"https:\u002F\u002Fhackmd.io\u002F_uploads\u002Frku5tvo-T.png",[16,96,97],{},[19,98,99],{},[84,100],{"alt":86,"src":101},"https:\u002F\u002Fhackmd.io\u002F_uploads\u002FB18YUwjWp.png",[11,103,105],{"id":104},"git-概念","Git 概念",[19,107,108],{},[84,109],{"alt":86,"src":110},"https:\u002F\u002Fi.imgur.com\u002FRrc1c69.png",[112,113,115],"h3",{"id":114},"working-directory-跟-worktree-的差別","working directory 跟 worktree 的差別",[16,117,118,121,124,127,130],{},[19,119,120],{},"在中文的 Git 文章容易看到 \"工作目錄\"",[19,122,123],{},"有時指的是 working directory",[19,125,126],{},"有時卻是 worktree",[19,128,129],{},"可以理解為中文廣義跟狹義的差別",[19,131,132],{},"worktree 包含 working directory + stage",[19,134,135],{},[84,136],{"alt":86,"src":137},"https:\u002F\u002Fi.imgur.com\u002F6glonJ7.png",[16,139,140,143,146],{},[19,141,142],{},"每一次提交會產生 snapshot 與對應的 hash 值",[19,144,145],{},"口語上我們可能會聽到用 \"commit 紀錄\"、\"commit 節點\" 來稱呼 snapshot",[19,147,148],{},"這是因為每一個節點都是 snapshot，由 snapshots 組成 branch",[150,151,152,164,175,198,209,217],"ul",{},[153,154,155,156],"li",{},"工作目錄 (狹義) (workdir、wd)",[16,157,158,161],{},[19,159,160],{},"當前實際進行編輯文件的資料夾位置，亦稱作工作區域",[19,162,163],{},"即 VS Code 檔案總管開啟的 \"資料夾\" 或 \"工作區\"",[153,165,166,167],{},"暫存區 (stage、index、staging area、.git\u002Findex)",[16,168,169,172],{},[19,170,171],{},"git 管理該專案暫存變更的對照清單，紀錄目前程式碼跟上個版本的所有差異，亦稱作暫存區",[19,173,174],{},"若使用 VS Code 或 IDE，會在原始檔控制 (Source Control) 呈現，以圖形化檢視與編輯",[153,176,177,178,189],{},"工作目錄 (廣義) (work tree)",[16,179,180,183,186],{},[19,181,182],{},"work tree 是一個抽象的概念，他讓編輯的工作區域可以虛擬出來",[19,184,185],{},"我可以在同一個專案中，開設不同的 work tree",[19,187,188],{},"他們可以完全獨立的去處理檔案的修改、commit、在不同 branch 中切換變更",[16,190,191],{},[19,192,193,194],{},"關於同一個專案為什麼可以同時用不同 work tree 編輯而不會互相干擾？\n",[28,195,196],{"href":196,"rel":197},"https:\u002F\u002Fchat.openai.com\u002Fshare\u002Fc57b02c6-18c5-4884-8f71-97e71a8dc0a9",[37],[153,199,200,201],{},"數據庫 (Repository、Repo)",[16,202,203,206],{},[19,204,205],{},"通常一個 Repo 為一個或多個專案，以程式碼跟說明檔為主的檔案庫",[19,207,208],{},"數據庫由 branch (分支) 組成，每個 Repo 會有一個預設的 Branch，也可以新增更多 Branch 來分類",[153,210,211,212],{},"本地數據庫 (Local Repo)",[16,213,214],{},[19,215,216],{},"git 在當前作業系統中保存的 Repo",[153,218,219,220],{},"遠端數據庫 (Remote Repo)",[16,221,222],{},[19,223,224],{},"如 Github、GitLab 等，用於個人專案版本控制或團隊協作開發專案，方便共同更新與同步數據庫，或是開源讓任何人共同維護、更新專案",[112,226,228],{"id":227},"以下將使用簡稱","以下將使用簡稱：",[150,230,231,234,237,240,243,246],{},[153,232,233],{},"workdir",[153,235,236],{},"stage",[153,238,239],{},"worktree",[153,241,242],{},"branch",[153,244,245],{},"Local Repo",[153,247,248],{},"Remote Repo",[11,250,252],{"id":251},"git-操作","Git 操作",[16,254,255,258],{},[19,256,257],{},"操作 Git 需要有基本 Terminal 能力，以 Linux 為例包含 cd、mkdir 等",[19,259,260,261],{},"可參考 ",[28,262,265],{"href":263,"rel":264},"https:\u002F\u002Fhackmd.io\u002F@Charles5277\u002Fr19yxcQni\u002F%2FBB6KG8NCTQ-1Ps2KRr82AA",[37],"Linux - Ubuntu 操作筆記教學",[112,267,268],{"id":268},"安裝",[16,270,271],{},[19,272,273],{},[28,274,277],{"href":275,"rel":276},"https:\u002F\u002Fgit-scm.com\u002Fdownloads",[37],"🔗Git 官網安裝",[19,279,280],{},"Windows 也可以透過 winget 安裝",[16,282,283,286],{},[19,284,285],{},"打開終端機 \u002F 命令提示字元 \u002F 終端機",[19,287,288],{},"執行以下指令",[290,291,295],"pre",{"className":292,"code":293,"language":294,"meta":86,"style":86},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","winget install Git.Git -i\n","bash",[296,297,298],"code",{"__ignoreMap":86},[299,300,303,307,311,314],"span",{"class":301,"line":302},"line",1,[299,304,306],{"class":305},"sbgvK","winget",[299,308,310],{"class":309},"s_sjI"," install",[299,312,313],{"class":309}," Git.Git",[299,315,317],{"class":316},"stzsN"," -i\n",[16,319,320,325],{},[19,321,322],{},[84,323],{"alt":86,"src":324},"https:\u002F\u002Fhackmd.io\u002F_uploads\u002FHkh4Nw5ba.png",[19,326,327],{},[84,328],{"alt":86,"src":329},"https:\u002F\u002Fhackmd.io\u002F_uploads\u002FHJtuEPqb6.png",[16,331,332],{},[19,333,334],{},[28,335,338],{"href":336,"rel":337},"https:\u002F\u002Fw3c.hexschool.com\u002Fgit\u002Ffd6f6be",[37],"🔗Mac 安裝 Git 教學",[16,340,341],{},[19,342,343,344,347],{},"使用 ",[296,345,346],{},"git --version"," 確認是否安裝成功",[349,350],"hr",{},[11,352,354],{"id":353},"建議安裝的-vs-code-extension","建議安裝的 VS Code Extension",[19,356,357],{},"搭配 VS Code 進行 Git 的操作會方便許多，我們可以安裝以下套件，讓提交的歷史紀錄以圖形化顯示",[150,359,360],{},[153,361,362,367],{},[28,363,366],{"href":364,"rel":365},"https:\u002F\u002Fmarketplace.visualstudio.com\u002Fitems?itemName=mhutchie.git-graph",[37],"Git Graph",[150,368,369],{},[153,370,371,372],{},"以圖像化表示 branch 跟 commit 紀錄，方便直觀進行 git command 快捷操作\n",[16,373,374],{},[19,375,376],{},[84,377],{"alt":86,"src":378},"https:\u002F\u002Fi.imgur.com\u002FLiAIhw1.png",[349,380],{},[19,382,383],{},"以下建議可以開始搭配 VS Code 終端機操作",[11,385,387],{"id":386},"設定-git-config-內容","設定 Git config 內容",[16,389,390,393],{},[19,391,392],{},"由於每次發佈檔案時，都會記錄該版本是哪位開發者變更的",[19,394,395],{},"因此初次需要設定姓名跟 Email",[290,397,402],{"className":398,"code":400,"language":401},[399],"language-text","git config --global user.name \"姓名\"\ngit config --global user.email \"Email\"\n","text",[296,403,400],{"__ignoreMap":86},[16,405,406],{},[19,407,408],{},"將 \"姓名\" 跟 \"Email\" 換成個人資訊",[19,410,411],{},"以下為進階 Optional 設定",[16,413,414],{},[19,415,416],{},"這個 git config 檔案設定了一些 Git 與 VS Code 的整合設定，讓你可以在使用 Git 時使用 VS Code 作為編輯器、差異檢視工具和合併工具。以下是各個設定的指令說明：",[418,419,420,438,455,472,489],"ol",{},[153,421,422,423],{},"編輯器設定:",[150,424,425,431],{},[153,426,427,428],{},"指令: ",[296,429,430],{},"git config --global core.editor \"code --wait\"",[153,432,433,434,437],{},"功能: 將 VS Code 設定為全域（global）的 Git 編輯器，使用 ",[296,435,436],{},"code --wait"," 命令開啟 VS Code 並等待編輯器關閉後再繼續 Git 操作。",[153,439,440,441],{},"差異檢視工具設定:",[150,442,443,448],{},[153,444,427,445],{},[296,446,447],{},"git config --global diff.tool vscode",[153,449,450,451,454],{},"功能: 設定 VS Code 為差異檢視工具，當使用 ",[296,452,453],{},"git diff"," 命令時，Git 會使用 VS Code 來顯示差異。",[153,456,457,458],{},"VS Code 差異檢視工具設定:",[150,459,460,465],{},[153,461,427,462],{},[296,463,464],{},"git config --global difftool.vscode.cmd \"code --wait --diff $LOCAL $REMOTE\"",[153,466,467,468,471],{},"功能: 設定使用 VS Code 作為差異檢視工具的命令，當你執行 ",[296,469,470],{},"git difftool"," 命令時，Git 會使用 VS Code 打開兩個檔案的差異。",[153,473,474,475],{},"合併工具設定:",[150,476,477,482],{},[153,478,427,479],{},[296,480,481],{},"git config --global merge.tool vscode",[153,483,484,485,488],{},"功能: 設定 VS Code 為合併工具，當執行 ",[296,486,487],{},"git merge"," 命令時，Git 會使用 VS Code 來進行合併操作。",[153,490,491,492],{},"VS Code 合併工具設定:",[150,493,494,499],{},[153,495,427,496],{},[296,497,498],{},"git config --global mergetool.vscode.cmd \"code --wait $MERGED\"",[153,500,501,502,505],{},"功能: 設定使用 VS Code 作為合併工具的命令，當執行 ",[296,503,504],{},"git mergetool"," 命令時，Git 會使用 VS Code 打開合併後的檔案。",[19,507,508,509,511],{},"這些設定可以通過在終端機或命令提示字元中輸入相應的指令進行配置。請確保已經在系統中安裝了 Git 和 VS Code，以及將 ",[296,510,296],{}," 命令設定為可從終端機中啟動 VS Code 的全域指令。",[150,513,514],{},[153,515,516],{},"查看已設定的 Git config",[290,518,520],{"className":292,"code":519,"language":294,"meta":86,"style":86},"git config --list\n",[296,521,522],{"__ignoreMap":86},[299,523,524,527,530],{"class":301,"line":302},[299,525,526],{"class":305},"git",[299,528,529],{"class":309}," config",[299,531,532],{"class":316}," --list\n",[16,534,535,538],{},[19,536,537],{},"也可以直接修改 Windows user\u002FLinux home 資料夾底下的.gitconfig 檔案",[19,539,540,541,544,545],{},"例如：\n",[296,542,543],{},"C:\\Users\\user\\.gitconfig","\n或\n",[296,546,547],{},"\u002Fhome\u002Fuser\u002F.gitconfig",[290,549,553],{"className":550,"code":551,"language":552,"meta":86,"style":86},"language-txt shiki shiki-themes material-theme-lighter github-light github-dark","[user]\n  email = example@gmail.com\n  name = your_name\n[core]\n  editor = code --wait\n[diff]\n  tool = vscode\n[difftool \"vscode\"]\n  cmd = code --wait --diff $LOCAL $REMOTE\n[merge]\n  tool = vscode\n[mergetool \"vscode\"]\n  cmd = code --wait $MERGED\n","txt",[296,554,555,560,566,572,578,584,590,596,602,608,614,619,625],{"__ignoreMap":86},[299,556,557],{"class":301,"line":302},[299,558,559],{},"[user]\n",[299,561,563],{"class":301,"line":562},2,[299,564,565],{},"  email = example@gmail.com\n",[299,567,569],{"class":301,"line":568},3,[299,570,571],{},"  name = your_name\n",[299,573,575],{"class":301,"line":574},4,[299,576,577],{},"[core]\n",[299,579,581],{"class":301,"line":580},5,[299,582,583],{},"  editor = code --wait\n",[299,585,587],{"class":301,"line":586},6,[299,588,589],{},"[diff]\n",[299,591,593],{"class":301,"line":592},7,[299,594,595],{},"  tool = vscode\n",[299,597,599],{"class":301,"line":598},8,[299,600,601],{},"[difftool \"vscode\"]\n",[299,603,605],{"class":301,"line":604},9,[299,606,607],{},"  cmd = code --wait --diff $LOCAL $REMOTE\n",[299,609,611],{"class":301,"line":610},10,[299,612,613],{},"[merge]\n",[299,615,617],{"class":301,"line":616},11,[299,618,595],{},[299,620,622],{"class":301,"line":621},12,[299,623,624],{},"[mergetool \"vscode\"]\n",[299,626,628],{"class":301,"line":627},13,[299,629,630],{},"  cmd = code --wait $MERGED\n",[11,632,634],{"id":633},"建立-local-repo-本地數據庫","建立 Local Repo (本地數據庫)",[418,636,637,640],{},[153,638,639],{},"cd 到想存放 Repo 的資料夾",[153,641,642,643,646],{},"執行 ",[296,644,645],{},"git init",[16,647,648],{},[19,649,650],{},"應可看到以下資訊",[290,652,655],{"className":653,"code":654,"language":401},[399],"Initialized empty Git repository in \"專案路徑\"\u002F.git\u002F\n",[296,656,654],{"__ignoreMap":86},[11,658,660],{"id":659},"檔案追蹤與提交版本-add-and-commit","檔案追蹤與提交版本 (add and commit)",[112,662,664],{"id":663},"git-add","git add",[19,666,667,668,671],{},"當我們在 workdir 進行了檔案的任何變更，包含新增、檔名或內容的修改、刪除等，此時這些變更是尚未被追蹤的。\n舉例，創建一個 index.html 的檔案，使用 ",[296,669,670],{},"git status"," 會看到以下資訊",[290,673,676],{"className":674,"code":675,"language":401},[399],"On branch main\n\nNo commits yet\n\nUntracked files:\n  (use \"git add \u003Cfile>...\" to include in what will be committed)\n        index.html\n\nnothing added to commit but untracked files present (use \"git add\" to track)\n",[296,677,675],{"__ignoreMap":86},[19,679,680,681,684],{},"意思是 Git 偵測到一個未追蹤的檔案為 ",[296,682,683],{},"index.html","，將它加入 stage 就可以追蹤它 (track)，將檔案加入到 stage 使用",[290,686,689],{"className":687,"code":688,"language":401},[399],"git add \u003C檔案名稱>\n",[296,690,688],{"__ignoreMap":86},[19,692,693,694,697],{},"如 ",[296,695,696],{},"git add index.html","\n會產生以下結果",[290,699,702],{"className":700,"code":701,"language":401},[399],"On branch main\n\nNo commits yet\n\nChanges to be committed:\n  (use \"git rm --cached \u003Cfile>...\" to unstage)\n        new file:   index.html\n",[296,703,701],{"__ignoreMap":86},[16,705,706],{},[19,707,708],{},[84,709],{"alt":86,"src":710},"https:\u002F\u002Fhackmd.io\u002F_uploads\u002FrJBF5vs-6.jpg",[112,712,714],{"id":713},"git-commit","git commit",[19,716,717],{},"stage 中的檔案就是被追蹤 (經過 git add) 後的檔案清單，將檔案從 stage 加入到 Local Repo 使用",[290,719,722],{"className":720,"code":721,"language":401},[399],"git commit -m \"\u003C填寫版本資訊(即commit log)>\"\n",[296,723,721],{"__ignoreMap":86},[19,725,726,727,730,731,733],{},"例如 ",[296,728,729],{},"git commit -m \"feat: 新增網頁標題\"","\n接著就能在 ",[296,732,670],{}," 看到結果：",[290,735,738],{"className":736,"code":737,"language":401},[399],"On branch main\nnothing to commit, working tree clean\n",[296,739,737],{"__ignoreMap":86},[19,741,742,743,746],{},"接著可以使用 ",[296,744,745],{},"git log","，查看 commit 的紀錄",[290,748,751],{"className":749,"code":750,"language":401},[399],"commit ef070ed2cc39d72e203822a6e1ffd89d3be52f1e (HEAD -> main)\nAuthor: Charles5277 \u003Cabcd854884@gmail.com>\nDate:   Sat Mar 25 15:40:00 2023 +0800\n\n    feat: 新增網頁標題\n",[296,752,750],{"__ignoreMap":86},[76,754,756],{"id":755},"修改上次的-commit-訊息跟檔案內容","修改上次的 commit 訊息跟檔案內容",[19,758,759,760,763],{},"當剛進行 commit 後，突然想修改 commit 的 message，或是想多加、多刪除內容，可以使用 ",[296,761,762],{},"git commit --amend -m \"要修改的訊息\""," ，若此時 stage 區沒有其他變更，就只會變更 message，如果 stage 區有內容，會直接把 stage 區合併進去",[19,765,766,767,770],{},"若使用 vscode 的 \"提交暫存 (修改)\" 功能\n",[84,768],{"alt":86,"src":769},"https:\u002F\u002Fi.imgur.com\u002FclCCpOT.png","\n此時 workdir 有內容，但 stage 區是空的，會詢問是否要將 workdir 的內容直接丟上去，此時若不想使用 never 功能，又不想先清空 worktree，以及使用 stash (隱藏) 功能的話，可以直接在終端機打上述指令，就可以不影響 worktree，單純改 commit",[76,772,774],{"id":773},"約定式提交-conventional-commits","約定式提交 (Conventional Commits)",[19,776,777],{},"不同人在寫 commit 時可能會有自己的習慣，導致當多人維護 repo 時，commit log 會難以閱讀，因此我們需要遵循統一的約定式提交規範",[150,779,780,813],{},[153,781,782,783,803],{},"以下是如果沒有規則，會發生的事情：",[16,784,785,790,795,800],{},[19,786,787],{},[84,788],{"alt":86,"src":789},"https:\u002F\u002Fhackmd.io\u002F_uploads\u002FHkAZiwqWT.png",[19,791,792],{},[84,793],{"alt":86,"src":794},"https:\u002F\u002Fhackmd.io\u002F_uploads\u002Fr1xQoD5-a.png",[19,796,797],{},[84,798],{"alt":86,"src":799},"https:\u002F\u002Fhackmd.io\u002F_uploads\u002FS19msw5ba.png",[19,801,802],{},"以上這些提交描述「First Beautiful Commit」、「Fix again」、「Another one」都無法讓未來追程式碼的人立刻理解「改了什麼」和「為何要這樣修改」。因此，導入約定式提交能讓團隊成員強制遵守固定的規範和格式，填寫適當的內容。",[16,804,805],{},[19,806,807,808],{},"參考素材來源：",[28,809,812],{"href":810,"rel":811},"https:\u002F\u002Fwww.cythilya.tw\u002F2021\u002F03\u002F16\u002Fconventional-commits\u002F",[37],"約定式提交 Conventional Commits - by Summer。桑莫。夏天",[153,814,815,816],{},"清楚詳細的撰寫範例",[16,817,818,826],{},[19,819,807,820,825],{},[28,821,824],{"href":822,"rel":823},"https:\u002F\u002Fwadehuanglearning.blogspot.com\u002F2019\u002F05\u002Fcommit-commit-commit-why-what-commit.html",[37],"Git Commit Message 這樣寫會更好，替專案引入規範與範例 - by WadeHuang 的學習迷航記","\n參考素材來源：Charles 的團隊專案",[150,827,828,834],{},[153,829,830,831],{},"加上 icon 前\n",[84,832],{"alt":86,"src":833},"https:\u002F\u002Fhackmd.io\u002F_uploads\u002FH1we0w5W6.png",[153,835,836,837,840,843,844],{},"加上 icon 後\n",[84,838],{"alt":86,"src":839},"https:\u002F\u002Fhackmd.io\u002F_uploads\u002FHkFmRDqba.png",[841,842],"br",{}," > ",[84,845],{"alt":86,"src":846},"https:\u002F\u002Fhackmd.io\u002F_uploads\u002FByo_Rwq-6.png",[19,848,849],{},"以下遵照 Angular 風格，提供範例",[290,851,854],{"className":852,"code":853,"language":401},[399],"\u003Cicon>\u003Cspace>\u003Ctype>(\u003Cscope>):\u003Cspace>\u003Csubject>\u003Center>\u003Cbody>\u003Center>\u003Cfooter>\n",[296,855,853],{"__ignoreMap":86},[19,857,849],{},[150,859,860,875,885,1009,1019,1029,1039],{},[153,861,862,865],{},[296,863,864],{},"\u003Cicon>",[16,866,867],{},[19,868,869,870],{},"建議遵循 gitmoji 規則使用 icon，以及對應的 type 關係\n",[28,871,874],{"href":872,"rel":873},"https:\u002F\u002Fgitmoji.dev\u002F",[37],"gitmoji | An emoji guide for your commit messages",[153,876,877,880],{},[296,878,879],{},"\u003Cspace>",[16,881,882],{},[19,883,884],{},"單純一個空白字元",[153,886,887,890,895],{},[296,888,889],{},"\u003Ctype>",[16,891,892],{},[19,893,894],{},"以我使用 extension 所自訂的 config 為例，提供了以下這些，有些版本可能不會拆分這麼多細項，只需與協作夥伴協調好要使用的 type 清單即可",[150,896,897,905,913,921,929,937,945,953,961,969,977,985,993,1001],{},[153,898,899,900],{},"🔀merge\n",[16,901,902],{},[19,903,904],{},"合併分支",[153,906,907,908],{},"🧹chore\n",[16,909,910],{},[19,911,912],{},"小幅度修改，包含修改註解或顯示文字等",[153,914,915,916],{},"✨feat\n",[16,917,918],{},[19,919,920],{},"新增功能",[153,922,923,924],{},"🐛fix\n",[16,925,926],{},[19,927,928],{},"修復 bug",[153,930,931,932],{},"🔨refactor\n",[16,933,934],{},[19,935,936],{},"重構現有程式碼，無新增功能或修復 bug",[153,938,939,940],{},"🧪test\n",[16,941,942],{},[19,943,944],{},"更新測試檔案",[153,946,947,948],{},"🎨style\n",[16,949,950],{},[19,951,952],{},"調整 code 風格或 UI 樣式，不影響程式碼的內容。例如縮排、分號、空格、CSS 變更等。",[153,954,955,956],{},"📝docs\n",[16,957,958],{},[19,959,960],{},"修改說明文檔",[153,962,963,964],{},"📦build\n",[16,965,966],{},[19,967,968],{},"新增、更新或刪除依賴 package",[153,970,971,972],{},"🚀deploy\n",[16,973,974],{},[19,975,976],{},"部屬新版本",[153,978,979,980],{},"🚑hotfix\n",[16,981,982],{},[19,983,984],{},"緊急修復發行版本的錯誤",[153,986,987,988],{},"⏪revert\n",[16,989,990],{},[19,991,992],{},"抵銷目標版本",[153,994,995,996],{},"👷ci\n",[16,997,998],{},[19,999,1000],{},"更新 CI 配置，例如 Docker、GitHub Action、k8s 等設定檔",[153,1002,1003,1004],{},"🎉init\n",[16,1005,1006],{},[19,1007,1008],{},"初始化專案",[153,1010,1011,1014],{},[296,1012,1013],{},"\u003Cscope>",[16,1015,1016],{},[19,1017,1018],{},"影響的範圍，例如專案中的特定層面，非必填",[153,1020,1021,1024],{},[296,1022,1023],{},"\u003Csubject>",[16,1025,1026],{},[19,1027,1028],{},"[必填] 50 字內簡短敘述，不須加句號",[153,1030,1031,1034],{},[296,1032,1033],{},"\u003Cbody>",[16,1035,1036],{},[19,1037,1038],{},"詳細敘述，可以分成多行，單行不要超過 72 字元，非必填",[153,1040,1041,1044],{},[296,1042,1043],{},"\u003Cfooter>",[16,1045,1046],{},[19,1047,1048],{},"如果有的話，填寫對應的 issue，例如 #17，非必填",[16,1050,1051],{},[19,1052,1053],{},"以上參數皆可依照團隊需要將規範調整，但需要確保所有協作夥伴有共識，才能維持 repo 的 commit 整齊性",[76,1055,1057,1058],{"id":1056},"輔助-commit-log-工具-git-commit-plugin","輔助 commit log 工具 - ",[296,1059,1060],{},"git-commit-plugin",[16,1062,1063],{},[19,1064,1065],{},"VS Code 可自定義，最方便的 git commit extension",[150,1067,1068],{},[153,1069,1070,1071,1073,1074,1086,1088,1089,1096,1098],{},"功能介紹",[841,1072],{},"互動式介面創建約定式提交",[16,1075,1076,1081],{},[19,1077,1078],{},[84,1079],{"alt":86,"src":1080},"https:\u002F\u002Fi.imgur.com\u002FlcT0wU0.png",[19,1082,1083],{},[84,1084],{"alt":86,"src":1085},"https:\u002F\u002Fi.imgur.com\u002FHc5psjw.png",[841,1087],{},"點擊 Complete 後即自動產生 commit 格式",[16,1090,1091],{},[19,1092,1093],{},[84,1094],{"alt":86,"src":1095},"https:\u002F\u002Fi.imgur.com\u002FPP9b1XP.png",[841,1097],{},"使讓多人協作 repo 時，commit 風格統一",[11,1100,1101],{"id":1101},"分支管理",[112,1103,1105],{"id":1104},"git-branch","git branch",[76,1107,1109],{"id":1108},"關於-head","關於 HEAD",[19,1111,1112],{},"HEAD 是一個指標，代表你目前指定的版本狀態，HEAD 可以指到",[150,1114,1115,1127],{},[153,1116,242,1117,1122],{},[16,1118,1119],{},[19,1120,1121],{},"分支，預設有一主線為 main\n由 snapshot (或稱 commit 節點) 組成，多個分支可以共享相同的節點",[16,1123,1124],{},[19,1125,1126],{},"從 2022\u002F10 開始，Github 的預設分支主線由 master 改為 main，而 git 預設仍為 master",[153,1128,1129,1130],{},"commit 版本",[16,1131,1132],{},[19,1133,1134,1135,1137],{},"git graph 上的節點，可以透過 ",[296,1136,745],{}," 查看 hash 來指定 HEAD 移動到該節點",[19,1139,1140,1141,1144,1145],{},"要將 HEAD 指到 commit 版本，可以使用 ",[296,1142,1143],{},"git switch -d \u003Chash>","\n執行 ",[296,1146,745],{},[290,1148,1151],{"className":1149,"code":1150,"language":401},[399],"commit 5cac503a14baec3ad3da6618f08f577ae048567b (HEAD -> main)\nAuthor: Charles5277 \u003Cabcd854884@gmail.com>\nDate:   Thu Mar 30 16:22:48 2023 +0800\n\n    feat: 新增css檔案\n\ncommit ef070ed2cc39d72e203822a6e1ffd89d3be52f1e\nAuthor: Charles5277 \u003Cabcd854884@gmail.com>\nDate:   Sat Mar 25 15:40:00 2023 +0800\n\n    feat: 新增網頁標題\n",[296,1152,1150],{"__ignoreMap":86},[19,1154,642,1155,1158,1159],{},[296,1156,1157],{},"git switch -d ef070ed2cc39d72e203822a6e1ffd89d3be52f1e","\n再執行 ",[296,1160,745],{},[290,1162,1165],{"className":1163,"code":1164,"language":401},[399],"commit ef070ed2cc39d72e203822a6e1ffd89d3be52f1e (HEAD)\nAuthor: Charles5277 \u003Cabcd854884@gmail.com>\nDate:   Sat Mar 25 15:40:00 2023 +0800\n\n    feat: 新增網頁標題\n",[296,1166,1164],{"__ignoreMap":86},[16,1168,1169],{},[19,1170,1171],{},"此時 HEAD 單獨指在第一個版本，而 main 目前在第二個版本",[19,1173,1174,1175,1178,1179],{},"將 HEAD 移回最新狀態\n執行 ",[296,1176,1177],{},"git swtich main","\n及 ",[296,1180,745],{},[290,1182,1184],{"className":1183,"code":1150,"language":401},[399],[296,1185,1150],{"__ignoreMap":86},[76,1187,1188],{"id":1188},"創建分支",[19,1190,343,1191,1194],{},[296,1192,1193],{},"git branch \u003C新分支名稱>"," 創建分支\n這個新分支會以當前 HEAD 指到的位置作為起點",[290,1196,1198],{"className":292,"code":1197,"language":294,"meta":86,"style":86},"git branch dev\n",[296,1199,1200],{"__ignoreMap":86},[299,1201,1202,1204,1207],{"class":301,"line":302},[299,1203,526],{"class":305},[299,1205,1206],{"class":309}," branch",[299,1208,1209],{"class":309}," dev\n",[19,1211,1212,1213,1216],{},"或使用 ",[296,1214,1215],{},"git switch -c \u003C新分支名稱>","\n可以直接在創建後同時將 HEAD 指過去",[290,1218,1220],{"className":292,"code":1219,"language":294,"meta":86,"style":86},"git switch -c dev\n",[296,1221,1222],{"__ignoreMap":86},[299,1223,1224,1226,1229,1232],{"class":301,"line":302},[299,1225,526],{"class":305},[299,1227,1228],{"class":309}," switch",[299,1230,1231],{"class":316}," -c",[299,1233,1209],{"class":309},[76,1235,1237],{"id":1236},"head-指向-commit-跟-branch-的差別","HEAD 指向 commit 跟 branch 的差別",[19,1239,1240,1241,1244],{},"HEAD 身為指標，一次只能指向一個目標\n先前提到 HEAD 可以指定在 branch 或某個 commit 版本\n目前的 git graph 如圖\n",[84,1242],{"alt":86,"src":1243},"https:\u002F\u002Fi.imgur.com\u002F3rmt1VP.png","\n有 2 個 branch，分別為 main 跟 dev",[150,1246,1247,1295,1340],{},[153,1248,1249,1250,1255,1257,1260,1281,1283,1284,1290],{},"情況 1 HEAD 指向 main",[16,1251,1252],{},[19,1253,1254],{},"使用 git switch main",[841,1256],{},[84,1258],{"alt":86,"src":1259},"https:\u002F\u002Fi.imgur.com\u002FZgiEy6M.png",[290,1261,1263],{"className":292,"code":1262,"language":294,"meta":86,"style":86},"git switch main\ngit log\n",[296,1264,1265,1274],{"__ignoreMap":86},[299,1266,1267,1269,1271],{"class":301,"line":302},[299,1268,526],{"class":305},[299,1270,1228],{"class":309},[299,1272,1273],{"class":309}," main\n",[299,1275,1276,1278],{"class":301,"line":562},[299,1277,526],{"class":305},[299,1279,1280],{"class":309}," log\n",[841,1282],{},"得到結果",[290,1285,1288],{"className":1286,"code":1287,"language":401},[399],"commit 5cac503a14baec3ad3da6618f08f577ae048567b (HEAD -> main, dev)\nAuthor: Charles5277 \u003Cabcd854884@gmail.com>\nDate:   Thu Mar 30 16:22:48 2023 +0800\n\n    feat: 新增css檔案\n",[296,1289,1287],{"__ignoreMap":86},[16,1291,1292],{},[19,1293,1294],{},"標示為 (HEAD -> main, dev)，代表 HEAD 指向 main，而 dev 分支目前也處在同個版本",[153,1296,1297,1298,1303,1305,1308,1327,1283,1329,1335],{},"情況 2 HEAD 指向 dev",[16,1299,1300],{},[19,1301,1302],{},"使用 git switch dev",[841,1304],{},[84,1306],{"alt":86,"src":1307},"https:\u002F\u002Fi.imgur.com\u002F2dl1O9c.png",[290,1309,1311],{"className":292,"code":1310,"language":294,"meta":86,"style":86},"git switch dev\ngit log\n",[296,1312,1313,1321],{"__ignoreMap":86},[299,1314,1315,1317,1319],{"class":301,"line":302},[299,1316,526],{"class":305},[299,1318,1228],{"class":309},[299,1320,1209],{"class":309},[299,1322,1323,1325],{"class":301,"line":562},[299,1324,526],{"class":305},[299,1326,1280],{"class":309},[841,1328],{},[290,1330,1333],{"className":1331,"code":1332,"language":401},[399],"commit 5cac503a14baec3ad3da6618f08f577ae048567b (HEAD -> dev, main)\nAuthor: Charles5277 \u003Cabcd854884@gmail.com>\nDate:   Thu Mar 30 16:22:48 2023 +0800\n\n    feat: 新增css檔案\n",[296,1334,1332],{"__ignoreMap":86},[16,1336,1337],{},[19,1338,1339],{},"標示為 (HEAD -> dev, main)，代表 HEAD 指向 dev，而 main 分支目前也處在同個版本",[153,1341,1342],{},"情況 3 HEAD 指向 commit 版本",[16,1344,1345],{},[19,1346,343,1347,1349,1350,1353],{},[296,1348,1143],{},"\n此處以 ",[296,1351,1352],{},"git switch -d 5cac503a14baec3ad3da6618f08f577ae048567b"," 示範\n對應圖上的 C2",[19,1355,1356],{},[84,1357],{"alt":86,"src":1358},"https:\u002F\u002Fi.imgur.com\u002FERIXxUj.png",[290,1360,1362],{"className":292,"code":1361,"language":294,"meta":86,"style":86},"git switch -d 5cac503a14baec3ad3da6618f08f577ae048567b\ngit log\n",[296,1363,1364,1376],{"__ignoreMap":86},[299,1365,1366,1368,1370,1373],{"class":301,"line":302},[299,1367,526],{"class":305},[299,1369,1228],{"class":309},[299,1371,1372],{"class":316}," -d",[299,1374,1375],{"class":309}," 5cac503a14baec3ad3da6618f08f577ae048567b\n",[299,1377,1378,1380],{"class":301,"line":562},[299,1379,526],{"class":305},[299,1381,1280],{"class":309},[19,1383,1283],{},[290,1385,1388],{"className":1386,"code":1387,"language":401},[399],"commit 5cac503a14baec3ad3da6618f08f577ae048567b (HEAD, main, dev)\nAuthor: Charles5277 \u003Cabcd854884@gmail.com>\nDate:   Thu Mar 30 16:22:48 2023 +0800\n\n    feat: 新增css檔案\n",[296,1389,1387],{"__ignoreMap":86},[16,1391,1392],{},[19,1393,1394],{},"標示為 (HEAD, main, dev)，可以理解為 HEAD 指向了這個 commit 版本，而 main 跟 dev 的版本狀態也在這個版本",[76,1396,1397],{"id":1397},"分支差異",[19,1399,1400],{},"目前 main 跟 dev 兩個 branch 都在 5cac50 的版本上，現在我們試著在 dev 上更新版本",[19,1402,1403],{},[84,1404],{"alt":86,"src":1405},"https:\u002F\u002Fi.imgur.com\u002FdA8Gy7t.png",[19,1407,1408],{},"此時對於 main 來說只有兩筆 commit 紀錄",[290,1410,1411],{"className":292,"code":1262,"language":294,"meta":86,"style":86},[296,1412,1413,1421],{"__ignoreMap":86},[299,1414,1415,1417,1419],{"class":301,"line":302},[299,1416,526],{"class":305},[299,1418,1228],{"class":309},[299,1420,1273],{"class":309},[299,1422,1423,1425],{"class":301,"line":562},[299,1424,526],{"class":305},[299,1426,1280],{"class":309},[290,1428,1430],{"className":1429,"code":1150,"language":401},[399],[296,1431,1150],{"__ignoreMap":86},[76,1433,1434],{"id":1434},"刪除分支",[19,1436,1437,1438,1441],{},"若需要刪除分支，請將 HEAD 移到其他分支後，使用 ",[296,1439,1440],{},"git branch -d \u003Cbranch_name>"," 將分支刪除，若刪除後該分支會有 commit 紀錄丟失，則會跳出警告，請將該分支目前的進度合併到其他 branch 上，再刪除該 branch",[19,1443,1444,1445],{},"若不在意刪除該 branch 後會有 commit 丟失，則可以使用 ",[296,1446,1447],{},"git branch -D \u003Cbranch_name>",[19,1449,1450],{},"使用 - D 刪除後，該分支上的節點若沒有其他分支共同持有，則會直接消失，所以請配合 git graph 等 git 分支圖檢視工具確認是否會丟失非預期的 commit 節點",[112,1452,487],{"id":1453},"git-merge",[76,1455,1457],{"id":1456},"branch-merge-fast-forward-分支合併-快轉模式","branch merge - fast forward (分支合併 - 快轉模式)",[19,1459,1460,1461,1464,1465,1468,1469],{},"目前 main 跟 dev 在同一條線上，因為 main 的位置是 dev 的起點。\n而且 main 的版本比 dev 舊，此時要將 main 更新到 dev 時，\n可以使用 ",[296,1462,1463],{},"git switch main"," 切換到 main 後\n使用 ",[296,1466,1467],{},"git merge dev -e","，將 main 更新到 dev 的位置\n",[84,1470],{"alt":86,"src":1471},"https:\u002F\u002Fi.imgur.com\u002FBb26KZv.png",[76,1473,1475],{"id":1474},"branch-merge-no-fast-forward-分支合併-不進行快轉","branch merge - no fast forward (分支合併 - 不進行快轉)",[19,1477,1478,1479,1482,1485,1486,1489,1490,1493],{},"若我們想要在上述情況產生另外的合併紀錄，而不是看起來都是一條直線往前推進的話，可以在 merge 時加上參數，改為 ",[296,1480,1481],{},"git merge dev --no-ff",[84,1483],{"alt":86,"src":1484},"https:\u002F\u002Fi.imgur.com\u002FyicGzKj.png","\n若使用 git graph、git lens 等套件進行 merge，可能會有自動產生 message 而無法編輯的情況，若希望自定 merge 時的 message，可以直接使用 ",[296,1487,1488],{},"git merge dev --no-ff -m \"message\"","，或是使用 ",[296,1491,1492],{},"git merge dev --no-ff -e","，會在輸入後跳出編輯視窗讓你輸入訊息",[19,1495,1496,1497,1500,1501],{},"若在 main 在進行與 dev 的合併前，已經有新的 commit 版本\n",[84,1498],{"alt":86,"src":1499},"https:\u002F\u002Fi.imgur.com\u002FbMWHVib.png","\n則嘗試進行合併時，就自動不會執行 fast forward\n",[84,1502],{"alt":86,"src":1503},"https:\u002F\u002Fi.imgur.com\u002F2Ggpagf.png",[16,1505,1506],{},[19,1507,1508],{},"若要將 main 保持主線，而不想在某次 merge 變成支線，需特別注意合併時，\n必須將 HEAD 移到 main，再執行 merge 其他分支，才能形成其他分支匯入 main 的效果",[76,1510,1511],{"id":1511},"合併訊息填寫",[19,1513,1514,1515,1518,1519,1522],{},"當使用 vscode 進行 git merge 合併時，有使用 ",[296,1516,1517],{},"-e"," 參數進行編輯合併訊息，會出現以下視窗\n",[84,1520],{"alt":86,"src":1521},"https:\u002F\u002Fi.imgur.com\u002FNp1wcnY.png","\n第一行就是會成為紀錄的 merge 訊息，下方的註解區可以忽略或刪除\n編輯完訊息後只需存檔，並關閉檔案就會完成合併",[76,1524,1525],{"id":1525},"進階合併分支",[19,1527,1528,1531],{},[84,1529],{"alt":86,"src":1530},"https:\u002F\u002Fi.imgur.com\u002Fijjm0QE.png",[84,1532],{"alt":86,"src":1533},"https:\u002F\u002Fi.imgur.com\u002Fyu1nv6x.png",[19,1535,1536],{},"第二次從 dev 匯入 main 時，顏色變更的原因是，先前都是以 main 去 merge dev，\n因此 main 會取得 dev 的所有 commit 紀錄跟變更。",[19,1538,1539],{},"而此處在 main 進行 merge dev 後，再將 dev 進行 merge main\n此舉會讓 main 跟 dev 都進展到同樣的進度上，之後 dev 再繼續推展，\n接著 main 又進行 merge dev。",[76,1541,1542],{"id":1542},"合併衝突處理",[112,1544,1546],{"id":1545},"git-rebase","git rebase",[19,1548,1549,1550,1552],{},"rebase 中文翻譯成重訂基底，使用 ",[296,1551,1546],{}," 對分支進行管理",[19,1554,1555],{},"rebase 的作用跟 merge 同樣為合併分支，實際應用場景有 2 類：",[76,1557,1559],{"id":1558},"濃縮-commit","濃縮 commit",[19,1561,1562,1563,1566],{},"當我們在同一條 branch 上 commit 太多版本，想把一部分的 commit 合併成一個時，可以使用 ",[296,1564,1565],{},"git rebase -i HEAD~數字","進行合併",[19,1568,1569,1570,1573,1574,1577,1580,1581,1585],{},"範例如下：\n",[84,1571],{"alt":86,"src":1572},"https:\u002F\u002Fi.imgur.com\u002FOCxbraR.png","\n使用 ",[296,1575,1576],{},"git rebase -i HEAD~3",[84,1578],{"alt":86,"src":1579},"https:\u002F\u002Fi.imgur.com\u002Fq4K8IID.png","\n依序為\nHEAD",[1582,1583,1584],"del",{},"3\nHEAD","2\nHEAD~1",[19,1587,1588,1589,1592,1593,1596,1597,1600,1601],{},"假設要把 HEAD~1 跟 HEAD~2 併到 HEAD~3\n即將要拿掉的 commit 的 pick 改成 squash\n",[84,1590],{"alt":86,"src":1591},"https:\u002F\u002Fi.imgur.com\u002FIt80IuQ.png","\n然後存檔，關閉此檔案\n",[84,1594],{"alt":86,"src":1595},"https:\u002F\u002Fi.imgur.com\u002FyKYg0oR.png","\n接著會跳出這些檔案原本的 commit 紀錄，此時將內容全部註解掉，再到最上方編輯 commit 訊息 (若有裝 git-commit-plugin 可以將引導生成的 commit 訊息複製後貼過來\n",[84,1598],{"alt":86,"src":1599},"https:\u002F\u002Fi.imgur.com\u002Fi4sviwX.png","\n然後存檔，關閉此檔案\n如果有使用 git graph 等，需要按一下重新整理，即可看到濃縮完成\n",[84,1602],{"alt":86,"src":1603},"https:\u002F\u002Fi.imgur.com\u002FLW1F2DX.png",[19,1605,1606,1607,1611],{},"若完成後想取消操作，可以按照 ",[28,1608,1610],{"href":1609},"#%E4%BD%BF%E7%94%A8reset---hard%E5%BE%8C%E6%83%B3%E5%8F%8D%E6%82%94","reset --hard 取消","的方式",[76,1613,1614],{"id":1614},"將目前分支整根接到其他分支上",[19,1616,343,1617,1620,1621],{},[296,1618,1619],{},"git rebase \u003C目標分支>","\n將當前 branch 追朔到根源，剪下後接到 \u003C目標分支> 上\n",[84,1622],{"alt":86,"src":1623},"https:\u002F\u002Fi.imgur.com\u002FNL6ny2g.png",[19,1625,1626,1627,1630,1631],{},"此處試著將 test 接到 dev 上，使用 ",[296,1628,1629],{},"git rebase dev","\n由於 test 的原基底為 10a197eb\n因此會將 2c3b8450 跟 df043ca4 剪下接到 dev 上\n",[84,1632],{"alt":86,"src":1633},"https:\u002F\u002Fi.imgur.com\u002FqbgqRgT.png",[11,1635,219],{"id":1636},"遠端數據庫-remote-repo",[112,1638,1640],{"id":1639},"local-repo-與-remote-repo-的綁定","Local Repo 與 Remote Repo 的綁定",[150,1642,1643],{},[153,1644,1645,1648,1653],{},[296,1646,1647],{},"git remote",[16,1649,1650],{},[19,1651,1652],{},"查看 remote repo 列表的 branch 簡稱",[150,1654,1655,1665,1675],{},[153,1656,1657,1660],{},[296,1658,1659],{},"git remote add \u003Cremote repo簡稱的branch簡稱> \u003Curl>",[16,1661,1662],{},[19,1663,1664],{},"添加 remote repo",[153,1666,1667,1670],{},[296,1668,1669],{},"git remote -v",[16,1671,1672],{},[19,1673,1674],{},"觀看 remote repo 的 branch 列表 (包含 url)",[153,1676,1677,1680,1685],{},[296,1678,1679],{},"git clone \u003Curl>",[16,1681,1682],{},[19,1683,1684],{},"下載 remote repo",[16,1686,1687],{},[19,1688,1689,1690,1693,1694,1696],{},"當進行 git clone 時，會將 remote repo 下載到當前的資料夾，並且自動執行 ",[296,1691,1692],{},"git remote add origin","，因此若執行 ",[296,1695,1647],{},"，就會看到已經自動產生了 origin",[112,1698,1700],{"id":1699},"將-local-repo-更新到-remote-repo","將 Local Repo 更新到 Remote Repo",[150,1702,1703],{},[153,1704,1705,1708,1713],{},[296,1706,1707],{},"git push",[16,1709,1710],{},[19,1711,1712],{},"將 local repo 推送同步到 remote repo (github)",[150,1714,1715,1731],{},[153,1716,1717,1720],{},[296,1718,1719],{},"git push \u003C數據庫簡稱> \u003C分支名稱>",[16,1721,1722],{},[19,1723,1724,1725,1728,1729],{},"clone 後的 remote 預設會設為 origin，且 github 等主流 remote repo 的預設分支為 main，因此可以使用\n",[296,1726,1727],{},"git push origin main","\n或直接使用 ",[296,1730,1707],{},[153,1732,1733,1736],{},[296,1734,1735],{},"git push -f",[16,1737,1738],{},[19,1739,1740,1741,1743],{},"強行將 Local Repo 覆寫到 Remote Repo\n在本地進行 reset、rebase 等操作後，若執行 pull 或 sync 都會被 Remote Repo 覆蓋操作，因此需要先使用 ",[296,1742,1735],{}," 將較舊的狀態覆寫到 Remote Repo",[112,1745,1747],{"id":1746},"更新-local-repo-變成-remote-repo-狀態","更新 Local Repo 變成 Remote Repo 狀態",[150,1749,1750,1760],{},[153,1751,1752,1755],{},[296,1753,1754],{},"git fetch",[16,1756,1757],{},[19,1758,1759],{},"將 Remote Repo 的內容下載到 Local Repo",[153,1761,1762,1765],{},[296,1763,1764],{},"git pull",[16,1766,1767],{},[19,1768,1769],{},"將 Remote Repo 的內容抓下來並且合併對應的 branch\n相當於 git fetch + git merge\n有合併衝突時與 git merge 處理流程相同",[76,1771,1773],{"id":1772},"fetch-跟-pull-的使用時機","fetch 跟 pull 的使用時機",[19,1775,1776],{},"使用 fetch 當抓下來的資料還不想立即合併，例如 worktree 尚未清空，但想先將 Remote 目前 commit 狀態下載時",[76,1778,1780],{"id":1779},"先拉再推-the-first-pull-and-push","先拉再推 (The First Pull and Push)",[19,1782,1783,1784,1786,1787,1789],{},"當多人協作時，想將 Local Repo Push 到 Remote Repo 時可能會發生衝突，因此會遵照「先拉再推」的準則\n也就是執行 ",[296,1785,1764],{}," 再執行 ",[296,1788,1707],{},"\n若使用 VS Code 可以使用 Sync 功能一鍵完成這兩步",[19,1791,1792,1793,1796,1797,1799],{},"另外，這麼做會導致 pull 下來有需要合併 branch 時會自動產生 merge 的 commit 紀錄，如果不希望產生的話，必須改使用 ",[296,1794,1795],{},"git pull --rebase"," 再 ",[296,1798,1707],{},"，等同以 rebase 取代 merge",[19,1801,1802,1803,1806,1807],{},"而使用 VS Code 時，可以在設定的 ",[296,1804,1805],{},"git.rebaseWhenSync"," 指定 Sync 時是否要 Rebase，預設為否\n",[84,1808],{"alt":86,"src":1809},"https:\u002F\u002Fi.imgur.com\u002FSicTje0.png",[11,1811,1813],{"id":1812},"恢復撤銷變更","恢復、撤銷變更",[112,1815,1817],{"id":1816},"git-restore","git restore",[150,1819,1820,1834,1844],{},[153,1821,1822,1825],{},[296,1823,1824],{},"git restore \u003Cfile_name>",[16,1826,1827],{},[19,1828,1829,1830,1833],{},"將檔案的變更捨棄 (只限定未放到 stage 區的 workdir 變更)\n預設即為 - W (worktree)\n因此 ",[296,1831,1832],{},"git restore -W \u003Cfile_name>"," 的效果是一樣的",[153,1835,1836,1839],{},[296,1837,1838],{},"git restore -S \u003Cfile_name>",[16,1840,1841],{},[19,1842,1843],{},"將檔案從 stage 區移回 workdir (但內容變更不改變)\n相當於取消 git add",[153,1845,1846,1849],{},[296,1847,1848],{},"git restore -W -S \u003Cfile_name>",[16,1850,1851],{},[19,1852,1853],{},"一次完成從 stage 區直接捨棄變更",[76,1855,1857],{"id":1856},"從其他-commit-拿檔案","從其他 commit 拿檔案",[150,1859,1860],{},[153,1861,1862,1865],{},[296,1863,1864],{},"git restore -s \u003Chash\u002Fbranch> \u003Cfile_name>",[16,1866,1867],{},[19,1868,1869],{},"抓某個 commit 版本的指定檔案到目前的 workdir",[112,1871,1873],{"id":1872},"git-reset","git reset",[19,1875,1876,1877,1880,1881,1884,1885,1888,1889,1892,1893],{},"當我們想要取消最近一次的 commit 操作時，可以使用 ",[296,1878,1879],{},"git reset HEAD~","，若要取消當前 branch 的多筆 commit 可以使用 ",[296,1882,1883],{},"git reset HEAD~數字","或 ",[296,1886,1887],{},"git reset HEAD~..~","，例如想要取消 3 筆可以用 ",[296,1890,1891],{},"git reset HEAD~~~"," 或 ",[296,1894,1895],{},"git reset HEAD~3",[19,1897,1898,1899],{},"原本最新的變更會退回到 worktree 的 workdir，若確定退回後不需要這些變更紀錄，可以使用 ",[296,1900,1901],{},"git reset HEAD~ --hard",[19,1903,1904,1905,1892,1908,1911,1912,1915],{},"當我們是要帶著 HEAD 當前指向的 branch 變更到指定位置，可以使用 ",[296,1906,1907],{},"git reset \u003Chash>",[296,1909,1910],{},"git reset \u003Cbranch_name>"," 將當前 branch 直接變更為指定 commit 的狀態，同樣可以選用 ",[296,1913,1914],{},"--hard"," 將原本位置的檔案變更捨棄",[76,1917,1919],{"id":1918},"使用-reset-hard-後想反悔","使用 reset --hard 後想反悔",[19,1921,1922,1923,1926,1927,1930,1931,1933],{},"當誤用 ",[296,1924,1925],{},"git reset --hard"," 刪掉 commit 紀錄後，可以用 ",[296,1928,1929],{},"git reflog"," 找回操作的所有歷史紀錄，找到想要復原 commit 的 hash 值，再透過 ",[296,1932,1907],{}," 將當前的 branch 指回該 commit 即可",[76,1935,1937],{"id":1936},"搭配-git-graph","搭配 Git Graph",[19,1939,1940],{},[84,1941],{"alt":86,"src":1942},"https:\u002F\u002Fhackmd.io\u002F_uploads\u002FHyw85q7Gp.png",[150,1944,1945,1948,1951],{},[153,1946,1947],{},"Soft：提交過的 commit 放到暫存區、當前 worktree 保留，",[153,1949,1950],{},"Mixed：提交過的 commit 放到工作目錄、當前 stage 清除、workdir 保留",[153,1952,1953],{},"Hard：提交過的跟當前變更都不要了，直接變成目標的狀態",[16,1955,1956],{},[19,1957,1958,1959,1892,1961],{},"指令預設採 Mixed 模式，可以改指定 ",[296,1960,1914],{},[296,1962,1963],{},"--soft",[112,1965,1967],{"id":1966},"git-revert","git revert",[16,1969,1970],{},[19,1971,1972],{},"否決掉某個指定的版本",[19,1974,1975,1976,1978,1979,1982,1983,1986],{},"當 branch 發展到一半，突然想改掉某個版本的設定，就會使用 ",[296,1977,1967],{},"，但 revert 的操作不像 rebase，並不會影響先前的 commit 紀錄，而是以新增 commit 的方式反向抵銷指定版本的操作，由於在 git 的檔案變更邏輯是以 ",[296,1980,1981],{},"+"," ",[296,1984,1985],{},"-"," 標示每行的異動狀況，因此進行 revert 時只要不是涉及 merge 的情況，大多能自動完成反向操作",[19,1988,1989,1992],{},[296,1990,1991],{},"git revert \u003C指定的commit>","\n會自動產生對指定 commit 的反向操作",[76,1994,1996],{"id":1995},"同樣可以搭配-git-graph","同樣可以搭配 Git Graph",[19,1998,1999],{},[84,2000],{"alt":86,"src":2001},"https:\u002F\u002Fhackmd.io\u002F_uploads\u002Fryw1GhQM6.png",[19,2003,2004,2005,2008,2009,2012,2013,2016,2017],{},"同時 revert 指定 commit 會參照該 commit 的前一個節點\n若要恢復的版本，來源是 2 個以上的分支匯集，則需要指定 ",[296,2006,2007],{},"-m"," 參數\n",[84,2010],{"alt":86,"src":2011},"https:\u002F\u002Fi.imgur.com\u002FrlnmiDm.png","\n如圖，da3d4ab 是由 2 個分支組成，",[296,2014,2015],{},"git revert da3d4ab"," 會無法得知應該參照的前一個節點應該取哪條分支，由左到右從 1 開始排序，因此若要參照 parent1 需要使用 ",[296,2018,2019],{},"git revert da3d4ab -m 1",[112,2021,2023],{"id":2022},"resetrevert以及合併分支的-rebasemerge-使用取捨","reset、revert，以及合併分支的 rebase\u002Fmerge 使用取捨",[19,2025,2026,2027,2029],{},"由於 reset 跟 rebase 都會變更歷史 commit 紀錄，可以做到濃縮、減少、刪除 commit 等效果，因此較不建議使用在已經 push 到 Remote Repo 的情況，因為這代表需要用 ",[296,2028,1735],{}," 做強行推送，蓋掉原先的 commit，在多人協作中容易產生困擾，因此若要在已經 push 到 Remote Repo 的情況使用 reset 跟 rebase 需要確定取得協作夥伴的共識",[19,2031,2032],{},"而 revert 就可以放心地使用，不過每次使用 revert 都會產生更多的 commit 紀錄，會造成 commit 更加臃腫",[19,2034,2035],{},"因此必要的時候在遠端使用 rebase 濃縮，或多開 branch 整理分支也是優化開發環境的好選擇",[11,2037,2039],{"id":2038},"worktree-打包隱藏","worktree 打包隱藏",[112,2041,2043],{"id":2042},"git-stash","git stash",[19,2045,2046,2047,2049,2050],{},"在進行 git 的日常操作時常有要求當前 worktree 必須淨空的條件，此時可以選擇將目前的變更 commit 或捨棄，但如果臨時想要先打包起來，進行完操作後再解開，可以使用 ",[296,2048,2043],{},"，將目前的 worktree (包含 workdir 跟 stage 區一起) 打包並隱藏，要還原回來時使用 ",[296,2051,2052],{},"git stash apply",[19,2054,2055],{},"若有多個 stash 要管理，可以使用以下指令",[150,2057,2058,2068,2078],{},[153,2059,2060,2063],{},[296,2061,2062],{},"git stash save \"message\"",[16,2064,2065],{},[19,2066,2067],{},"在建立 stash 時加上備註。",[153,2069,2070,2073],{},[296,2071,2072],{},"git stash list",[16,2074,2075],{},[19,2076,2077],{},"列出所有 stash。",[153,2079,2080,2083],{},[296,2081,2082],{},"git stash clear",[16,2084,2085],{},[19,2086,2087],{},"刪除所有 stash",[16,2089,2090],{},[19,2091,2092],{},"其餘指令使用 stash@{n} 即可指定第 n 個 stash",[16,2094,2095],{},[19,2096,2097],{},"若使用 stash 則指定目前最新的",[150,2099,2100,2110,2120],{},[153,2101,2102,2105],{},[296,2103,2104],{},"git stash show",[16,2106,2107],{},[19,2108,2109],{},"顯示最新 stash 的詳情",[153,2111,2112,2115],{},[296,2113,2114],{},"git stash@{n} branch \u003Cbranch_name>",[16,2116,2117],{},[19,2118,2119],{},"創建一個新的分支，並將第 n 個 stash 的內容丟進去",[153,2121,2122,2125],{},[296,2123,2124],{},"git stash drop stash@{n}",[16,2126,2127],{},[19,2128,2129],{},"刪除第 n 個 stash。",[76,2131,2133],{"id":2132},"搭配-vs-code-git-graph","搭配 VS Code + Git Graph",[19,2135,2136],{},"常用組合",[150,2138,2139,2145],{},[153,2140,2141,2142],{},"將整個 worktree 打包\n",[84,2143],{"alt":86,"src":2144},"https:\u002F\u002Fhackmd.io\u002F_uploads\u002FS1a1Q2Qza.png",[153,2146,2147,2148],{},"透過 Git Graph 管理 Stash\n",[84,2149],{"alt":86,"src":2150},"https:\u002F\u002Fhackmd.io\u002F_uploads\u002FH1NHXh7G6.png",[16,2152,2153],{},[19,2154,2155,2156],{},"搭配",[28,2157,2159],{"href":2158},"#vs-code-git%E4%BB%8B%E9%9D%A2%E4%B8%AD%E8%8B%B1%E5%B0%8D%E7%85%A7%E8%A1%A8","🔗VS-Code-Git 介面中英對照表",[11,2161,2163],{"id":2162},"git-command-總覽","Git Command 總覽",[150,2165,2166,2175,2197,2207,2228,2237,2294,2332,2361,2370,2425,2471,2476,2498,2508,2548,2557,2609,2638,2671,2680],{},[153,2167,2168,2170],{},[296,2169,645],{},[16,2171,2172],{},[19,2173,2174],{},"當前位置創建 Local Repo",[153,2176,2177,2180,2185],{},[296,2178,2179],{},"git config",[16,2181,2182],{},[19,2183,2184],{},"設定檔相關操作",[150,2186,2187],{},[153,2188,2189,2192],{},[296,2190,2191],{},"git config --list",[16,2193,2194],{},[19,2195,2196],{},"查看目前設定檔",[153,2198,2199,2202],{},[296,2200,2201],{},"git add \u003C檔案名稱>",[16,2203,2204],{},[19,2205,2206],{},"將檔案從 workdir 加入 stage",[153,2208,2209,2212,2217],{},[296,2210,2211],{},"git commit -m \"\u003C填寫說明訊息>\"",[16,2213,2214],{},[19,2215,2216],{},"將 stage 區提交到 local repo，並加上 commit log",[150,2218,2219],{},[153,2220,2221,2223],{},[296,2222,762],{},[16,2224,2225],{},[19,2226,2227],{},"修改最近一次的 commit 訊息，或是連同檔案修改內容一同變更",[153,2229,2230,2232],{},[296,2231,745],{},[16,2233,2234],{},[19,2235,2236],{},"查看當前有效的版本紀錄 (即 commit history)\n不會查看到已經斷開連接 (沒有任何 branch 或 HEAD 綁定) 的 commit，需要的話請往下使用 git reflog",[153,2238,2239,2242],{},[296,2240,2241],{},"git switch",[150,2243,2244,2275,2284],{},[153,2245,2246,2249,2254],{},[296,2247,2248],{},"git switch \u003Cbranch>",[16,2250,2251],{},[19,2252,2253],{},"切換 HEAD 到指定分支\n需要先清空 worktree\n若 stage 區還有資料未 commit、workdir 有還沒 add 到 stage 區的內容，需要先處理",[150,2255,2256,2265],{},[153,2257,2258,2260],{},[296,2259,1463],{},[16,2261,2262],{},[19,2263,2264],{},"回到最新版本主線",[153,2266,2267,2270],{},[296,2268,2269],{},"git switch -f \u003Cbranch>",[16,2271,2272],{},[19,2273,2274],{},"強制切換分支，直接捨棄 worktree 中未 commit 的內容",[153,2276,2277,2279],{},[296,2278,1143],{},[16,2280,2281],{},[19,2282,2283],{},"切換 HEAD 到 commit 節點，可以先透過 git log 查看 hash\nd 指的是 detach，讓 HEAD 指向節點，非指向 branch 的狀態",[153,2285,2286,2289],{},[296,2287,2288],{},"git switch -c \u003Cnew_branch>",[16,2290,2291],{},[19,2292,2293],{},"創造新的分支並將 HEAD 切過去",[153,2295,2296,2298,2303],{},[296,2297,1647],{},[16,2299,2300],{},[19,2301,2302],{},"查看 remote repo 的 branch 列表",[150,2304,2305,2315,2324],{},[153,2306,2307,2310],{},[296,2308,2309],{},"git remote add \u003Cremote repo的branch簡稱> \u003Curl>",[16,2311,2312],{},[19,2313,2314],{},"添加 remote repo\n可以在一個 local repo 中添加多個 remote repo branch",[153,2316,2317,2319],{},[296,2318,1669],{},[16,2320,2321],{},[19,2322,2323],{},"觀看 remote repo branch (包含 url)",[153,2325,2326,2328],{},[296,2327,1679],{},[16,2329,2330],{},[19,2331,1684],{},[153,2333,2334,2336,2341],{},[296,2335,1707],{},[16,2337,2338],{},[19,2339,2340],{},"將 local repo 更新到 remote repo",[150,2342,2343,2352],{},[153,2344,2345,2347],{},[296,2346,1707],{},[16,2348,2349],{},[19,2350,2351],{},"推送到 Remote Repo 預設的名稱：origin，到預設的分支：main\n等同 git push origin main",[153,2353,2354,2356],{},[296,2355,1735],{},[16,2357,2358],{},[19,2359,2360],{},"強行將 Local Repo 覆寫到 Remote Repo",[153,2362,2363,2365],{},[296,2364,1764],{},[16,2366,2367],{},[19,2368,2369],{},"將 remote repo 更新到 local repo",[153,2371,2372,2374],{},[296,2373,1105],{},[150,2375,2376,2386,2395,2405,2415],{},[153,2377,2378,2381],{},[296,2379,2380],{},"git branch -a",[16,2382,2383],{},[19,2384,2385],{},"查看所有現有分支",[153,2387,2388,2390],{},[296,2389,1193],{},[16,2391,2392],{},[19,2393,2394],{},"在 HEAD 處創建新 branch",[153,2396,2397,2400],{},[296,2398,2399],{},"git branch -d \u003C分支名稱>",[16,2401,2402],{},[19,2403,2404],{},"將分支刪除，若有未合併的 commit 會提示並阻止，需要合併到其他分支後才能順利刪掉",[153,2406,2407,2410],{},[296,2408,2409],{},"git branch -D \u003C分支名稱>",[16,2411,2412],{},[19,2413,2414],{},"將分支強行刪除，若有未合併的 commit 會直接丟棄",[153,2416,2417,2420],{},[296,2418,2419],{},"git branch -m \u003C原名稱> \u003C新名稱>",[16,2421,2422],{},[19,2423,2424],{},"將某個分支更名",[153,2426,2427,2429],{},[296,2428,487],{},[150,2430,2431,2441,2451,2461],{},[153,2432,2433,2436],{},[296,2434,2435],{},"git merge \u003C分支名稱>",[16,2437,2438],{},[19,2439,2440],{},"將 HEAD 指向的 branch 跟 \u003C分支名稱合併>",[153,2442,2443,2446],{},[296,2444,2445],{},"git merge \u003C分支名稱> --no-ff",[16,2447,2448],{},[19,2449,2450],{},"指定不使用 fast forward 快進模式合併，而是留下分支線紀錄",[153,2452,2453,2456],{},[296,2454,2455],{},"git merge \u003C分支名稱> --no-ff -m \u003C訊息>",[16,2457,2458],{},[19,2459,2460],{},"指定不使用 fast forward，且自訂 merge 時的訊息",[153,2462,2463,2466],{},[296,2464,2465],{},"git merge \u003C分支名稱> -e",[16,2467,2468],{},[19,2469,2470],{},"在合併前編輯 message",[153,2472,2473],{},[296,2474,2475],{},"git cherry-pick",[153,2477,2478,2481,2486],{},[296,2479,2480],{},"git cherry-pick \u003Chash>",[16,2482,2483],{},[19,2484,2485],{},"將某個 commit 單獨複製到當前分支上",[150,2487,2488],{},[153,2489,2490,2493],{},[296,2491,2492],{},"git cherry-pick \u003Cstart-hash>..\u003Cend-hash>",[16,2494,2495],{},[19,2496,2497],{},"將 start 到 end 的 commit 都擷取",[153,2499,2500,2503],{},[296,2501,2502],{},"git cherry-pick \u003Chash> -e \u003Ctarget-branch>",[16,2504,2505],{},[19,2506,2507],{},"將指定 commit 單獨複製到指定分支上 (而非當前分支)",[153,2509,2510,2512],{},[296,2511,1817],{},[150,2513,2514,2524,2532,2540],{},[153,2515,2516,2518],{},[296,2517,1824],{},[16,2519,2520],{},[19,2521,1829,2522,1833],{},[296,2523,1832],{},[153,2525,2526,2528],{},[296,2527,1838],{},[16,2529,2530],{},[19,2531,1843],{},[153,2533,2534,2536],{},[296,2535,1848],{},[16,2537,2538],{},[19,2539,1853],{},[153,2541,2542,2544],{},[296,2543,1864],{},[16,2545,2546],{},[19,2547,1869],{},[153,2549,2550,2552],{},[296,2551,1873],{},[16,2553,2554],{},[19,2555,2556],{},"將 HEAD 目前所在的 branch 帶著移動到指定位置",[153,2558,2559,2562,2567],{},[296,2560,2561],{},"git reset \u003Chash> [--mixed]",[16,2563,2564],{},[19,2565,2566],{},"預設就是 mixed，所以可以不用加\n將 HEAD 指向的 branch 帶到指定的 commit 節點上\n原本位置的 commit 檔案狀態回到 workdir",[150,2568,2569,2579,2589],{},[153,2570,2571,2574],{},[296,2572,2573],{},"git reset \u003Chash>\u002FHEAD~數字 --soft",[16,2575,2576],{},[19,2577,2578],{},"同 mixed，差在退回 stage 而不是 workdir",[153,2580,2581,2584],{},[296,2582,2583],{},"git reset \u003Chash> --hard",[16,2585,2586],{},[19,2587,2588],{},"同上，原本位置的 commit 檔案變更捨棄",[153,2590,2591,2593,2598],{},[296,2592,1883],{},[16,2594,2595],{},[19,2596,2597],{},"將 HEAD 指向的 branch 返回線上前幾個的版本",[150,2599,2600],{},[153,2601,2602,2604],{},[296,2603,1879],{},[16,2605,2606],{},[19,2607,2608],{},"將上一個 commit 的紀錄取消\n使用 --hard 同樣可以拋棄檔案變更",[153,2610,2611,2613,2618],{},[296,2612,1546],{},[16,2614,2615],{},[19,2616,2617],{},"重新訂定該 branch 的基底 (起點)",[150,2619,2620,2629],{},[153,2621,2622,2624],{},[296,2623,1565],{},[16,2625,2626],{},[19,2627,2628],{},"將同 branch 上多個 commit 濃縮合併",[153,2630,2631,2633],{},[296,2632,1619],{},[16,2634,2635],{},[19,2636,2637],{},"將當前 branch 追朔到根源，剪下後接到 \u003C目標分支> 上",[153,2639,2640,2642],{},[296,2641,1967],{},[150,2643,2644,2653],{},[153,2645,2646,2648],{},[296,2647,1991],{},[16,2649,2650],{},[19,2651,2652],{},"否定某個 commit 紀錄，自動進行反操作，試圖回到其 commit 的上一版狀態",[153,2654,2655,2658,2666],{},[296,2656,2657],{},"git revert \u003C指定的commit> -m \u003Cparent_number>",[16,2659,2660],{},[19,2661,2662,2663],{},"當 commit 為多個分支匯入，有多個「上一個 commit」時，由左到右從 1 開始排序，要指定最左邊的 branch 使用 ",[296,2664,2665],{},"git revert \u003C指定的commit> -m 1",[16,2667,2668],{},[19,2669,2670],{},"' 左 '\u002F' 右 ' 為 Git Graph 的相對表示",[153,2672,2673,2675],{},[296,2674,1929],{},[16,2676,2677],{},[19,2678,2679],{},"查看所有操作紀錄\n常用於救回已經斷開連結的 commit 紀錄",[153,2681,2682,2684,2689,2726,2731],{},[296,2683,2043],{},[16,2685,2686],{},[19,2687,2688],{},"將 worktree 打包隱藏",[150,2690,2691,2701,2709,2718],{},[153,2692,2693,2696],{},[296,2694,2695],{},"git stash -u",[16,2697,2698],{},[19,2699,2700],{},"將.gitignore 的檔案也加入",[153,2702,2703,2705],{},[296,2704,2062],{},[16,2706,2707],{},[19,2708,2067],{},[153,2710,2711,2713],{},[296,2712,2072],{},[16,2714,2715],{},[19,2716,2717],{},"列出所有 stash",[153,2719,2720,2722],{},[296,2721,2082],{},[16,2723,2724],{},[19,2725,2087],{},[16,2727,2728],{},[19,2729,2730],{},"使用 stash@{n} 即可指定第 n 個 stash\n若使用 stash 則指定目前最新的",[150,2732,2733,2741,2749],{},[153,2734,2735,2737],{},[296,2736,2104],{},[16,2738,2739],{},[19,2740,2109],{},[153,2742,2743,2745],{},[296,2744,2114],{},[16,2746,2747],{},[19,2748,2119],{},[153,2750,2751,2753],{},[296,2752,2124],{},[16,2754,2755],{},[19,2756,2757],{},"刪除第 n 個 stash",[11,2759,2761],{"id":2760},"vs-code-git-介面中英對照表","VS Code Git 介面中英對照表",[16,2763,2764],{},[19,2765,2766],{},"未寫說明為上述有完整介紹或使用頻率較低的功能",[112,2768,2769],{"id":2769},"主選單",[2771,2772,2773,2790],"table",{},[2774,2775,2776],"thead",{},[2777,2778,2779,2784,2787],"tr",{},[2780,2781,2783],"th",{"align":2782},"center","中文",[2780,2785,2786],{"align":2782},"英文",[2780,2788,2789],{"align":2782},"說明",[2791,2792,2793,2804,2814,2824,2834,2845,2855,2865,2876,2886,2896,2906,2916],"tbody",{},[2777,2794,2795,2799,2802],{},[2796,2797,2798],"td",{"align":2782},"檢視及排序",[2796,2800,2801],{"align":2782},"View & Sort",[2796,2803],{"align":2782},[2777,2805,2806,2809,2812],{},[2796,2807,2808],{"align":2782},"提取",[2796,2810,2811],{"align":2782},"Pull",[2796,2813],{"align":2782},[2777,2815,2816,2819,2822],{},[2796,2817,2818],{"align":2782},"推送",[2796,2820,2821],{"align":2782},"Push",[2796,2823],{"align":2782},[2777,2825,2826,2829,2832],{},[2796,2827,2828],{"align":2782},"複製",[2796,2830,2831],{"align":2782},"Clone",[2796,2833],{"align":2782},[2777,2835,2836,2839,2842],{},[2796,2837,2838],{"align":2782},"簽出至…",[2796,2840,2841],{"align":2782},"Checkout to",[2796,2843,2844],{"align":2782},"對應新版 Switch",[2777,2846,2847,2850,2853],{},[2796,2848,2849],{"align":2782},"擷取",[2796,2851,2852],{"align":2782},"Fetch",[2796,2854],{"align":2782},[2777,2856,2857,2860,2863],{},[2796,2858,2859],{"align":2782},"提交",[2796,2861,2862],{"align":2782},"Commit",[2796,2864],{"align":2782},[2777,2866,2867,2870,2873],{},[2796,2868,2869],{"align":2782},"變更",[2796,2871,2872],{"align":2782},"Changes",[2796,2874,2875],{"align":2782},"對應新版 Restore",[2777,2877,2878,2881,2884],{},[2796,2879,2880],{"align":2782},"提取、推送",[2796,2882,2883],{"align":2782},"Pull、Push",[2796,2885],{"align":2782},[2777,2887,2888,2891,2894],{},[2796,2889,2890],{"align":2782},"分支",[2796,2892,2893],{"align":2782},"Branch",[2796,2895],{"align":2782},[2777,2897,2898,2901,2904],{},[2796,2899,2900],{"align":2782},"遠端",[2796,2902,2903],{"align":2782},"Remote",[2796,2905],{"align":2782},[2777,2907,2908,2911,2914],{},[2796,2909,2910],{"align":2782},"隱藏",[2796,2912,2913],{"align":2782},"Stash",[2796,2915],{"align":2782},[2777,2917,2918,2921,2924],{},[2796,2919,2920],{"align":2782},"標籤",[2796,2922,2923],{"align":2782},"Tags",[2796,2925],{"align":2782},[112,2927,2859],{"id":2859},[2771,2929,2930,2940],{},[2774,2931,2932],{},[2777,2933,2934,2936,2938],{},[2780,2935,2783],{"align":2782},[2780,2937,2786],{"align":2782},[2780,2939,2789],{"align":2782},[2791,2941,2942,2960,2974,2985,2996,3016,3036],{},[2777,2943,2944,2949,2954],{},[2796,2945,2859,2946,2948],{"align":2782},[841,2947],{},"提交暫存",[2796,2950,2862,2951,2953],{"align":2782},[841,2952],{},"Commit Stage",[2796,2955,2956,2957,2959],{"align":2782},"實務上兩者無差別",[841,2958],{},"* 註 1",[2777,2961,2962,2965,2968],{},[2796,2963,2964],{"align":2782},"全部提交",[2796,2966,2967],{"align":2782},"Commit All",[2796,2969,2970,2971,2973],{"align":2782},"將 worktree 變更直接 commit",[841,2972],{},"包含未 add 到 stage 區的變更",[2777,2975,2976,2979,2982],{},[2796,2977,2978],{"align":2782},"復原上個提交",[2796,2980,2981],{"align":2782},"Undo Last commit",[2796,2983,2984],{"align":2782},"相當於 git reset HEAD~ --soft",[2777,2986,2987,2990,2993],{},[2796,2988,2989],{"align":2782},"中止重訂基底",[2796,2991,2992],{"align":2782},"Abort Rebase",[2796,2994,2995],{"align":2782},"取消 Rebase 操作",[2777,2997,2998,3004,3010],{},[2796,2999,3000,3001,3003],{"align":2782},"提交暫存 (修改)",[841,3002],{},"全部提交 (修改)",[2796,3005,3006,3007,3009],{"align":2782},"Commit Stage(Amend)",[841,3008],{},"Commit All(Amend)",[2796,3011,3012,3013],{"align":2782},"參考 ",[28,3014,714],{"href":3015},"#git-commit",[2777,3017,3018,3021,3024],{},[2796,3019,3020],{"align":2782},"提交暫存 (已登出)",[2796,3022,3023],{"align":2782},"Commit Stage(Signed off)",[2796,3025,3026,3027,3029,3030,3032,3033,3035],{"align":2782},"增加簽章驗證",[841,3028],{},"通常為嚴謹的 Repo、",[841,3031],{},"特定的開源 Repo 才會要求",[841,3034],{},"一般不會使用",[2777,3037,3038,3041,3044],{},[2796,3039,3040],{"align":2782},"全部提交 (已簽章)",[2796,3042,3043],{"align":2782},"Commit All(Signed off)",[2796,3045],{"align":2782},[16,3047,3048,3054],{},[19,3049,3050,3051,3053],{},"* 註 1：若 Stage 區有內容，只會送出 Stage 區；",[841,3052],{},"若 Stage 區沒有內容，則會詢問是否要順便加到 Stage 區並做 Commit",[19,3055,3056],{},[84,3057],{"alt":86,"src":3058},"https:\u002F\u002Fhackmd.io\u002F_uploads\u002FB1tJSBYZ6.png",[112,3060,2869],{"id":2869},[2771,3062,3063,3073],{},[2774,3064,3065],{},[2777,3066,3067,3069,3071],{},[2780,3068,2783],{"align":2782},[2780,3070,2786],{"align":2782},[2780,3072,2789],{"align":2782},[2791,3074,3075,3088,3098],{},[2777,3076,3077,3080,3083],{},[2796,3078,3079],{"align":2782},"暫存所有變更",[2796,3081,3082],{"align":2782},"Stage All Changes",[2796,3084,3012,3085],{"align":2782},[28,3086,1817],{"href":3087},"#git-restore",[2777,3089,3090,3093,3096],{},[2796,3091,3092],{"align":2782},"取消所有暫存變更",[2796,3094,3095],{"align":2782},"Unstage All Changes",[2796,3097],{"align":2782},[2777,3099,3100,3103,3106],{},[2796,3101,3102],{"align":2782},"捨棄所有變更",[2796,3104,3105],{"align":2782},"Discard All Changes",[2796,3107],{"align":2782},[112,3109,2880],{"id":3110},"提取推送",[2771,3112,3113,3123],{},[2774,3114,3115],{},[2777,3116,3117,3119,3121],{},[2780,3118,2783],{},[2780,3120,2786],{},[2780,3122,2789],{},[2791,3124,3125,3139,3150,3160,3171,3179,3190,3198,3208],{},[2777,3126,3127,3130,3133],{},[2796,3128,3129],{},"同步處理",[2796,3131,3132],{},"Sync",[2796,3134,3135,3136,3138],{},"先 git pull",[841,3137],{},"再 git push 的整合快捷",[2777,3140,3141,3143,3145],{},[2796,3142,2808],{},[2796,3144,2811],{},[2796,3146,3012,3147],{},[28,3148,248],{"href":3149},"#%E9%81%A0%E7%AB%AF%E6%95%B8%E6%93%9A%E5%BA%AB-remote-repo",[2777,3151,3152,3155,3158],{},[2796,3153,3154],{},"提取 (重訂基底)",[2796,3156,3157],{},"Pull(Rebase)",[2796,3159],{},[2777,3161,3162,3165,3168],{},[2796,3163,3164],{},"從… 提取",[2796,3166,3167],{},"Pull from…",[2796,3169,3170],{},"Pull Remote Repo 的指定 Branch",[2777,3172,3173,3175,3177],{},[2796,3174,2818],{},[2796,3176,2821],{},[2796,3178],{},[2777,3180,3181,3184,3187],{},[2796,3182,3183],{},"推送至…",[2796,3185,3186],{},"Push to",[2796,3188,3189],{},"當有多個 Remote Repo 時以此指定",[2777,3191,3192,3194,3196],{},[2796,3193,2849],{},[2796,3195,2852],{},[2796,3197],{},[2777,3199,3200,3203,3206],{},[2796,3201,3202],{},"擷取 (剪除)",[2796,3204,3205],{},"Fetch Prune",[2796,3207],{},[2777,3209,3210,3213,3216],{},[2796,3211,3212],{},"從所有遠端擷取",[2796,3214,3215],{},"Fetch From All Remotes",[2796,3217],{},[112,3219,2890],{"id":2890},[2771,3221,3222,3232],{},[2774,3223,3224],{},[2777,3225,3226,3228,3230],{},[2780,3227,2783],{"align":2782},[2780,3229,2786],{"align":2782},[2780,3231,2789],{"align":2782},[2791,3233,3234,3246,3258,3268,3279,3289,3298,3312,3320],{},[2777,3235,3236,3238,3241],{},[2796,3237,904],{"align":2782},[2796,3239,3240],{"align":2782},"Merge Branch",[2796,3242,3012,3243],{"align":2782},[28,3244,487],{"href":3245},"#git-merge",[2777,3247,3248,3251,3254],{},[2796,3249,3250],{"align":2782},"重訂基底分支…",[2796,3252,3253],{"align":2782},"Rebase Branch",[2796,3255,3012,3256],{"align":2782},[28,3257,1546],{"href":3245},[2777,3259,3260,3263,3266],{},[2796,3261,3262],{"align":2782},"建立分支",[2796,3264,3265],{"align":2782},"Create Branch",[2796,3267],{"align":2782},[2777,3269,3270,3273,3276],{},[2796,3271,3272],{"align":2782},"從下列來源建立分支",[2796,3274,3275],{"align":2782},"Create Branch From",[2796,3277,3278],{"align":2782},"switch 到指定位置後，建立新 branch",[2777,3280,3281,3284,3287],{},[2796,3282,3283],{"align":2782},"重新命名分支",[2796,3285,3286],{"align":2782},"Rename Branch",[2796,3288],{"align":2782},[2777,3290,3291,3293,3296],{},[2796,3292,1434],{"align":2782},[2796,3294,3295],{"align":2782},"Delete Branch",[2796,3297],{"align":2782},[2777,3299,3300,3303,3306],{},[2796,3301,3302],{"align":2782},"發布分支",[2796,3304,3305],{"align":2782},"Publish Branch",[2796,3307,3308,3309,3311],{"align":2782},"將 HEAD 當前的 branch",[841,3310],{},"更新並綁定到 Remote Repo",[2777,3313,3314,3316,3318],{},[2796,3315,3202],{"align":2782},[2796,3317,3205],{"align":2782},[2796,3319],{"align":2782},[2777,3321,3322,3324,3326],{},[2796,3323,3212],{"align":2782},[2796,3325,3215],{"align":2782},[2796,3327],{"align":2782},[112,3329,2900],{"id":2900},[2771,3331,3332,3342],{},[2774,3333,3334],{},[2777,3335,3336,3338,3340],{},[2780,3337,2783],{"align":2782},[2780,3339,2786],{"align":2782},[2780,3341,2789],{"align":2782},[2791,3343,3344,3356],{},[2777,3345,3346,3349,3352],{},[2796,3347,3348],{"align":2782},"新增遠端存取庫",[2796,3350,3351],{"align":2782},"Add Remote",[2796,3353,3012,3354],{"align":2782},[28,3355,248],{"href":3149},[2777,3357,3358,3361,3364],{},[2796,3359,3360],{"align":2782},"移除遠端存取庫",[2796,3362,3363],{"align":2782},"Remove Remote",[2796,3365],{"align":2782},[112,3367,2910],{"id":2910},[2771,3369,3370,3380],{},[2774,3371,3372],{},[2777,3373,3374,3376,3378],{},[2780,3375,2783],{"align":2782},[2780,3377,2786],{"align":2782},[2780,3379,2789],{"align":2782},[2791,3381,3382,3395,3405,3415,3425,3435,3445,3455],{},[2777,3383,3384,3387,3389],{},[2796,3385,3386],{"align":2782},"擱置變更",[2796,3388,2913],{"align":2782},[2796,3390,3012,3391],{"align":2782},[28,3392,3394],{"href":3393},"#git-stash","Worktree 打包隱藏",[2777,3396,3397,3400,3403],{},[2796,3398,3399],{"align":2782},"擱置變更 (包含未被追蹤的檔案)",[2796,3401,3402],{"align":2782},"Stash (Include Untracked)",[2796,3404],{"align":2782},[2777,3406,3407,3410,3413],{},[2796,3408,3409],{"align":2782},"套用最新擱置",[2796,3411,3412],{"align":2782},"Apply Latest Stash",[2796,3414],{"align":2782},[2777,3416,3417,3420,3423],{},[2796,3418,3419],{"align":2782},"套用擱置…",[2796,3421,3422],{"align":2782},"Apply Stash",[2796,3424],{"align":2782},[2777,3426,3427,3430,3433],{},[2796,3428,3429],{"align":2782},"取回最近的擱置",[2796,3431,3432],{"align":2782},"Pop Latest Stash",[2796,3434],{"align":2782},[2777,3436,3437,3440,3443],{},[2796,3438,3439],{"align":2782},"取回擱置…",[2796,3441,3442],{"align":2782},"Pop Stash…",[2796,3444],{"align":2782},[2777,3446,3447,3450,3453],{},[2796,3448,3449],{"align":2782},"卸除隱藏項目…",[2796,3451,3452],{"align":2782},"Drop Stash…",[2796,3454],{"align":2782},[2777,3456,3457,3460,3463],{},[2796,3458,3459],{"align":2782},"卸除所有隱藏項目…",[2796,3461,3462],{"align":2782},"Drop All Stashes…",[2796,3464],{"align":2782},[112,3466,2920],{"id":2920},[2771,3468,3469,3479],{},[2774,3470,3471],{},[2777,3472,3473,3475,3477],{},[2780,3474,2783],{"align":2782},[2780,3476,2786],{"align":2782},[2780,3478,2789],{"align":2782},[2791,3480,3481,3491],{},[2777,3482,3483,3486,3489],{},[2796,3484,3485],{"align":2782},"建立標籤",[2796,3487,3488],{"align":2782},"Create Tag",[2796,3490],{"align":2782},[2777,3492,3493,3496,3499],{},[2796,3494,3495],{"align":2782},"刪除標籤",[2796,3497,3498],{"align":2782},"Remove Tag",[2796,3500],{"align":2782},[3502,3503,3504],"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 .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);}",{"title":86,"searchDepth":568,"depth":568,"links":3506},[3507,3508,3511,3515,3518,3519,3520,3521,3530,3550,3558,3571,3576,3577],{"id":13,"depth":562,"text":14},{"id":73,"depth":562,"text":74,"children":3509},[3510],{"id":78,"depth":574,"text":78},{"id":104,"depth":562,"text":105,"children":3512},[3513,3514],{"id":114,"depth":568,"text":115},{"id":227,"depth":568,"text":228},{"id":251,"depth":562,"text":252,"children":3516},[3517],{"id":268,"depth":568,"text":268},{"id":353,"depth":562,"text":354},{"id":386,"depth":562,"text":387},{"id":633,"depth":562,"text":634},{"id":659,"depth":562,"text":660,"children":3522},[3523,3524],{"id":663,"depth":568,"text":664},{"id":713,"depth":568,"text":714,"children":3525},[3526,3527,3528],{"id":755,"depth":574,"text":756},{"id":773,"depth":574,"text":774},{"id":1056,"depth":574,"text":3529},"輔助 commit log 工具 - git-commit-plugin",{"id":1101,"depth":562,"text":1101,"children":3531},[3532,3539,3546],{"id":1104,"depth":568,"text":1105,"children":3533},[3534,3535,3536,3537,3538],{"id":1108,"depth":574,"text":1109},{"id":1188,"depth":574,"text":1188},{"id":1236,"depth":574,"text":1237},{"id":1397,"depth":574,"text":1397},{"id":1434,"depth":574,"text":1434},{"id":1453,"depth":568,"text":487,"children":3540},[3541,3542,3543,3544,3545],{"id":1456,"depth":574,"text":1457},{"id":1474,"depth":574,"text":1475},{"id":1511,"depth":574,"text":1511},{"id":1525,"depth":574,"text":1525},{"id":1542,"depth":574,"text":1542},{"id":1545,"depth":568,"text":1546,"children":3547},[3548,3549],{"id":1558,"depth":574,"text":1559},{"id":1614,"depth":574,"text":1614},{"id":1636,"depth":562,"text":219,"children":3551},[3552,3553,3554],{"id":1639,"depth":568,"text":1640},{"id":1699,"depth":568,"text":1700},{"id":1746,"depth":568,"text":1747,"children":3555},[3556,3557],{"id":1772,"depth":574,"text":1773},{"id":1779,"depth":574,"text":1780},{"id":1812,"depth":562,"text":1813,"children":3559},[3560,3563,3567,3570],{"id":1816,"depth":568,"text":1817,"children":3561},[3562],{"id":1856,"depth":574,"text":1857},{"id":1872,"depth":568,"text":1873,"children":3564},[3565,3566],{"id":1918,"depth":574,"text":1919},{"id":1936,"depth":574,"text":1937},{"id":1966,"depth":568,"text":1967,"children":3568},[3569],{"id":1995,"depth":574,"text":1996},{"id":2022,"depth":568,"text":2023},{"id":2038,"depth":562,"text":2039,"children":3572},[3573],{"id":2042,"depth":568,"text":2043,"children":3574},[3575],{"id":2132,"depth":574,"text":2133},{"id":2162,"depth":562,"text":2163},{"id":2760,"depth":562,"text":2761,"children":3578},[3579,3580,3581,3582,3583,3584,3585,3586],{"id":2769,"depth":568,"text":2769},{"id":2859,"depth":568,"text":2859},{"id":2869,"depth":568,"text":2869},{"id":3110,"depth":568,"text":2880},{"id":2890,"depth":568,"text":2890},{"id":2900,"depth":568,"text":2900},{"id":2910,"depth":568,"text":2910},{"id":2920,"depth":568,"text":2920},"Git","2024-09-10","編輯拆分中",false,"md",null,{},true,"\u002Fblog\u002Fgit\u002Fnote",{"title":5,"description":3589},"blog\u002Fgit\u002Fnote",[3587,3599],"VS Code","2024-09-21","HoUm29v_ZNFrI7s6E-kPSSZ560krjFbJRjZSlQ4seCA",1780512500991]