# Command Line and Git ###### tags: `Lidemy` 以下為 Lidemy [MTR05] 課程筆記,如有錯誤,歡迎留言/寄信通知,感謝。 ## Command Line Interface (CLI) ### 什麼是 Command Line ? 簡單來說,就是與電腦溝通的語言,傳遞你要的訊息給這台~~笨~~電腦。在電腦剛被發明出來的時候,沒有大家看到膩的 GUI (graphical user interface),而是 CLI (command-line interface),盡是黑白的文字行命令界面,是一個沒有色彩的世界QQ。 ### 如何進入 command line 環境 ? mac OS: 電腦搜尋 terminal 即可 windows OS: 下載 Git,到 Git 官網 -> https://git-scm.com/ **windows 也有內建的 cmd 可用,但要留意環境造成的指令差異就是!* > 進入到 CLI 世界後,就是開始使用鍵盤的時間,~~這時候就可以把滑鼠丟掉惹(誤)~~。 - ### 常見且入門的 CLI 指令 - 查看指令手冊:`man` - 查看當前位置:`pwd` - 切換硬碟,以 D Drive 為例:`d:` - 列出當前位置的檔案清單:`ls` - 前進或後退:`cd` - 退到上一層:`cd + ../` *點點代表上一層,所以要回到上上層則是 -> `cd + ../../` - 進入下一層:`cd + 你要去的位置` - 新增資料夾:`mkdir + 名稱` - 新增檔案: `touch + 名稱` *注意`touch`有另一個功能,若本身檔案已經存在,使用`touch`可以刷新存檔時間 - 刪除: `rm + 要刪的檔案` *`rmdir` 刪除空資料夾,若資料夾內有檔案就無法刪除。 *`rm -rf` 刪除整個檔案/整個資料夾 - 移動/改名:`mv + 要移動的檔案 + 目標位置` - 複製:`cp`:`cp + 要複製的檔案 + 新檔案的名稱`,若是資料夾的話則需要加上 "-r":`cp + -r + 要複製的資料夾 + 新資料夾的名稱` > Vim 模式,類似一個 CLI 的記事本,但你無法用滑鼠去操作。 `i` 編輯模式 `:q` 退出 `:wq` 存檔後退出 `:q!` 不存檔直接退出 --- ## Git ### 什麼是 Git ? 簡單來說,Git 就是為版本控管而產生的程式,無論是小的、大的、個人的、團隊的 Project,都會有一堆需要新增、更改、刪除、Debug 等等的東西,導致你無形中會產生不同版本,若你想保留舊版、新增分支版本、回到舊有版本時,沒有一項合適的工具,就會讓你陷入繁瑣的步驟中,不論是手動開啟/儲存不同版本的地方、還是要手動記錄每個版本的資訊(如日期、時間、內容等),都讓你花上不少時間跟心力,而 Git 就是來幫你搞定這一切的幫手。 ### Git 的基礎使用 0. 實際操作開始前,請先到你要操作指令的目錄,例如:`D:\Hello\HW` 1. `git init`,初始化 Git 的指令,輸入後 Git 就會把它預設的配置都載到這個目錄下 2. `git status`,查看版本控管的指令,看是否有成功新增,若有像 `On branch master` 或 `Initial commit` 等字眼的出現,代表說你成功啦! 3. `git add`,加入版本控制的指令,當你的檔案都在 Git 的目錄下,而你也決定要把他們加入版本控制中,就狠狠地把這個指令打下去! 4. `git commit`,新建一個版本,一直提版本控制這四個字,要開始控制前總要有版本才能執行吧,因此這個指令就是用來新增你要的版本,指令一下後,通常會進入到一個叫"Vim"的環境,就是類似 CLI 上的記事本,讓你記下這一版本的記號或資訊,但要搭配一些指令,上一部分有稍微提到,建議將記號或資訊這一步加到指令上,例如:`git commit -m "1st version, I am handsome"`,當中 m 代表 message,後面搭配你這個版本的訊息。 4. `git log`,版本歷史記錄,一本屬於你這個專案的歷史記錄文獻 5. `git checkout`,回到某個版本上,搭配某個版本的 commit ID 就能使用,例如:`git checkout IDIDIDIDID123`,若現有的版本爆炸了,~~或是你人因為 Debug 而快爆炸了~~,不要再自虐了,check it out! 6. `git branch`,branch 這東西就是類似分支的部分,在一個 Project 開發中,會有機會用到分支的東西,確保 Project 可以在正常的運作的同時,去做一些修改更新的動作,最後再把它們合併,無縫接軌,繼續前進,朝更好的版本邁進。 ### GitHub 這東西 在開發一個 Project,通常還是需要夥伴,那夥伴之間該如何溝通呢,就是透過 GitHub,其中一個視覺化的版本控制倉庫(其他相似的軟體如 GitLab),讓你們之間的行踪(程式執行動作)都被看光光。 接下來的部分會略說 GitHub 的一些基本功能,把 code 放到 GitHub 這一步之前,要先到 GitHub 創建一個倉庫,創建後 GitHub 會很貼心地把相關的 CLI 直接給你,只需要按著需求,複製貼上在你主機上的 CLI 工具上,就能連接成功! `git push origin + branch名稱`:剛你在自己主機端成功 commit 後,因為這個一個團隊的工作,你總要給夥伴知道吧,因此請使用上述指令,將東西 push 到線上倉庫。 `git pull origin + branch名稱`:與上一步相反,當你夥伴 push 最新的東西到倉庫,那你可以透過 pull 的指令把最新的東西從倉庫抓回自己家。 - 常見入門的 GitHub 指令 `git push` commit 完要 push,否則無法同步 `git pull` 從遠端抓回來 `git clone` 把別人的 repository 抓來自己電腦 `git commit --amend` commit 後要改東西 e.g. branch 名字打錯,用指令進去 vim 改名稱 `git reset --soft || mixed || hard` 回覆 commit 前的狀態 `git checkout -- . || docName` 尚未 commit 但改的東西不要惹 `git branch -m branchName` 改 branch name `git checkout branchName`抓遠端的 branch > Git Workflow (模擬流程1) 1. 創建 GitHub 賬號 2. 加入你選好的 GitHub repository 3. 使用 Git clone + GitHub 上給予的 HTTPS URL 把檔案抓到 local 端 e.g. `git clone https://github.com/HAHAHAHA.git ` 4. 在 local 端完成作業 5. 使用 `git status` 查看分支狀態,想要細心一點可以加上 `git diff` 查看剛才新增或修改的內容 6. 建立屬於這份作業的 branch 並切換過去,以建立"version_1" branch 為例:`git checkout -b version_1` 7. 新增版本名稱並 commit,以 v1_addHTML 為例:`git commit -am 'v1_addHTML'` 8. 將 local 端的 branch (week1)發送到遠端(GitHub):`git push origin version_1` 9. 確認 GitHub 上是否有新的 branch,並點擊 "Compare & pull request" 按鈕,將 version_1 branch 合併進去遠端 master branch 10. 點擊 "Create pull request" 按鈕 11. 點擊 "Files changed" 確認新增/更改的作業內容是否正確,無需請直接到下一步,需要的話則是重新修改版本並再 push 一次: `git commit -am 'v1_updateSomething'` + `git push orgin version_1` >Debug 情景:一直無法回到 initial commit 的階段,windows 解決方法: 1. `git checkout master` 2. `git pull origin master // 拉下遠端的 master分支` 3. 有 conflic(衝突),將有衝突的檔案恢復到最初始狀態 4. `git commit -am "Initial commit 2"` 5. `git log`檢查是否已經在 commit 2 的狀態 6. `git push origin master`卻出現:`failed : Updates were rejected becuase the tip of your current branch is behind bla bla bla` 7. `git pull origin master` 再pull一次,出現`fatual: refusing to merge unrealted histories` 8. `git push origin master`再push一次,出現: `Failed to push... hint: Updates were rejected because the tip of your current branch is behind` 9. 使用:`git push -f origin master` [-f : 參考Stackoverflow](https://stackoverflow.com/questions/6632191/how-to-revert-initial-git-commit/42933031)