Git Serious(學程)



Git Serious(學程)

注意: 因為此系列已經沒有新東西可以教了,所以這個學程不會再加入新內容了!

#請來這邊看「Git Serious(學程)」簡介(Click here)

🚀7-1-0-Git版控神器CrashCourse(速成班)(Click here)

🚀7-1-1-GitEpisode1(第1篇)-Stage、Commit(Click here)

🚀7-1-2-GitEpisode2(第2篇)-Branch、Merge(Click here)

🚀7-1-3-GitEpisode3(第3篇)-LocalBranch、RemoteTrackingBranch、RemoteBranch、AnnotatedTag、LightweightTag(Click here)

🚀7-1-4-GitEpisode4(第4篇)-Diff、Patch、GitIgnore、Stash、WorkTree、GitBlame、GitShow、GitBundle(Click here)

🚀7-1-5-GitEpisode5(第5篇)-Rebase、Revert、InsertCommit、UpdateCommit、DeleteCommit(Click here)

🚀7-1-6-GitEpisode6(第6篇)-BackUp GitConfig、GitHook、Jest、PreCommit、Husky、Eslint、EslintConfig、LintStaged(Click here)

🚀7-1-7-GitEpisode7(第7篇)-GitObject、Blob、Tree、Commit、Tag、Compress、ShrinkRepository(Click here)

🚀7-1-8-GitEpisode8(第8篇)-GitHub、CentralizedWorkflow、FeatureBranchWorkflow、ForkingWorkflow、GitFlowWorkflow(Click here)

Git Serious(學程) - Introduction

# 從零開始,手把手,一門銜接一門,扎實打底,循序漸進,融會貫通,徹底理解,完全攻略「版控神器Git」。讓你以後遇到Git相關問題,都可以很自信地說「Not a problem!!!」。

🚀7-1-0-Git版控神器CrashCourse(速成班)(Click here)

  • 🚩透過SourceTree圖形介面工具,深入了解Git用法和觀念,無痛學習,從個人到團隊都適用。
  • 「版控神器Git速成班」,超過34個小時,內容是擷取「版控神器Git眉角學程」中,使用「SourceTree」的部分,還有少許部分的「Git指令教學」,帶您快速入門,應付工作。「版控神器Git速成班」適合新手,但是不推薦給已經在工作的老手。如果您已經工作滿一年了,建議服用「版控神器Git眉角學程」,好好扎實打底吧。

🚀7-1-1-GitEpisode1(第1篇)-Stage、Commit(Click here)

  • 🚩詳細示範SourceTree和TortoiseGit圖形介面工具。深入了解Git指令的用法和觀念。本篇深入分析Stage和Commit(提交)。
  • 示範SourceTree和P4Merge圖形介面工具,幾乎沒有Git指令,無痛學習。討論AzureDevOpsService。使用BasicProcessFlow搭配Epic和Issue來初步認識管理團隊合作。
  • 討論優先順序,LocalGitConfiguration大於GlobalGitConfiguration大於SystemWideGitConfiguration。示範在GlobalGitConfiguration和LocalGitConfiguration和SourceTree內設定Name和Email,了解差異和比較。
  • 示範LocalRepository(本地代碼倉庫)和BareRepository(本地基本代碼倉庫)的差異和比較。
  • 使用SourceTree和TortoiseGit和Git指令來示範Staged(暫存)和Unstaged(取消暫存)和Commit(提交)和GitStatus(狀況)和GitLog(歷史紀錄)。
  • 介紹使用WindowsCommandPrompt和WindowsPowerShell和GitBash來執行Git指令的環境設定。討論GItBash的UTF8中文顯示設定。
  • 介紹Git指令的預設文字編譯器為Vim。如果不習慣使用Vim,這邊也會示範把Git指令的文字編譯器設定為NotePad或是NotePad++。

🚀7-1-2-GitEpisode2(第2篇)-Branch、Merge(Click here)

  • 🚩詳細示範SourceTree和TortoiseGit圖形介面工具。深入了解Git指令的用法和觀念。本篇深入分析Branch(分支)和Merge(合併)。
  • 示範「SourceTree、TortoiseGit、Git指令」來做「Branch」(分支)的建立和「checkout」和刪除。
  • 示範「SourceTree、TortoiseGit、Git指令」來做「3WayMerge」(三路合併)和「FastForwardMerge」(快進合併)和「NonFastForwardMerge」(非快進合併)和「CherryPick」(挑櫻桃)。
  • 示範「TortoiseGit、Git指令」(不包含「SourceTree」)來做「NoFastForwardNoCommitMerge」(非快進非提交合併)和「SquashMerge」(壓縮合併)和「CherryPickNCommit」(挑N個櫻桃)。
  • 示範「P4Merge」來處理「Conflict」(衝突發生)。
  • 示範如何「UndoMergeBeforeCommit」(提交前復原合併)和「UndoMergeAfterCommit」(提交後復原合併)。
  • 示範「Git指令」來刪除所有已經合併的「Branch」(分支)。

🚀7-1-3-GitEpisode3(第3篇)-LocalBranch、RemoteTrackingBranch、RemoteBranch、AnnotatedTag、LightweightTag(Click here)

  • 🚩示範SourceTree和TortoiseGit圖形介面工具。詳解Git指令用法。深入分析LocalBranch(本地分支)和RemoteTrackingBranch(遠端追蹤分支)和RemoteBranch(遠端分支)和AnnotatedTag(標示標籤)和LightweightTag(輕量標籤)。
  • 有2種執行「git clone」的方式,就是「HttpsClone」和「SshClone」。
  • 其中又有2種執行「SshClone」的方式,就是「SshClone-PuttyKeySshClone-OpenSsh」。我個人推薦使用「SshClone-OpenSsh」。
  • HttpsClone」複製下來的「Repository」(代碼倉庫),可以使用「SourceTree、TortoiseGit、Git指令」同時操控,如果同一台電腦只需要登入一個帳號,強力推薦使用「HttpsClone」。
  • SshClone-PuttyKey」複製下來的「Repository」(代碼倉庫)可以使用「SourceTree、TortoiseGit」同時操控,很難使用「Git指令」操控,非常不推薦使用。
  • SshClone-OpenSsh」複製下來的「Repository」(代碼倉庫)可以使用「SourceTree、Git指令」同時操控,如果同一台電腦必須要登入多個帳號,只需設定「~/.ssh/config」檔案和「.git/config」檔案即可,所以強力推薦使用「SshClone-OpenSsh」。
  • SshClone的觀念是產生一組相對應的PublicKey(公開鎖匙)和PrivateKey(私人鎖匙)。PublicKey」(公開鎖匙)必須上傳到「GitHub、GitLab、BitBucket、AzureDevOps」。「PrivateKey」(私人鎖匙)留在本地端。如果本地端特定的「PrivateKey」(私人鎖匙)可以對應到「GitServer」(雲端Git伺服器)特定的「PublicKey」(公開鎖匙),那我就可以執行「git clone」。
  • 根據「Permission」(權限),又細分為2種「PublicKey」(公開鎖匙)。第1種是「PublicKey-AccountKey」(公開Key-帳號Key),可以執行「git clone」來複製我的「Account」(帳號)底下所有的「RemoteRepository」(遠端代碼倉庫)。第2種是「PublicKey-ProjectKey」(公開Key-專案Key),只能執行「git clone」來複製某一個特定的「RemoteRepository」(遠端代碼倉庫)。
  • GitHubGitLab」的「PublicKey-ProjectKey」(公開Key-專案Key)其實就是「DeployKey」,權限可設為「Read、Read&Write」。
  • BitBucket」的「PublicKey-ProjectKey」(公開Key-專案Key)其實就是「AccessKey」,權限只能設為「Read」,不能設為「Read&Write」。
  • AzureDevOpsService」沒有「PublicKey-ProjectKey」(公開Key-專案Key),只有另一個不同的觀念「PersonallyAccessToken」(個人存取令牌)
  • 示範使用「SourceTree、TortoiseGit、Git指令」執行「HttpsClone」來複製「GitHub、GitLab、BitBucket、AzureDevOpsService」。
  • 示範使用「Git指令」執行「HttpsClone」來複製2個不同「GitHub」帳號底下的「Repository」到同一台電腦。
  • 示範使用「SourceTree、TortoiseGit」(不包含「Git指令」)執行「SshClone-PuttyKey」搭配「PublicKey-AccountKey」(公開Key-帳號Key)來複製「GitHub、GitLab、BitBucket、AzureDevOpsService」。
  • 示範使用SourceTree、Git指令」(不包含「TortoiseGit」)執行「SshClone-OpenSsh」搭配「PublicKey-AccountKey」(公開Key-帳號Key)來複製「GitHub、GitLab、BitBucket、AzureDevOpsService」。
  • 示範使用Git指令」執行「SshClone-OpenSsh」搭配「PublicKey-AccountKey」(公開Key-帳號Key)來複製2個不同「GitHub」帳號底下的「Repository」(代碼倉庫)到同一台電腦。
  • 示範使用SourceTree、Git指令」(不包含「TortoiseGit」)執行「SshClone-OpenSsh」搭配「PublicKey-ProjectKey」(公開Key-專案Key)來複製「GitHub、GitLab、BitBucket、AzureDevOpsService」。
  • 比較「LocalBranchRemoteTrackingBranchRemoteBranch」(本地分支、遠端追蹤分支、遠端分支)。討論「Fetch、Pull、Push」和「.git/FETCH_HEAD」的觀念。
  • 示範把「LocalRepository」(本地倉庫)上傳到「GitHub」變成「RemoteRepository」(遠端倉庫)。
  • 示範把「RemoteRepository」(遠端倉庫)從「GitHub」搬家到「AzureDevOpsService」。
  • 討論「SemanticVersioning2.0.0」(版本命名方式)。討論「AnnotatedTag、LightweightTag」(標示標籤、輕量標籤)都有「LocalTag、RemoteTag」(本地標籤、遠端標籤),但沒有「RemoteTrackingTag」(遠端追蹤標籤),這點和「Branch」(分支)觀念不一樣。
  • 示範「建立、刪除、Fetch、Push、Checkout」Tag(標籤)。
  • 示範列出全部「LocalTag」(本地標籤)。示範列出全部「RemoteTag」(遠端標籤)。示範列出全部「LocalTag、RemoteTag」(本地標籤、遠端標籤)。
  • 示範刪除一個「LocalTag/RemoteTag」(本地標籤/遠端標籤)。示範刪除全部「LocalTag/RemoteTag」(本地標籤/遠端標籤)。
  • 示範當「RemoteTag」(遠端標籤)被刪除了,刪除相對應的「LocalTag」(本地標籤)。
  • 稍微討論"GitFlowWorkFlow"和"Tag"之間的關係。
  • 討論「RemoteRepository」(遠端代碼倉庫)隨著時間推移會越來越大,導致每次執行「git clone」都要等很久。所以示範「git clone --depth=N」去複製大型的「RemoteRepository」(遠端代碼倉庫)的某一個「Branch/Tag」(分支/標籤),這是個超級實戰技巧。
  • 假設你想把「GitHub」上的「RemoteRepository」(遠端代碼倉庫)搬家到別的Git伺服器,但是你還沒決定好搬家到哪。所以示範使用「git clone bare」暫時從「GitHub」搬家到本地端。假設確定搬家到「AzureDevOpsService」,所以示範從本地端上傳到「AzureDevOpsService」。

🚀7-1-4-GitEpisode4(第4篇)-Diff、Patch、GitIgnore、Stash、WorkTree、GitBlame、GitShow、GitBundle(Click here)

  • 🚩示範SourceTree圖形介面工具。詳解Git指令用法。深入分析Diff&Patch(比較和補丁)和GitIgnore(Git忽略)和Stash(存放區)和WorkTree(工作樹)和GitBlame(Git責備)和GitShow(Git顯示)和GitBundle(Git捆束)。
  • 討論「index」(站存區)觀念。討論「GitDiff&Patch」觀念。
  • 示範「git diff」搭配「--name-status、--diff-filter=[(A|C|D|M|R|T|U|X|B)…[*]]」過濾留下所需資訊,可以告知客戶你到底變動了什麼。
  • 示範「git diff」指令來建立「Patch檔案」。
  • 示範「git apply、git apply -R」(進版&退版)來將「Patch檔案」套用在「Hosting」(網站空間)上面。
  • 示範「GitIgnore」(Git忽略)的使用方式,包括忽略「File、Folder、Hierarchy、Extension副檔名」,然後討論現成的「GitIgnoreTemplate」。
  • 示範「GitStash」的各種實用技巧。示範建立「Stash」。討論「git stash apply...、git stash pop...」的差異和比較。
  • 示範「DisplayAllStash : git stash list」來顯示所有的「Stash」。
  • 示範「DisplayStash(Patch) : git stash show (-p) [StashIndex]」來顯示某一個特定的「Stash」內的修改。
  • 示範刪除一個「Stash」,示範刪除所有的「Stash」。
  • 示範「CreateBranchCheckoutBranchApplyStashDeleteStash : git stash branch [Branch] [StashIndex]」,這會建立一個「Branch」(分支),然後「Checkout」到該「Branch」(分支),然後套用該「Stash」,並且刪除該「Stash」。
  • 示範實用性高但訪間少人知道的「WorkTree」的使用技巧,這可在另一個資料夾內「Checkout」到另一個「Branch」(分支),而原資料夾還是可停留在「OriginalBranch」(原分支)。
  • 示範「GitLog、GitShow、GitBlame」的各種實用技巧。示範「GitShow」來定位「Bug」所在的「Commit」(提交)。 示範「GitBlame」來找出寫「Bug」的兇手。
  • 示範「GitLog、GitDiff」搭配「--stat」觀察「Commit」(提交)內的修改,交付IT產品時,這指令可壤客戶知道我們的勞作來邀功。
  • 示範「GitLog」搭配「--pretty、--since」可以只顯示某一段時間內的「Log」,再搭配「--author」可以只顯示某一個作者所做的修改「Log」。並且使用「git log --oneline | wc -l」,觀察在「CurrentBranch」(目前分支)上面有多少個「Commiot」(提交),用來衡量工程師的工作效率。
  • 示範使用「GitBundle」來解決當「WorkingFromHome」(WFH在家工作)卻無VPN權限連到公司私人的「Repository」(代碼倉庫)時的情境。
  • 假設某公司的「Repository」(代碼倉庫)是「host」在公司本地端,因為疫情,大家都要WFH,可是公司需要準備時間去開放VPN的權限讓工程師連到公司內部的「Repository」(代碼倉庫),這段時間工程師們連不到公司的「Repository」(代碼倉庫)卻還需要繼續工作。此Tutorial示範使用「GitBundle」來解決當WFH卻無VPN權限連到公司私人的「Repository」(代碼倉庫)時的情境。

🚀7-1-5-GitEpisode5(第5篇)-Rebase、Revert、InsertCommit、UpdateCommit、DeleteCommit(Click here)

  • 🚩示範SourceTree圖形介面工具。詳解Git指令。關於Rebase和Reset。詳解Rebase執行DeleteCommit和EditLastCommit和EditAnyCommitMessage和EditAnyCommit和InsertCommit和ReorderCommit和SquashCommits和RebaseBranch。
  • 使用「SourceTree、Git指令」。示範執行「git reset soft/mixed/hard」來刪除多個「Commits」(提交)。示範執行「git rebase」來刪除一個「Commit」(提交)。示範「git rebase」來做「EditAnyCommitMessage、EditLastCommit、ReorderCommit」(更改任意一個提交訊息、更改最新提交、排列提交順序)。示範「git rebase」來做「SquashCommit」(壓縮提交),「Squash」(壓縮合併)特定的「Commit」(提交)到前一個「Commit」(提交)。示範「git rebase [Branch]」來做「RebaseBranch」(重設分支起點)。將「CurrentBranch」(目前分支)「Rebase」到「[Branch]」(分支)。「CurrentBranch」(目前分支)的「StartCommit」(起始提交)將會變成此「[Branch]」(分支)的「LatestCommit」(最新提交)。
  • 使用「Git指令」示範「git rebase」來做「EditAnyCommit、InsertCommitAfterAnyCommit」(更改任意提交、插入提交到任一提交之後)。 
  • 使用「SourceTree」示範「RevertCommit、RevertHunk」(回復提交、回復部分),使用「Git指令」示範「RevertCommit」(回復提交)。
  • DeleteCommit」(刪除提交)和「RevertCommit」(回復提交)的差異在於,「DeleteCommit」(刪除提交)之後,那一個「Commit」(提交)就沒有了。「RevertCommit」(回復提交)之後,是產生一個新的「Commit」(提交)來取消之前的「Commit」的變動。
  • 如果「git rebase」中途,遇到「Conflict」(衝突),可以執行「git rebase --abort」放棄,或是執行「P4Merge」解決「Conflict」(衝突)後,再使用「git rebase --continue」。
  • 當「git rebase」結束後,可以執行「git push --force」(強制推),或是執行「git reset --hard ORIG_HEAD」來復原此次「git rebase」。
  • 示範復原「DeletedCommit、DeletedFile、DeletedFolder(被刪除的提交、被刪除的檔案、被刪除的資料夾)。

🚀7-1-6-GitEpisode6(第6篇)-BackUp GitConfig、GitHook、Jest、PreCommit、Husky、Eslint、EslintConfig、LintStaged(Click here)

  • 🚩示範SourceTree圖形介面工具。詳解Git指令。示範備份GitConfig。深入討論GitHook(Git鉤子)搭配Jest和PreCommit和Husky和Eslint和EslintConfig和LintStaged。
  • 圖解「GitHook」觀念。
  • 討論「PreCommit」搭配「NpmPackage-Jest」,在「Commit」(提交)前,先測試全部的「Js檔案」。備份GitHook、GitConfig」(Git鉤子、Git設定)
  • 示範「post-commitCommit」(提交)之後顯示更多訊息。示範「pre-rebase」可以阻擋git rebase」。示範--no-verify來暫時地忽略所有的GitHooks
  • 討論「NpmPackage-HuskyV4&7」來執行「PreCommit」搭配「NpmPackage-Jest、Eslint、LintStaged、CommitLintCli」。
  • Jest」會在「Commit」(提交)前,先測試全部的「Js檔案」。
  • Eslint」可以根據「AirBnb」的規則來「Verify」(驗證)「Js檔案」的「Syntax」(語法)。
  • LintStaged」只會「Verify」(驗證)被「Staged」的「Js檔案」,如果沒有「LintStaged」,則會「Verify」(驗證)全部的「Js檔案」,這會浪費資源。
  • CommitLintCli」會「Verify」(驗證)「CommitMessage」(提交訊息)的「Prefix」(前綴)一定是「#」開頭。
  • 搭配「Pre-Commit」的「AvoidNonASCIIFileName」(避免非ASCII檔案名)可以阻擋「Commit」(提交)「ChineseCharacterFileName」(中文檔案名)。
  • 搭配Pre-Commit」的「EmailValidation」(信箱驗證)可以強制使用CompanyEmail」(公司信箱)才能Commit」(提交)。
  • 討論備份「GitHook、GitConfig」(Git鉤子、Git設定)。

🚀7-1-7-GitEpisode7(第7篇)-GitObject、Blob、Tree、Commit、Tag、Compress、ShrinkRepository(Click here)

  • 🚩您是否遇到Git靈異現象卻不知道從哪下手?深入Git底層觀念才能分析各種靈異現象。詳解GitObject(Git物件)包括Blob(團)和Tree(樹)和Commit(提交)和Tag(標籤)。討論Compress(壓縮)和ShrinkRepository(縮減倉庫)。
  • 討論在「.git/object」中的3種「GitObject-Blob、Tree、Commit」底層物件觀念。
  • 討論「Branch、HEAD、DetachedHead」(分支、頭、獨立頭)的底層觀念。
  • 討論「RecoverCommit」(復原提交)的底層觀念。
  • 討論「FastForwardMerge、3WayMerge、ORIG_HEAD」(快進合併、三路合併、原始頭)的底層觀念。
  • 討論「LocalBranch、RemoteTrackingBranch、RemoteBranch」(本地分支,遠端追蹤分支,遠端分支)底層觀念。
  • 討論「AnnotatedTag、LightweightTag」(標示標籤、輕量標籤)和「LocalTag、RemoteTag」(本地標籤、遠端標籤)底層觀念。
  • 討論「git push origin -u [branch1] [branch2]...etc」底層觀念,避免使用「git push --all、git push origin [Branch]」底層觀念。
  • 討論「git fetch、git pull」所產生的「FETCH_HEAD」底層觀念。
  • 討論「git fetch --prune、git fetch --prune --prune-tags 底層觀念。
  • 討論壓縮底層觀念,包括「git gc、git verify-pack -v "xxx.pack"、git unpack-objects」(壓縮物件、查看被壓縮的物件、解壓縮物件)。
  • 討論執行「git add」所造成的「DanglingBlob(懸空Blob)的底層觀念。
  • 討論執行「DeleteBranch(刪除分支)所造成的「DanglingCommit(懸空提交)的底層觀念。
  • 討論執行「git rebase」後,而舊的「Commit」(提交)會變成「DanglingCommit」(懸空提交)的底層觀念。
  • 討論執行「git reset」,而「DeletedCommits」(被刪除的提交)會變成「DanglingCommit」(懸空提交)的底層觀念。
  • 討論刪除「AnnotatedTag」(標示標籤)的底層觀念,這會刪除此「GitReference-.git/refs/tags/1.0.1」,然後「GitTagObject-.git/objects/XX/XXXX...」就會變成「DanglingTag」(懸空標籤)。
  • 討論所有的「DanglingCommit(懸空提交)都會連接到它自己的「Trees、Blobs」。
  • 示範刪除全部的「DanglingCommit(懸空提交)的底層觀念。
  • 討論如何「ResetGitRepository、ShrinkGitRepository」(重製Git代碼倉庫、縮小Git代碼倉庫)的底層觀念。
  • 討論「origin」的底層觀念。

🚀7-1-8-GitEpisode8(第8篇)-GitHub、CentralizedWorkflow、FeatureBranchWorkflow、ForkingWorkflow、GitFlowWorkflow(Click here)

  • 🚩深入討論GitHub的實用技巧。討論CentralizedWorkflow(集中式工作流)和FeatureBranchWorkflow(功能分支工作流)和ForkingWorkflow(叉工作流)和GitFlowWorkflow(Git流工作流)。
  • 介紹「GitHub-Watch、Star、Fork、TagAndRelease、Branch、Commit、GitClone、DownloadZip」(看、星、標籤和發行、分支、提交、Git複製、下載Zip)。
  • 討論「GitHub-Wiki、README.md、Tag、Release、Page、CustomDomain」(維基,讀我、標籤、發行、頁、自訂網址)。
  • 討論"GitHub-Collaborator、Project、Issue、PullRequest"(共同開發者、專案、議題、請求合併)。封存在「Project」(專案)的「Issue」(議題)。
  • 討論「DefaultBranch」(預設分支)和「BranchProtectionRules」(分支保護規則)。
  • 討論「"GitHub-Organization、Team、Project」(機構、組、專案)。
  • 討論「Organization-Repository"」(機構-代碼倉庫)、「Organization-Member」(機構-組員)、「Organization-Team」(機構-組)、「Organization-Team-Member」(機構-組-組員)。
  • 比較「Organization-Project」(機構-專案)和「Organization-Repository-Project」(機構-代碼倉庫-專案)。
  • 討論「Organization-ParentTeam」(機構-父組)和「Organization-SecretTeam」(機構-密組)。
  • 討論使用「Fork」來備份其他人的「GitHub-PublicRepository」(GitHub公開倉庫)。
  • 討論使用「Fork、PullRequest」來合併自己的修改到其他人的「GitHub-PublicRepository」(GitHub公開倉庫)。
  • 使用「SourceTree-GitFlow」按鈕和「Git指令」來實作「GitFlowWorkFlow」(Git流工作流)理論。
  • 討論「CentralizedWorkflow、FeatureBranchWorkflow、ForkingWorkflow、GitFlowWorkflow」(集中式工作流、功能分支工作流、叉工作流、Git流工作流)。


跟著我走,手把手,扎實打底,完全精通「版控神器Git」

市面上有不少免費或是付費的「Git課程」,但是,您是否覺得,每次學完之後,總是不夠自信地說,「Not a problem!!!」。

但為什麼學完之後,卻還是被Git,東卡西卡,發好人卡,得不到好結果呢?

在工作中,可能只是執行「git merge」,然後產生「Conflict」(衝突),就讓你驚慌失措,不知如何是好。

遇到突發狀況,上網問卦,網友全掛,老闆問話,只好求老闆,把你當個屁給放了。

其實,很多時候,只要使用「P4Merge」,滑鼠點一點,「Conflict」(衝突)就可以輕鬆搞定,讓您起死回生,哼哼哈兮(OS: 別拿出雙節棍)。當您身邊,沒有人可以帶您入門的時候,或是,前輩怎麼講,您都聽不懂的時候,「版控神器Git眉角學程」就是您居家旅行,必備良藥,強力推薦。

#「版控神器Git速成班」,超過34個小時,內容是擷取「版控神器Git眉角學程」中,使用「SourceTree」的部分,還有少許部分的「Git指令教學」,帶您快速入門,應付工作。版控神器Git速成班」適合新手,但是不推薦給已經在工作的老手。如果您已經工作滿一年了,建議服用「版控神器Git眉角學程」,好好扎實打底吧。

#「版控神器Git眉角學程」,總共有8個課程,超過132個小時,適合新手,也完全適合已經在工作的老手。透過精心設計的學習步驟,鉅細靡遺的「示範教學」,「從零開始」,手把手,一門銜接一門,扎實打底,循序漸進,「從實戰到應用,再到底層觀念,帶您融會貫通,徹底理解」,完全攻略「版控神器Git」,讓你可以有自信地說「Not a problem!!!」。

當別人還在,舉頭望鳥巢,低頭說臥槽的時候。我的課程,已經可以讓您,同時精通「SourceTree、TortoiseGit、Git指令」,互相配合的「三刀流」工作模式(OS: 沒看過One Piece嗎?)。

為什麼我們需要使用到Git?

首先我們先思考一下這個情境,如果你獨立工作,你沒有任何的團隊,你當然可以用任何方法去管理你的程式碼。舉例來說,你可以用Folder(資料夾)的命名方式來管理你的程式碼的Version(版本)。資料夾可以取名為OnlineGameV1_20200401或是OnlineGameV2_20200402,也就是「軟體名稱_版本名稱_出版日期」這樣的命名方式。

但是這種方式實在很難在團隊裡面被使用,請你思考一下這個情境,在軟體開發過程中,我們常常會在不同的團隊之間打轉,每個團隊大概都有不少人 我們要如何保證程式碼版本不會失控?

所以我們需要一種東西,這東西可以記錄「What、Who、When、Where、How」。

  • What - 發什麼什麼事情?
  • Who - 是誰幹的? (兇手是誰?)
  • When、Where、How - 何時發生? 案發現場在哪? 怎麼發生的?

我們需要一種東西,這種東西可以將所有的工作拆散成多個小工作,然後分派給不同的組員,讓大家各個擊破。然後組員可以將這些小工作完成後,上傳到一個固定的地方。這個固定的地方可以合併所有人的程式碼,並且變成一個IT產品。另外,開發過程中,難免會產生Bug,所以我們需要一個「程式碼時光機」,用來比較程式碼在不同的時間點有什麼不同的變化。透過這樣的比較,我們可以調查出是什麼問題產生這個Bug。甚至,我們可以透過「程式碼時光機」穿越到不同的時間點去修改該時間點的程式碼,進而解決修復此Bug。「版控神器Git」可以讓這些成為現實!!!

Git要從哪邊開始入門?

版控神器Git」是一個超級強大的版控工具,個人和團隊都適用,幾乎是每個工程師不可或缺的技能。但是「Git指令」其實很不容易入門。常常很多人只要看到黑色的「GitBash」畫面,需要輸入「Git指令」,就不知道要從何下手,只好就兩手一攤,求放過。所以,我個人建議,初學者最好透過「Git圖形介面工具」入門。但是,市面上有很多「Git圖形介面工具」,到底要用哪一個呢?

我個人是推薦使用「GitKraken」。GitKraken的圖形介面真的是讓我覺得非常的直覺,不需要經過太多訓練,很快就可以上手。但是,GitKraken並不是每個功能都是免費的。免費版本的GitKraken只是閹割版本的GitKraken。舉例來說,如果要執行「git clone」複製遠端的PrivateRepository(私人代碼倉庫),那麼就必須使用付費版本的GitKraken。事實上,在現實工作環境中,並不是每一個公司都願意付費使用GitKraken。所以,我個人只好推薦兩個「完全免費Git圖形介面工具」。

  • 「Atlassian公司」出版的「SourceTree」
  • 開源的「TortoiseGit」

SourceTree」和「TortoiseGit」都可以執行「git clone」複製遠端的PrivateRepository(私人代碼倉庫),並且完全免費,無須任何負擔,可以輕鬆透過圖形介面學會各種「Git觀念」。其中,我個人認為「SourceTree」圖形介面比「TortoiseGit」圖形介面更直覺。我個人平常是比較偏好於使用「SourceTree」搭配「Git指令」來完成工作。但是別擔心,本「版控神器Git眉角學程」是 「三刀流課程」,會讓你同時精通「SourceTree、TortoiseGit、Git指令」。

個人建議Git安裝步驟

# 工欲善其事,必先利其器。(請參考「工具安裝」- T18ToT26)

🍳 步驟1: 下載與安裝Git for Windows (or Git for Mac)

🍳 步驟2: 註冊Git Server

E.g. AzureDevOps、GitHub、GitLab、BitBucket

🍳 步驟3: 安裝Git GUI (Graphic User Interface 圖形介面)

E.g. SourceTree、TortoiseGit、GitHub Desktop、GitKraken、GitExtensions、SmartGit、Git in Visual Studio...etc

🍳 步驟4: 安裝Diff and Merge GUI (Graphic User Interface 圖形介面)

E.g. P4Merge、WinMerge、Meld、Beyond Compare、Araxis Merge、KDiff3、DeltaWalker、Code Compare、Integrations...etc

📐圖解3WayMerge(三路合併)

# 請參考【GitEpisode2(第2篇)-Branch、Merge】(T9)關於3WayMerge(三路合併)

📏圖解FastForwardMerge(快進合併)、NonFastForwardMerge(非快進合併)、NoFastForwardNoCommitMerge(非快進非提交合併)

# 請參考【GitEpisode2(第2篇)-Branch、Merge】(T8)關於FastForwardMerge(快進合併)、NoFastForwardMerge(非快進合併)、NoFastForwardNoCommitMerge(非快進非提交合併)

🍻圖解SquashMerge(壓縮合併)

# 請參考【GitEpisode2(第2篇)-Branch、Merge】(T10)關於SquashMerge(壓縮合併)

🍒圖解CherryPick(採櫻桃)

#【GitEpisode2(第2篇)-Branch、Merge】(T11)關於CherryPick(挑櫻桃)和CherryPickNCommit(採N個櫻桃)

🍒圖解CherryPickNCommits(採N個櫻桃)

# 請參考【GitEpisode2(第2篇)-Branch、Merge】(T11)關於CherryPick(挑櫻桃)和CherryPickNCommit(採N個櫻桃)

深入「HttpsClone、SshClone-PuttyKey、SshClone-OpenSsh」

# 請參考【GitEpisode3(第3篇)-LocalBranch、RemoteTrackingBranch、RemoteBranch、AnnotatedTag、LightweightTag】T13ToT18

(T13)關於Https的GitClone

(T14)關於Https的GitClone,同1個電腦2個帳號

(T15)關於SshClone-PuttyKey

(T16)關於SshClone-OpenSsh

(T17)關於SshClone-OpenSsh,同1個電腦2個帳號

(T18)關於SshClone-OpenSsh的ProjectKey

有2種執行「git clone」的方式,就是「HttpsClone」和「SshClone」。其中又有2種執行「SshClone」的方式,就是「SshClone-PuttyKey、SshClone-OpenSsh」。我個人推薦使用「SshClone-OpenSsh」。「HttpsClone」複製下來的「Repository」(代碼倉庫),可以使用「SourceTree、TortoiseGit、Git指令」同時操控,如果同一台電腦只需要登入一個帳號,強力推薦使用「HttpsClone」。「SshClone-PuttyKey」複製下來的「Repository」(代碼倉庫)可以使用「SourceTree、TortoiseGit」同時操控,很難使用「Git指令」操控,非常不推薦使用。「SshClone-OpenSsh」複製下來的「Repository」(代碼倉庫)可以使用「SourceTree、Git指令」同時操控,如果同一台電腦必須要登入多個帳號,只需設定「~/.ssh/config」檔案和「.git/config」檔案即可,所以強力推薦使用「SshClone-OpenSsh」。

SshClone」的觀念是產生一組相對應的「PublicKey」(公開鎖匙)和「PrivateKey」(私人鎖匙)。「PublicKey」(公開鎖匙)必須上傳到「GitHub、GitLab、BitBucket、AzureDevOps」。「PrivateKey」(私人鎖匙)留在本地端。如果本地端特定的「PrivateKey」(私人鎖匙)可以對應到「GitServer」(雲端Git伺服器)特定的「PublicKey」(公開鎖匙),那我就可以執行「git clone」。

根據「Permission」(權限),又細分為2種「PublicKey」(公開鎖匙)。第1種是「PublicKey-AccountKey」(公開Key-帳號Key),可以執行「git clone」來複製我的「Account」(帳號)底下所有的「RemoteRepository」(遠端代碼倉庫)。第2種是「PublicKey-ProjectKey」(公開Key-專案Key),只能執行「git clone」來複製某一個特定的「RemoteRepository」(遠端代碼倉庫)。「GitHub、GitLab」的「PublicKey-ProjectKey」(公開Key-專案Key)其實就是「DeployKey」,權限可設為「Read、Read&Write」。「BitBucket」的「PublicKey-ProjectKey」(公開Key-專案Key)其實就是「AccessKey」,權限只能設為「Read」,不能設為「Read&Write」。「AzureDevOpsService」沒有「PublicKey-ProjectKey」(公開Key-專案Key),只有另一個不同的觀念「PersonallyAccessToken」(個人存取令牌)

圖解「LocalBranch、RemoteTrackingBranch、RemoteBranch」(本地分支、遠端追蹤分支、遠端分支)

# 請參考【GitEpisode3(第3篇)-LocalBranch、RemoteTrackingBranch、RemoteBranch、AnnotatedTag、LightweightTag】(T19)LocalBranch和RemoteTrackingBranch和RemoteBranch;Fetch和Pull和Push

圖解「Tag」(標籤)

# 請參考【GitEpisode3(第3篇)-LocalBranch、RemoteTrackingBranch、RemoteBranch、AnnotatedTag、LightweightTag】(T22)關於Tag

圖解「Index、GitDiff、Patch」

# 請參考【GitEpisode4(第4篇)-Diff、Patch、GitIgnore、Stash、WorkTree、GitBlame、GitShow、GitBundle】(T25)關於index。關於GitDiff和Patch

圖解「RebaseBranch」

# 請參考【GitEpisode5(第5篇)-Rebase、Revert、InsertCommit、UpdateCommit、DeleteCommit】(T40)RebaseBranch(重設分支起點)。UndoRebaseAfterRebaseAfterPush(Rebase之後Push之後UndoReBase)

圖解「GitHook」

# 請參考【GitEpisode6(第6篇)-BackUp GitConfig、GitHook、Jest、PreCommit、Husky、Eslint、EslintConfig、LintStaged】(T41)關於GitHook

圖解「Git底層觀念 - Blob、Tree、Commit」

# 請參考【GitEpisode7(第7篇)-GitObject、Blob、Tree、Commit、Tag、Compress、ShrinkRepository】(T48)討論Blob、Tree、Commit這三個GitObject。討論Branch、HEAD、DetachedHead。討論RecoverCommit(復原提交)。討論FastForwardMerge(快進合併)、3WayMerge(三路合併)、ORIG_HEAD

圖解「Git底層觀念 - Fetch、Pull、Push」

# 請參考【GitEpisode7(第7篇)-GitObject、Blob、Tree、Commit、Tag、Compress、ShrinkRepository】(T49)討論Fetch、Pull、Push。討論LocalBranch(本地分支)、RemoteTrackingBranch(遠端追蹤分支)、RemoteBranch(遠端分支)。討論LocalTag(本地標籤)、RemoteTag(遠端標籤)。討論git gc(壓縮物件)、git verify-pack -v(查看被壓縮的物件)、git unpack-objects(解壓縮物件)

圖解「Git底層觀念 - Shrink Repository」

# 請參考【GitEpisode7(第7篇)-GitObject、Blob、Tree、Commit、Tag、Compress、ShrinkRepository】(T50)刪除DanglingGitObjects(懸空Git物件)