# Git 基本指令 ## 什麼是Git? - 分散式版本控制系統 - 記錄每次檔案變更、方便回朔及協作 - 詳細可參考: https://malleable-kip-65b.notion.site/Git-1f2e6bafc9f3809680a9c09d5d7c76cb ## 初始化設定 ```markdown= git config --global user.name "你的名字" git config --global user.email "你的MAIL" ``` ```markdown= git init # 將目前資料假變成git倉庫 git status # 查看目前狀態 ``` ## 建立版本紀錄 ```markdown= git add <檔案> # 加入暫存區 git commit -m "訊息" # 提交版本 ``` ## 查詢歷史版本紀錄 ```markdown= git log # 完整記錄 git log --oneline # 精簡版 ``` ## 與遠端連線 ```markdown= git clone <repo-url> # 複製專案 git remote add origin <repo-url> # 設定遠端(第一次才要) git push -u origin main. # 推送本地分支到遠端 ``` ## 常見遠端操作 ```markdown= git pull # 取得遠端最新版本並合併 git push # 將本地更新推送上去 ``` ## 分支管理與錯誤復原 ```markdown= git branch # 查看目前有哪些分支 git branch <名稱> # 建立新分支 git checkout <名稱> # 切換分支 git checkout -b <名稱> # 建立並切換分支 git merge <名稱> # 合併其他分支到目前 ``` ## 回復與取消變更 ```markdown= git diff # 查看修改內容 git checkout -- <檔案> # 回復指定檔案 git reset --hard <commit> # 還原到過去版本(⚠ 危險) ``` ## 其他補充指令 ```markdown= git branch -d <分支名稱> # 刪除本地分支 git push origin --delete <分支名稱> # 刪除遠端名稱為origin的<某個>分支 git branch -r # 查看遠端有哪些分支 ``` --- # 補充:git push 時發生帳號衝突該如何處理 >[!Note] 清除舊的GitHub憑證並重新登入 ### 1. 開啟系統的憑證管理工具: - Windows 開啟「憑證管理員」-> 選「Windows認證」 - MacOS 開啟 spolight ->「鑰匙圈存取」 ### 2. 刪除github憑證範例: - MacOS -> ![截圖 2025-05-14 晚上11.03.37](https://hackmd.io/_uploads/BkkfWNGZlx.png) - Windows ![image](https://hackmd.io/_uploads/SyAMtG7beg.png) ### 3. 找到與GitHub有關的項目,刪除舊的認證 - `git:https://github.com` ### 4. 回到VSCode,重新進行 `git push` ,這時GitHub會要求重新登入,請使用不衝突的帳號登入即可!!! --- ## 情境二:公司主管開分支,讓我們在分支上 fix bug Step 1. 主管在 GitHub 上建立新分支,如:develops Step 2. 先 `git clone` 專案資料夾到本地端 ```markdown git clone <repo-url> ``` Step 3. 將遠端分支拉到本地端 ```markdown git fetch origin <遠端分支名稱> ``` Step 4. 從 main 分支切換到 <遠端分支名稱> ```markdown git checkout <遠端分支名稱> ``` Step 5. 在分支上進行檔案修改 Step 6. 修改完成後切回 main 分支(本地端) ```markdown git checkout main ``` Step 7. 合併新分支(修改後內容)至 main 分支 ```markdown git merge <新分支名稱(本地端)> ``` Step 8. 確認無誤後,推送到 <遠端分支名稱> 做 pull request ```markdown git push -u origin <遠端分支名稱> ``` # 補充:建立裝置與 Github 的連線 => 主要分為 SSH 和 HTTPS 兩種連線方式 >[!Note] **SSH連線:** >### Step 1. 生成金鑰: >`ssh-keygen -t ed25519 -C "你的Email"` > >### Step 2. 複製公鑰內容: >1. 終端機輸入=> `cat ~/.ssh/id_ed25519.pub` >2. 複製這串公鑰 => `ssh-ed25519 AAAAC3...alex@example.com` > >### Step 3. 把公鑰貼到 GitHub: >![image](https://hackmd.io/_uploads/HJob5Ms-ge.png) > >### Step 4. 測試 SSH 是否連線成功: >終端機輸入:`ssh -T git@github.com` >如果設定正確,會看到訊息類似: >``` >Hi alexlin1127! You've successfully authenticated,.... >``` >### Step 5. 使用 SSH 下載 GitHub 專案: >使用SSH方法clone專案資料夾 >`git clone git@github.com:alexlin1127/your-repo-name.git` # 補充:PR衝突處理 :::warning 和他人合作專案 => 建議使用Merge版本,才不會改寫他人提交的版本歷史。 個人專案紀錄 => 可使用Rebase版本 ::: ## :gear: Merge 版本 - 使用 `git merge` 合併遠端 `main`(安全,不改寫歷史) - 操作流程如下:(假設本地開發分支為dev-alex) ``` git checkout dev-alex git fetch origin git merge origin/main ``` 1. 如果有衝突,Git 會提示你解決。 2. 解決完衝突後: ``` git add <解決的檔案> git commit ``` 3. 然後推送: ``` git push origin dev-alex ``` :::info 這樣會在你的分支上產生一個 merge commit,而不需要改寫歷史,也不需要強制推送。 ::: ## :gear: Rebase版本 📌1. 切換到開發分支(dev-alex) ``` git checkout dev-alex ``` 📌2. 將遠端最新的 main 更新到本地的 origin/main ``` git fetch origin main ``` 📌3. 對 origin/main 進行 rebase ``` git rebase origin/main ``` :::info ⛔ 若沒有衝突,Git 會自動幫你重新提交並完成 rebase ⚠ 若有衝突,Git 會停下來提示你解決它們。 ::: 📌4. 處理衝突(如發生) ``` git status ``` 出現以下: ``` You are currently rebasing. Unmerged paths: (use "git add <file>" to mark resolution) both modified: src/components/LoginForm.js ``` 編輯該檔案,解決衝突內容,例如: ``` <<<<<<< HEAD // 這是遠端 main 分支的內容 ======= // 這是你在 dev-alex 分支上的修改 >>>>>>> dev-alex ``` :::info 🔧 編輯後保留正確版本、刪除衝突標記。 ::: 📌5. 標記為已解決並繼續 rebase ``` git add <修正後的檔案> git rebase --continue ``` 重複以上步驟直到所有衝突都解決並重播完畢。 📌6. 將修正後的分支推回遠端(更新 PR) ⚠ 由於 rebase 改寫了歷史,這裡需要 強制推送: ``` git push --force-with-lease origin dev-alex ``` # 補充 Git 基本指令 git restore file.txt --staged => 將暫存區檔案退至工作區