Section 25: Unix Command, Git and GitHub

Unix Command


DOS Command

老師介紹了幾個常用的 DOS Command,但我覺得漏了一件最重要的事:你不記得指令後方參數時,該怎麼辦

答案很簡單,在指令後方加上 /? 即可。

cd 為例:

C:\>cd/?
顯示目前工作目錄的名稱或是變更目錄。

CHDIR [/D] [drive:][path]
CHDIR [..]
CD [/D] [drive:][path]
CD [..]

  ..   指定變更到上層目錄。

輸入 CD drive: 即可顯示指定磁碟機的目前工作目錄。
僅輸入 CD 而不加參數,即可顯示目前的磁碟機和目錄。

使用 /D 參數可以同時變更工作磁碟機及其工作目錄。

如果您啟用擴充命令,CHDIR 的變更如下:

目前的目錄字串會被轉換成與磁碟上名稱相同大小寫的字串。
所以如果磁碟上的目錄是 C:\Temp 的話,CD C:\TEMP 命令實
際上會轉換為 CD C:\Temp。

CHDIR 命令不會將空格當成分隔字元,所以如果您要切換到含
有空白字元的目錄時,就算您不使用引號來括住目錄名稱,也
一樣可以用 CD 命令切換到該目錄。例如:

    cd \winnt\profiles\username\programs\start menu

就相等於:

    cd "\winnt\profiles\username\programs\start menu"

如果您停用擴充命令,就必須輸入前一種命令。

不過這個說明,我覺得還不夠。雖然介紹了 cd..cd.. 之間,可以不用有空白),卻沒介紹 cd\(切換到該磁碟的的最上層)。

Q. 如果你要切換的路徑,有亂碼或太長的時候怎麼辦?

A. 你可以用 檔案總管(File Explorer) 上方 List Box 中的路徑來編輯(複製 ctrl + c、貼上 ctrl + v),速度會快得多。

這裡是 DOS Command 的速查表,除了老師提到的之外,再加上幾個比較常用的指令。

DOS Command 範例 用途
help help 叫出所有可用的 DOS Command
/? /? 叫出該指令(上述 help 可列出所有指令)的線上說明
dir/? 叫出 dir 指令的線上說明
cd cd chdir - change directory 切換到不同的路徑
以這個路徑為例 C:\Dev\Study\JS>
cd… 到上一層路徑 C:\Dev\Study>
cd\ 到最上層路徑 C:\ >
cd 路徑名 到下一層路徑(路徑名)
cd\路徑名 直接切換到到指定路徑 C:.…\路徑名 >
cd Dev 到下一層路徑(路徑名) C:\Dev>
dir dir 顯示本路徑中,所有的檔案
dir/on on name 顯示本路徑中,所有的檔案,依檔案字母順序排列
dir/od on date 依檔案日期/時間(日期較早的在前)
dir/o-d on -date 依檔案日期/時間(日期較早的在後)
dir/oe on extension 依檔案副檔名(字母順序)
dir/ox 顯示非 8.3 格式檔案的短檔名
dir *.py 萬用字元 *,本例為顯示所有副檔名為 py 的檔案
dir m*.py 萬用字元 *,本例為顯示所有主檔名第一個字母為 m 的 py 檔
dir mai?.py 替代字元 ?,本例為顯示所有主檔名前三個字母為 mai ,第四字母不限的 py 檔
md md mkdir - make directory 建立新的子路徑
cls cls clear screen 清除目前螢幕上所有文字
ren ren rename 重新命名
exit exit exit 結束 DOS Command
鍵盤上的向上箭頭,可叫出之前輸入的指令
鍵盤上的向下箭頭,可叫出之後輸入的指令
tab auto complete 鍵盤上的 tab 鍵(Q的左邊),可自動呼叫最接近目前輸入文字的路徑
tab cd Sttab 由 C:\Dev>cd St 變成 C:\Dev>cd Study
date date 顯示今天日期,若要修改,可輸入新日期
time time 顯示目前時間,若要修改,可輸入新時間
del del delete 刪除檔案,可和萬用字元 * 替代字元 ? 搭配使用
del *.py 刪除目前路徑下的所有 Python 檔案
rmdir rmdir temp 刪除 temp 路徑(如路徑內含檔案,需另行處理)
echo echo [ON OFF]
echo [message] 顯示訊息
echo 僅輸入 ECHO 而不加上參數,可以顯示目前的 ECHO 設定
copy copy *.py d:\temp 將目前路徑中所有的 Python 檔,複製到 D:\Temp 下
move move *.py d:\temp 將目前路徑中所有的 Python 檔,移動到 D:\Temp 下
type type readme.txt 顯示文字檔的內容
path path 顯示 OS 環境路徑參數設定。在 path 設定路徑中的可執行檔(exe, bat…),執行時不用先移動至該路徑
你可以想像成:哆啦A夢的任意門
> > filename 將原本要顯示在螢幕上的結果,輸出到指定檔案(文字格式)
dir/on *.py > py.txt 將所有 Python 檔案,依檔名字母排序後,寫入 py.txt

DOS Batch

談到 DOS Command,如果不提 Batch file(*.bat),那只發揮了五成的功力。

因為本課程中未提及,我只附上參考文章,請感興趣的朋友,自行閱讀。

這裡附上我寫爬蟲時,所使用的 Batch file(go.bat 使用時會加日期當參數),節錄部分給大家參考。

d:
cd\Dropbox\Udemy\Temp\udemy05
scrapy crawl uspider05 -o ..\today-%1.csv
cd\Dropbox\Udemy\Temp\udemy11
scrapy crawl uspider11 -o ..\today-%1.csv
REM ===== 省略幾個爬蟲 =====
copy ..\today-%1.csv C:\Dev\Study\daily01\data\crawl_today_2022_%1.csv
move ..\today-%1.csv D:\Dropbox\Udemy

REM ===== Run Daily01.py directly from DOS COMMAND =====
c:
cd\Dev\Study\daily01
main.py

IF EXIST C:\Dev\Study\daily01\data\all_courses_2022_%1.txt (
copy C:\Dev\Study\daily01\data\all_courses_2022_%1.txt D:\Dropbox\Crawl\Backup\ /y
)

影片中,老師每次專案開始前,都做一樣的事,新增空白檔案:index.html、app.js,建立子目錄 styles 後,新增 style.scss。

這種事情最適合用 Batch file 來處理。

以下這個 bat 檔,會接收你自行命名的參數,當作專案目錄,然後所有事自動搞定。我把這個檔案,放在 path 中的某路徑,這樣在任何地方,都可以執行。

REM ===== 指令範例(go.bat 為例,建立目錄名為 project 的專案 ) >go project =====
md %1
cd %1
type nul > index.html
type nul > app.js
md styles
cd styles
type nul > style.scss
cd..
cd..
code %1


Unix Command

最近有點忙,直接列出來,有空再編輯為表格。資料來源在本節下方,節錄部分我覺得比較常用的指令。

[控制鍵]
Ctrl-U 刪除整行命令行
Ctrl-W 刪除命令行的最後一個字(Word)
Ctrl-C 中斷程式或 shell script
Ctrl-Z 暫停程式或 shell script
Ctrl-S 暫停往下顯示
Ctrl-Q 繼續往下顯示
Ctrl-O 不要程式的輸出, 但不中斷程式
Ctrl-D 終止檔案輸入(EOF), 或 Logout
Ctrl-L 清除畫面
上/下箭頭 重現之前的指令

與檔案目錄有關的特殊字元

. 現在目錄 (一個句點)
… 上一層目錄 (兩個句點)
~ User 之主目錄 (老鼠尾巴)
? 檔名之單一字元 (問號)

  • 檔名之所有字元 (星號)

以下摘錄 unix 較常用之命令, 其中也包含了部份 csh 之 Built-in commnad :

ls 顯示目錄內容, 同 DOS 之 DIR - list
ls -al 詳細顯示此目錄內的所有檔案 (包含以 . 開頭之隱藏檔)
ls *.c 顯示此目錄內的所有結尾為 .c 的檔案 (unix 無所謂附檔名)

cd切換目錄 - change directory
cd 切換目錄至您的主目錄
cd … 切換目錄至上一層目錄
cd /usr/bin 切換目錄至 /usr/bin

pwd 顯示現在目錄的路徑 print working directory

mkdir 建一子目錄 make directory
mkdir prg 在現目錄下建一子目錄 prg
mkdir prg/c 在子目錄 prg 下建一子目錄 c

rmdir 刪除一子目錄 remove directory
rmdir prg 刪除子目錄 prg , 但 prg 須為空目錄

file 顯示檔案型態
file * 顯示目錄內所有的檔案型態

cp 拷貝檔案
cp /usr/skel/* . 將 /usr/skel下的所有檔案拷貝至現目錄下, 不包括子目錄
及隱藏檔 cp -r /usr/demo . 將 /usar/demo 下的檔案及子目錄拷貝至現目錄下

chmod 改變檔案許可權
chmod u+x main 將檔案 main 加上自己可執行的許可
chmod 744 main 將檔案 main 變為自己可讀寫可執行, 別人只可讀

rm 刪除檔案
rm abc 刪除檔案 abc
rm -r c 刪除目錄 c 及其下之檔案和子目錄
rm -rf c 同 rm -r c , 但刪除時將不再一一詢問是否刪除.

mv 搬移檔案
mv * …/prg 將所有檔案移至上層目錄之子目錄 prg 下

passwd 更改密碼

clear 清除終端機螢幕

date 顯示日期(可以特殊日期格式顯示)

env 顯示目前所有的環境變數

setenv 指定變數值於 shell 中, 供子 shell 使用
setenv LD_LIBRARY_PATH /usr/openwin/lib

find 找尋檔案
find . -atime +7 -print 找尋現目錄下的所有子目錄及檔案, 其最後一次讀取
為 7 天以上者
find /usr -name “*.h” -print 找尋 /usr下的所有子目錄及檔案, 其檔名為
.h結尾者

gzip 壓縮軟體 GNU zip.
gzip aaa.tar 把 aaa.tar 壓成 aaa.tar.gz
gzip -d aaa.tar.gz 把 aaa.tar.gz 解壓成 aaa.tar

tar 產生或解開檔案庫
tar -cvf bin.tar ./bin 將 ./bin 下之檔案及其子目錄製成一檔案庫 bin.tar
tar -xvf bin.tar 將檔案庫 bin.tar 解開成
tar -cvzf test.tgz ./aaa 將 ./aaa 目錄下所有檔案使用 gzip 方式壓到 test.tgz 檔中.
tar -xvzf test.tgz 將 test.tgz 檔中所有檔案解壓出來.

touch 建立一個內容空白的新檔案
touch main.py 建立一個內容空白的 main.py 檔案

以上內容節錄自以下網址(僅支援 http,不支援 https):

http://www2.thu.edu.tw/~cc/network_team/unix/command.htm

http://ind.ntou.edu.tw/~jjt/basic_cmd/index3.htm

論壇有另一篇關於 Linux command line 的參考資訊:


Git

git 基礎操作

建立 Git Repository(數據庫)

$ git init

檢查目前 git bash 版本

$ git --version

設定使用者名稱/電子郵件

$ git config --global user.name "sky lin"
$ git config --global user.email "sky@sky.lin"

顯示設定列表

$ git config --list

顯示修改檔案清單

加上 -s 參數,僅顯示已修改的檔案名稱。
如果在 -s 後再加上 -b 參數,則會顯示分支的名稱。

$ git status

註冊檔案或目錄到索引
$ git add file

範例一:註冊單一檔案

$ git add app.js

範例二:註冊多個檔案(使用通用字元 *)

$ git add *.html

範例三:子目錄裡的所有檔案

$ git add .

提交添加到索引的檔案

添加 -a 參數,就可以檢測出有修改的檔案(不包括新增的檔案),將其加入索引並提交。這些操作只要一個指令就可以完成了。

$ git commit -a

加上 -m 參數,就可以指令提交“提交訊息”。如果不添加-m參數,就會啟動修改提交訊息的編輯器。

$ git commit -m "我是註解"

刪除檔案

rm 是 remove 的縮寫

$ git rm file

加上 --cached 參數:讓檔案不再被 Git 版本控制,而不是真的完全刪除

$ git rm --cached index.html  # 移除 index.html 不再被 git 控管

參考資料:


git 實作

開始前,先參考整個 git 流程的關係圖。這裡放了三張做比較,資料來源分別列於下方:

Wilson Ren git

來源:本共學課程 Wilson Ren 老師講義簡報

來源:Git 基礎操作 _ W3HexSchool 六角學院

來源:11th鐵人賽 火箭隊 高雄火箭隊的前後端小夥伴們

branch, checkout & merge

顯示分支清單

$ git branch

加上 -r 參數,將顯示遠端分支。

加上 -a 參數,可以顯示遠端與本地端的分支。

建立分支

$ git branch branch_name

修改分支名稱

$ git branch -m old_branch_name new_branch_name

刪除分支

$ git branch -d branch_name

如果有未合併到 master 的提交,則無法刪除此分支。如果要強制刪除未提交的分支,請加上 -D 參數執行。

切換分支

$ git checkout branch_name

合併分支

$ git merge branch_name

加上 --no-ff 參數,將建立合併提交,而不是使用 fast-forward 合併。這可以保留分支合併的紀錄,是個非常有用的參數。

老師範例

# 建立一個分支 login,切換到分支、add、commit、切回 master、merge
$ git branch login
$ git checkout login
$ git add .
$ git commit -m "Create login.html"
$ git checkout master
$ git merge login

# 然後再建立一個分支 contact,故意讓 index.html 有衝突,來示範解決方式
$ git branch contact
$ git checkout contact
$ git add .
$ git commit -m "Modify index.html"
$ git checkout master
$ git merge contact
# 衝突時,選擇解決方式

本節講師強調重點:

  1. checkout: 在 master 和各 branch 間切換

  2. merger
    a. 一定要先 add → commit → merge
    b. merge conflict(範例:master & contact 同時修改)

參考資料:


github

方式一

切換分支

# 上方已 commit 完成
$ git remote add origin https://github.com/yourgithub/project1.git
$ git push -u origin master

remote

加入遠端數據庫(Wilson講師的第一種方法,就是上方的範例)

$ git remote add <遠端數據庫簡稱> <url>

觀看遠端數據庫列表

$ git remote

觀看遠端數據庫列表(包含 rule)

$ git remote -v

下載遠端數據庫(Wilson講師推薦的第二種方法)

$ git clone <url>

補充:之前看到一篇介紹如何寫好 github readme 的文章,找到網址後再補上。

Markdown 語法:論壇使用的也是 Markdown 語法

本節參考資料:

https://git-scm.com/book/zh-tw/v2/Git-基礎-與遠端協同工作

方式二(老師推薦)

下載遠端數據庫(Wilson講師推薦的第二種方法)

# 先在 github 中 create a new repository(右上方+號選單中的「New repository」) 
$ git clone https://github.com/yourgithub/project2.git

# 接著是示範寫程式的過程,已大幅簡化,純參考
# 不需要再次 git init
$ touch app.js
$ touch index.html
$ git add .
$ git commit -m "Add 2 files for demostration"
$ git push https://github.com/yourgithub/project2.git

pull

同事間合作同一專案時,透過 push & pull 讓雙方保持同步。

pull

合併遠端數據庫的分支的修改內容

$ git pull <repository> <refspec>

藉著 pull 命令,可以把遠端數據庫修改的內容合併到本地端數據庫:「pull = fetch + merge」。

可以省略 repository 或 refspec 。省略 repository 名稱時的動作與 push 的時候是相同的。若省略 refspec,會只 pull 現有的分支。

# 使用者 A 修改 index.html
$ git add .
$ git commit -m "add life need in index.html"
$ git push https://github.com/yourgithub/project2.git

# 使用者 B pull github 上的資料(local project3)
$ git pull https://github.com/yourgithub/project2.git

# 使用者 A 新增 form.html
$ git add .
$ git commit -m "add form.html"
$ git push https://github.com/yourgithub/project2.git

# 使用者 B pull github 上的資料(local project3)
$ git pull https://github.com/yourgithub/project2.git

fetch

查看遠端數據庫分支的修改內容

$ git fetch <repository> <refspec>

要確認遠端數據庫的修改內容,但不想合併內容到本地端數據庫時,可以使用 fetch 命令。fetch 命令不會修改本地端數據庫的分支。

可以省略 repository 或 refspec。省略 repository 時的動作與 push 的時候是相同的。省略 refspec,所有的分支在默認裡會被列為目標。

sourcetree

工具介紹


幾個我主要參考的 git 參考資料:

3個讚