--- title: Git使用心得 tags: Git 版本控制 description: Use `{%hackmd theme-dark %}` syntax to include this theme. --- <style> html, body, .ui-content { background-color: #333; color: #ddd; } .markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6 { color: #ddd; } .markdown-body h1, .markdown-body h2 { border-bottom-color: #ffffff69; } .markdown-body h1 .octicon-link, .markdown-body h2 .octicon-link, .markdown-body h3 .octicon-link, .markdown-body h4 .octicon-link, .markdown-body h5 .octicon-link, .markdown-body h6 .octicon-link { color: #fff; } .markdown-body img { background-color: transparent; } .ui-toc-dropdown .nav>.active:focus>a, .ui-toc-dropdown .nav>.active:hover>a, .ui-toc-dropdown .nav>.active>a { color: white; border-left: 2px solid white; } .expand-toggle:hover, .expand-toggle:focus, .back-to-top:hover, .back-to-top:focus, .go-to-bottom:hover, .go-to-bottom:focus { color: white; } .ui-toc-dropdown { background-color: #333; } .ui-toc-label.btn { background-color: #191919; color: white; } .ui-toc-dropdown .nav>li>a:focus, .ui-toc-dropdown .nav>li>a:hover { color: white; border-left: 1px solid white; } .markdown-body blockquote { color: #bcbcbc; } .markdown-body table tr { background-color: #5f5f5f; } .markdown-body table tr:nth-child(2n) { background-color: #4f4f4f; } .markdown-body code, .markdown-body tt { color: #eee; background-color: rgba(230, 230, 230, 0.36); } a, .open-files-container li.selected a { color: #5EB7E0; } </style> # Git版本控制 筆記 ### 安裝 Git - Windows ``` 進入官網 http://git-scm.com/ ``` ### Windows Terminal 美化 (oh-my-posh3) 有鑑於Windows Terminal真的是醜到無法言喻,雙系統都有用的我更加難以忍受,於是美化它變成了必備的課題,共勉之。 1. 直接在微軟商店搜索oh my posh下載安裝(沒有Windows Terminal的可以安装一下Windows Terminal) - [Windows Terminal](https://docs.microsoft.com/zh-tw/windows/terminal/install) - [oh my posh](https://apps.microsoft.com/store/detail/ohmyposh/XP8K0HKJFRXGCK?hl=zh-tw&gl=TW) - [字體-MesloLGM NF](https://link.zhihu.com/?target=https%3A//github.com/ryanoasis/nerd-fonts/releases/download/v2.1.0/Meslo.zip) - 安裝完成後,打開Windows Terminal,按Ctrl+Shift+, 開啟settings.json更改字型避免亂碼 - 回到Windows Terminal -> notepad $profile 第一次會顯示找不到文件檔,創建新文件並且輸入"oh-my-posh init pwsh | Invoke-Expression"並且保存 ``` // Windows Terminal -> Ctrl + Shift + , -> settings.json profiles: { "defaults": {}, } // 改成 profiles: { "defaults": { "font": { "face": "MesloLGM NF" } }, } // Windows Terminal -> notepad $profile 第一次會顯示找不到文件檔,創建新文件並且輸入"oh-my-posh init pwsh | Invoke-Expression"並且保存 // Error 出現無法載入Windows Powershell XXXX.ps1檔案 如果出現無法載入Windows Powershell XXXX.ps1檔案,先開啟Powershell並且輸入"Set-ExecutionPolicy RemoteSigned",然後改為Y即可變更執行原則 // 更改主題配置 輸入"Get-PoshThemes",複製喜歡的主題樣式檔案路徑,重新輸入"notepad $profile"開啟文件檔,將內容改為"oh-my-posh init pwsh --config "C:\Program Files (x86)\oh-my-posh\themes\dracula.omp.json" | Invoke-Expression" ``` ### git 概念 - 目的:有效管理多位工程師所寫的程式,達到多人協作開發 - .git 資料夾 - 用途:管理該repository中的Git版本控制的所有資訊 - 常見的Git管理工具 - Intellij(JetBrains 旗下IDE) - 終端機指令 - SourceTree - .gitignore - 用途:設定要忽略哪些檔案,符合條件的檔案,不會被加入版本控制系統 - 需要提前設定 - 用法: - intellij創建Spring Boot專案時會自動產生 ``` // if no files $ touch .gitignore // example index.html css/ *.html ``` ### git 常用指令以及名詞 ``` master:本地端master origin/master:雲端倉庫master git pull git push -u origin [branch] git checkout -b [branch] ``` ### 創建Repository ### 更換https / ssh ### 在電腦上設定ssh金鑰 打開 Terminal 輸入 ``` $ ssh-keygen -t rsa -b 4096 -C "your_email@example.com" ``` 輸入後就會出現下面這幾行: ``` Generating public/private rsa key pair. Enter a file in which to save the key (/Users/you/.ssh/id_rsa): [Press enter] Enter passphrase (empty for no passphrase): [Type a passphrase] Enter same passphrase again: [Type passphrase again] Generating public/private rsa key pair. 此行的意思就是會根據提供的 email 創建一個新的 SSH 金鑰。 Enter a file in which to save the key (/Users/you/.ssh/id_rsa): [Press enter] 這一行是確認儲存的位置,可以直接按下 Enter 就好。 Enter passphrase (empty for no passphrase): [Type a passphrase] Enter same passphrase again: [Type passphrase again] 這兩行是要輸入密碼與確認密碼,如果不輸入就空白即可。 加入 SSH-Agent - 確認 ssh-agent 啟動 $ eval $(ssh-agent -s) 將 SSH Key 加入 GitHub 帳號中 - 輸入以下指令,複製 SSH Key 至剪貼簿 - windows : cat ~/.ssh/id_rsa.pub - mac : cat ~/.ssh/id_rsa.pub | pbcopy 接著去GitHub設定SSH and GPG keys貼上即可 測試 SSH Key 聯繫 - 開啟 命令提示字元 或是 Git Bash - ssh -T git@github.com 出現以下訊息就是成功了~ Hi username! You've successfully authenticated, but GitHub does not provide shell access. ``` ### 每次push / pull 不用輸入密碼的方式 ``` // Start ssh-agent if not started: $ eval `ssh-agent -s` // Add your private key using ssh-add $ ssh-add ~/.ssh/id_rsa Enter passphrase for /home/user/.ssh/id_rsa: Identity added: /home/user/.ssh/id_rsa (/home/user/.ssh/id_rsa) // Check if the key is added (parameter is a lowercase L): $ ssh-add -l 2048 55:96:1a:b1:31:f6:f0:6f:d8:a7:49:1a:e5:4c:94:6f /home/user/.ssh/id_rsa (RSA) // Try to connect to your Git server: $ ssh git.example.com ``` ### Git Branch概念 - 每一個branch就是一個平行世界,不會互相影響 - 透過git checkout指令去切換branch ### 合併分支 - 使用Git的merge指令(非常少用) ``` 將branch內的commit合併到master裡面 接著將包含新的commit的master push到雲端上 tips:更改了什麼,其他工程師很難知道,而且直接合併到master容易影響系統 ``` - 提交Pull Request(最常用,目前主流) ``` 將分支push到雲端上後 在雲端上提交Pull Request tips:其他工程師可以查看你在branch中進行的改動(一般稱為code review) ``` ### 處理branch的合併衝突(Merge Conflict) - 一般發生在多位工程師,同時去修改同份檔案的情況下 - 最容易出錯的地方,要特別注意 ### Git指令 - Stash - 用途:暫存程式的改動 - 使用情境: - 在切換Branch之前,如果程式寫到一半,可以先Stash暫存 ``` git stash // 查看有哪些暫存 git stash list // 復原暫存 git stash pop // 清除最新暫存 git stash drop // 清除全部暫存 git stash clear ``` ### Git指令 - Merge、Rebase、Squash - 用途:皆可以用來合併branch,差別在Git線圖以及Commit紀錄 ### 修改Commit Message - 用途:當發現舊有Commit註解,去修改為正確的註解方便日後維護可讀性 - 基本上一開始註解照著規範去走,避免日後出現要修改的情況出現,修改message建議只在一人開發時使用 ``` // 使用git rebase -i HEAD~5確定要修改哪些commit // 其中,HEAD~5表示最近的5個,後面的5可以改成其他數字。 git rebase -i HEAD~5 ---------------------- // 接著會列出最近五筆commit pick 1d316b0 message01 pick f429786 message02 pick 880cfbc message03 pick c55cf56 message04 pick d10fd07 message05 左邊第一列表示命令(command) 中間一列表示commit id 最右邊一列是我們之前提交的message 這裡的展示順序 是按事件順序排列的 就是說第一行是最早提交的資訊 ---------------------- // tips: 按i進入編輯模式、esc離開編輯模式、:wq儲存離開 假設我們需要修改第2條和第4條commit的message 則需要將它們的命令(command) 由pick修改為edit 刪除則是改為drop 其它地方保持不變(此時還不用修改message) ---------------------- pick 1d316b0 message01 edit f429786 message02 <- 注意本行第一列的pick改為edit了 pick 880cfbc message03 edit c55cf56 message04 <- 注意本行第一列的pick改為edit了 pick d10fd07 message05 修改完成之後,儲存修改。 ---------------------- 儲存完了之後 git的分支就會發生改變 從原來的master改成了我們第一個edit的commit id test-rebase git:(master) > test-rebase git:(f429786) > // 修改message // tips: 按i進入編輯模式、esc離開編輯模式、:wq儲存離開 git commit --amend // 對修改進行儲存 git rebase --continue // 標記了幾個edit就重複幾次以上修改與儲存 Successfully rebased and updated refs/heads/master. // 使用git push -f強制更新遠端伺服器 git push -f ```