Git 教學 2019/07/06 === ## Git 介紹 --- ## Resource * [練習REPO](https://gitlab.com/freefolk/git-practice) --- ## demo ```shell=zsh cd ~/.ssh && vim id_rsa.pub ``` --- #### 版本控制 * 當我存好一個 "置入 hero_image 的版本" 推上去且合併後,我會有一筆此版本的... - 本地端紀錄 (hero_image) - 雲端備份紀錄 (origin/hero_image) - 大家共同擁有的廣納百 川紀;///;'錄大家共同擁有的廣納百川紀錄的雲端備份紀錄 (master) - (origin/master) * 本地端 & 遠端? - 想像成兩條平行線 - 而且是像鏡子般的存在 #### 分散式系統 * 可以讓協作者各自擁有不同的版本 * 等到要合併時 `merge` 進共用的 `大版本` 裡 * 情境 * 當 A, B, C 都要編輯同一份文件時 * A 加在第 5-7 行 * B 修改第 6-10 行 * B 刪除第 7 行 * A: 阿乾.. 我剛剛做的東西咧? --- #### 擬人化 * 有點像 貼紙 or 旅行者 的概念 * 自己所在的版本可以想像是一個旅行者 * 而長出來的分支即為旅行者的 "足跡" * 旅遊路徑的概念 --- ## 環境建置 * [Git](https://git-scm.com/download/win) * [SourceTree](https://www.sourcetreeapp.com/) --- ## 名詞介紹 * branch - `git branch`: 看目前有哪些分支 - `git checkout branch remote_toby`: 切到 `remote_toby` 這個分支上 - * clone - `git clone`: 把人家的東西抓下來 * pull - `git pull`: 把遠端的拉下來後合併 - `git pull = git fetch + git merge` * add - `git add`: 快照起來 (狀態改變成 staging) * commit - `git commit`: 真正存起來,有一筆紀錄 * reset - `git reset --hard HEAD~n`: 請旅行者往回退 n 步 (時光倒流) - 如果沒有另一個旅行者幫你記錄現在的版本 (中間的路途會不見,要小心!) - --hard: 退至 tracked 狀態 --- ## 舉個栗子 ![](https://i.imgur.com/1pINuIc.png) --- ## 初始化專案 ```shell=zsh git init git remote add origin git@gitlab.com:freefolk/git-practice.git git add . git commit -m "Initial commit" git push -u origin master git config --global user.email "you@example.com" git config --global user.name "Your Name" # # -u: upstream 指定以後推到誰那邊 ``` --- ## SSH key 狀況如果遇到 - 打開GitLab專案 > profile > setting > 左欄ssh key - [連到這邊的指令](##demo) - [SSH wiki解釋](https://www.wikiwand.com/zh-tw/Secure_Shell) --- ## 資料狀態改變 untracked | | `從git ignore 拿開` ↓ tracked | | `git add ` ↓ staging | | `git commit` ↓ commit ![](https://images2015.cnblogs.com/blog/563688/201511/563688-20151111145707369-641572983.png) --- ## 常見使用情境 > 當在 `remote_toby` 做東西做到一半時... 1. 快照起來(此時資料會變成綠色的) - `git add <檔案>` - `git add .` - 全部都加 2. 存檔 - `git commit -m 'feat(package): add some packages to the list'` - -m: 簡短的描述 - 存完檔確認一下 3. 切到 master 進行 merge - `git checkout master` - `git merge remote_xxx` 3. 先更新本地端版本 (同步遠端的版本下來) - `git pull --rebase` - --rebase: 把足跡合併起來 - 如果是 `旅行者 A` rebase `旅行者 B`,則 A 會合併 B 的路進走在最前面 4. 可能狀況 - conflict - 手動排除並再 add 跟 commit 起來 - 順利 - `git push origin <遠端分支>` 5. 合回去 master 主幹道並上傳 - `git checkout master` - `git pull --rebase` - `git merge remote_toby` - `git push` ![](https://hellojs-tw.github.io/git-101/img/basic-remote-workflow.png) --- ## 額外延伸 * 發 PR (pull request) - 我想要對社群有所貢獻 - 即我開了一個 branch 再做一些優化 - 拜託把我合進去 --- ## 參考連結 * [環境建置 fot WIN](https://progressbar.tw/posts/1) * [Git Rebase](https://gitbook.tw/chapters/branch/merge-with-rebase.html) * [為什麼我的分支都沒有「小耳朵」](https://gitbook.tw/chapters/branch/merge-commit.html)
{"metaMigratedAt":"2023-06-14T22:40:53.558Z","metaMigratedFrom":"Content","title":"Git 教學 2019/07/06","breaks":true,"contributors":"[{\"id\":\"a13b7b1d-ac79-4ec7-94d9-bff8e975a6a8\",\"add\":3524,\"del\":736},{\"id\":\"f3728d6c-1a3a-4c71-8cd8-eafda6741402\",\"add\":152,\"del\":3},{\"id\":\"d8369d99-f7af-408a-af1e-f82005245fa6\",\"add\":93,\"del\":0}]"}
    143 views