# CMD101 & GIT101 # Command Line Interface 與電腦溝通的工具, 屬於純文字介面,與我們平常熟悉的圖形化使 用者介面不同Graphical User Interface(GUI) ## 基本操作 我們可以利用`git bash`來實際執行我們的CLI介面 ### pwd (print working directory) 印出目前所在位置  ### ls 印出現在位置的檔案清單 `-al` 會印出所有的資料例如檔案權限、檔案大小  ### cd (change directory) 切換資料夾 1. `cd 資料夾名稱` 2. `cd ..` 回到上一層 ### man 指令使用手冊,介紹指令的使用方式 例如: `man ls` ## 檔案操作 ### touch 建立檔案與更改檔案時間  ### rm 可以刪除你要的檔案  如果要刪除資料夾的話在後面加`dir` -> `rmdir 資ㄦ料夾名稱` 也可以用 `rm -r 資料夾名稱` 參數`-f`則是強制刪除 **(小心使用)** ### mkdir 建立資料夾  ### mv(move) 移動檔案或是改名  `mv 檔案名稱 ..`把檔案移到上一層 ### cp (copy) 複製檔案或者資料夾  如果要複製資料夾的話則需要多使用一個參數`-r`  ### grep 抓取關鍵字  ### wget 下載檔案 ### curl 送出 request 我們可以利用`curl API網址`,電腦就會利用get方法把respond給展示出來。因此可以用來測試API ## redirection (>) 利用`>`把input/output給重新導向  以這個例子,我們就利用`>`把資料重新導向到list_result的這個檔案裏面,並且如果再重新導向到同一個檔案`>`會把後面之前的內容全部覆蓋掉  如果我們要新增資料的話則是用兩個箭號 `>>`代表append的意思  ## pipe (|) 可以把左邊指令的輸出變成右邊指令的輸入  # Vim Vim 是一個文字編輯器,可以直接輸入`vi`就可以呼叫之 `vim 檔案名稱` 就可以進入編輯,如果要插入文字的話需要先輸入`i`,讓見面進入到編輯模式,按`esc`可以返回到普通模式,這時候就不能插入文字,只能刪除或者複製貼上。 離開的話則是輸入`:q`的指令,即可離開,而`:wq`則會儲存後再離開 `cat 檔案名稱` 則可以顯示檔案的文字內容 # Git Git 是⼀種分散式版本的版本控制系統,就像是我們以前做報告時,會把一份報告根據不同的更改紀錄而有不同的名稱,一個檔案會有不同的版本,我們希望能夠把這些版本都保存起來  我們這樣做會難以照到報告之間的關係是什麼,很難以得知哪一個檔案是根據哪一個為基底去做更改。因此當檔案量很多的話,我們就會希望有一個版本控制的系統來幫助我們使用 在團隊上,一個軟體的開發會有不同的分支,要從某一個版本切出不同的分支,再由這些分支合併  版本控制的流程: 1. 需要一個新版本時: 開一個資料夾,把資料放進去 2. 不想加入版本控制: 不要加入資料夾 3. 避免版本號衝突: 用看似術數的東西當作資料夾名稱 4. 知道位新版本: 用一個檔案來存 5. 會有個檔案來記錄歷史順序 通常我們是開一個新的branch 來做專業,為了保持master的穩定而不直接在master上面操作 ## Git 指令 ### git init 對我們的專案使用git這個軟體,主要⽬的是要讓 Git 開始對這個⽬錄進⾏版本控制。  這個指令會在這個⽬錄裡建立⼀個 .git 隱藏⽬錄,整個 Git 的需要的東西都在這個⽬錄裡。  ### git status 查看目前版本控制的狀態  ### git add 把我們想要的檔案加入倒版本控制中,而加入的同時我們可以看他們的狀態。如果出現 - untracked: 表示沒有加入到版本控制 - staged: 已經加入到版本控制,但還沒有正式加入倒新的版本 (changed to be committed 這區塊)  如果有很多檔案要加入的話,可以輸入 `git add .`,就可以一口氣把所有的檔案都加入到版本控制,也可以輸入資料夾名稱,把資料夾的所有檔案都加入版本控制  要記得加入版本控制這個動作是每次都要做一次,才能接下來的`git commit`的動作 ### git commit 新建一個版本,就像是新建一個資料夾,而它的名稱就是那一長串的亂碼編號 通常是在於完成一個小進度時再commit  沒有成功是因為我們沒有commit message,因此要改為`git commit -m "要輸入的訊息"`  再來查看他的狀態是否已經有新的版本  我們可以利用一個合併的語法,把`git add`和`git commit` 合併起來 `git commit -am "要輸入的訊息"`就可以把修改的檔案加入倒版本控制並且新建一個版本,但要記得她不會把新的檔案加入倒暫存區裡面 如果我們不小心訊息輸入錯誤的話,則可以利用`git commit --amend`來更改訊息   ### git reset HEAD^ 如果不想要這個commit時,想要收回可以利用`git reset HEAD^ --hard` 就會全部不見(包含改過的檔案)    我們就把它移除了,因此git log的時候剛剛的commit完全不見 如果想要改過的檔案還在的話,可以用`git reset HEAD^ --soft`指令  `HEAD^`: 上一個的意思,head指最前面的那個 ### git log 可以用來查看歷史紀錄  `git log --oneling`: 可以顯示出比較簡短的歷史紀錄  ### git checkout 可以回到過去的版本 `git checkout` 編碼: 回到那個狀態的檔案 `git checkout master` : 可以讓你回到最新的狀態 如果想要把檔案改回到還沒改過的檔案時,可以利用`git checkout --檔案名` 會回復到你上一個commit的狀態   ### .gitignore 可以把想要忽略的檔案放在裡面,可以想像這檔案會被排除在資料夾外 像我們之前的例子,有一個檔案test是我們不想要放進版本控制內的檔案(利入log紀錄檔或者作業系統的檔案,跟此專案本身沒什麼關係),因此我們可以把要忽略的檔案放在.gitignore裡面,做完後記得這個檔案本身也要加入到版本控制內(因為其他專案的人也要看到是什麼檔案被忽略)   (把test加入進去) ### git diff 可以看在你commit之前,做了哪些事情,看你這一次跟上一次的差別在哪  ## Branch  一條線的開發模式,其實問題很大,因為沒辦罰同時處理很多事情,因為東西都在同一條commit上  引進branch後,大家可以分工各做各的事情,平行開發,最後做完再把它們合併起來 再合併的部分其實就是把branch後面的分支拿下來,因為他們有共同的祖先,然而最麻煩的是兩個branch改道同一個檔案,會不知道要合併哪個檔案=> **conflict**  ### git branch 就像是複製一個資料夾近來 `git branch -v` 可以看到目前有哪些branch 再git裡面,master為主幹(最主要的分支) 如果要建立新的branch則輸入`git branch 名稱` 即可  刪除特定的branch `git branch -d 名稱` NOTE:`-d` 通常都是刪除的意思 如果要改名的話可以用`git branch -m 新的名稱`來執行 如果要抓遠端branch的話則可以直接利用 `git checkout branch名稱` git就會直接把遠端的branch給抓下來 ### git checkout 跟前面的checkout用法一樣 `git checkout branch-name`  我們讓這個分枝有個commit新的資料夾  ### git merge 當我們在分支開發完後,需要合併回master  指令: `git merge 名稱` 把新的分支**合併進去到master** 合併完後就可以把之前的那個branch給移除  conflict 假如在處理專案時,與同事同時更改到同一專案時,git會無法判別要使用哪一個檔案  此時需要手動來解決,git會出現衝突並且此時出現的衝突在哪裡,自己可以手動解決,最後在commit 即完成  Head 代表目前所在位置的檔案,我們必須決定合併完的內容要長怎樣  # github 主要功能可以放git repository的地方,讓大家可以多人協作共用一個git的project  issue: 可以當作一個專案的討論區 contributor: 有誰跟你一起協作 pull request: 當有一個branch想要合併到另一個branch的時候,可以利用它來做審核,直接在上面可以看到有直接在上面可以看到那些檔案改變,並且給予建議以及合併 ## 上傳code 首先直接點選github裡面的`new repository`  接著跟著只是 ``` git remote add origin https://github.com/impala8012/test1.git git push -u origin master ``` 把指令輸進去 就可以順利把檔案上傳進去 Note: 如果要複製貼上的話不能使用一般的Ctrl+c/+v 而是要用 ``` Ctrl+ins 複製 Shift+ins 貼上 ```   ### git push 指令 利用push指令來把本地最新的改變給傳上去  Github這邊也上傳成功  此外也可以上傳一個branch   ### git pull 如果有人改變了這個repository,我們要利用pull把這個改變給抓下來 首先假如我們在github裡面有座先更改  接著我們利用`git pull origin master`把最新的資料抓下來  ### pull request 可以在github的介面裡合併兩個branch,並且會顯示兩個file中的變化  點選compare & pull request   最後點選merge,並且可以delete branch 於是可以發現master branch已經把檔案給合併起來了  通常都會在github上面利用pull request合併 ### git clone 假如我們看到別人的repository不錯,我們可以利用git clone 把牠抓下來  可以複製裡面的網址然後輸入`git clone 網址`就可以把牠抓下來了 但是我們要注意這個是別人的repository,我們只能本地commit但不能push回去,因為我們沒有權限 如果要push上去的話,需要利用fork,把那個repository複製過來然後再重新clone一次  最後也可以push回去了  ## github pages github製造一個免費的靜態網頁的空間 ## github workflow 一個github的流程: 1. Create a branch 2. Add commits 3. Open a Pull Request 4. Discuss and review your code 5. Deploy 6. Merge GitLab 與 Bitbucket有其他類似github的服務 ## hook 在程式裏面的hook則代表發生某件事情的時候會通知我,可以偵測某些指令。例如有人commit時通知我或者有人push時通知我等等。 在我們.git的資料夾裡面有一個hook的資料夾 # Shell Script shell script (程式化腳本),是一個文字介面底下讓我們與系統溝通的一個工具介面,讓我們以更方便,更自動化的方式來執行想要執行的指令。快速的協助使用者 or 管理者大量地執行重複性的動作與指令。 ## Shell Script撰寫 在windows,我們可以利用git bash要執行Shell script 創建一個`.sh`的檔案 => `touch num.sh` 接著可以利用vim文字編輯器在裡面寫入我們要的程式 以Lidemy的作業為例: 寫一個 shell script,可以傳入一個數字 n,然後會產生 1~n 個檔案,檔名是 `{number}.js`。 這時候我們要利用迴圈的方式來完成 我們可以寫 ```shell= for((i = 1; i<=$1;i++)) do touch ${i}.js done echo "File created" ``` 用while迴圈的話則會長這樣 ```shell= i=1 n=$1 while [ $i -le $n ] do touch $i.js ((i++)) done echo "File Created" ``` 注意:讀取參數位置來獲取參數時,需要用 **$1** 到 **$9** 獲取第1到第9個的命令行參數。**$0**為shell名。 參考資料 [技術共筆部落格](https://blog.techbridge.cc/2019/11/15/linux-shell-script-tutorial/) [鳥哥的Linux私房菜](http://linux.vbird.org/linux_basic/0340bashshell-scripts.php) [Shell Script 教學](https://crmne0707.pixnet.net/blog/category/3638545) [it邦](https://ithelp.ithome.com.tw/articles/10136126) [grep、cut、awk、sed文本处理](https://www.jianshu.com/p/70c390e3fa73) [sed与awk实例](https://www.jianshu.com/p/dbba519191af) [shell判斷式](https://www.itread01.com/content/1548064116.html) :bow: :ok_woman:
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up