還記的這篇主題嗎?因為 Flask 是用 Python 寫的,所以前面講了那麼多有關 Python 的東西也還可以理解,那為什麼突然出現一個跟 Python 都沒有關係的 git 呢?
因為這系列主要是讓你之後再進行多人的專案開發或維護的時候,能夠更快的進入狀況,減少出包(被從頂樓丟出去實測自由落體)的機會。而在多人的專案開發或維護時,常用的版本控制軟體就是 git。
開始使用 git 前要準備什麼?當然是安裝 git 啊!那要怎麼安裝 git 呢?有兩個方式:
推薦原因:因為 cmder 內建 git 指令 + 可以使用 Linux 指令 (個人覺得比 windows 的指令好用,我知道 powershell + git 也可以做同樣的事,不過黑色背景比較潮)。那 cmder 要怎麼安裝呢?
到 cmder 按 Download Full
(Full 版本確定有 git 指令,Mini 我不知道)。
把下載下來的東西解壓縮後放在你想放的位置(我是放在 C:/cmder/
下面)。
設定環境變數:設定
-> 系統
-> 關於
-> 進階系統設定
-> 環境變數
-> 系統變數
-> Path
-> 新增
-> C:/cmder/
(剛剛放的位置)
開啟 CMD(內建的命令提示字元),輸入 set PATH=C:
,讓環境變數立即生效,不用重開機
關閉 CMD 再重啟,輸入 echo %PATH%
,查看是否有增加 C:\cmder
(恩,對,某窗戶就反骨,斜線就要跟其他人不一樣)。
開啟 cmder,等待初始化結束。
安裝完成。
輸入 git --version 查看 git 版本(如有有提示需要升級就直接輸入 git update-git-for-windows
即可)。
將 λ
改成 $
(推薦)
推薦原因:不改會有畫面殘留文字的問題,雖然不影響指令輸入,而且下個 cls 或 clear 就不見了。
打開 vender/clink.lua
local lambda = "λ"
改成
local lambda = "$"
使用 lua Config (看個人喜好)
讓你的 cmder 看起來更好看的
* 設定完會變回 λ
,要改的話參考下面方式:
powerline_core.lua
plc_prompt_lambSymbol = "λ"
改成
plc_prompt_lambSymbol = "$"
到 git官網下載 好以後,安裝就可以了(應該會出現超多可以選的東西,但是不要理它,放心大膽的下一步到底就對了)
按下 install 等待安裝完就可以了
查看個人設定
# 查看個人設定
$ git config --list
設定個人資料(基本上要設定 user.name
跟 user.email
才可以)
# 設定名稱
$ git config --global user.name <name>
# 設定 email
$ git config --global user.email <email>
先申請一個 Github 或 Gitlab 帳號(它要啥填啥就對了,應該沒問題吧?)
然後因為 Github 無法在採用密碼認證 所以要先設定好 SSH(雖然也可以用GPG 或其他的東西,但是我的肝表示用熟悉的 SSH 就好了)。
首先先產生一組rsa公私鑰(email記得改成自己的),先打開 cmder 輸入:
$ ssh-keygen -t rsa -b 4096 -C "<your_email@example.com>"
# 輸入 keys 檔案要放的位置與名稱,沒有要改就 Enter
> Enter file in which to save the key:
# 設定通行密碼,沒有要改就 Enter
> Enter passphrase
# 再輸入一次通行密碼,沒有一樣 Enter 就好
> Enter same passphrase again:
再輸入
# id_rsa 是預設名稱
# 沒附檔名的是私鑰,給自己用的
# .pub 是公鑰,給外部系統用的,這邊要打開的就是公鑰
$ notepad .ssh/id_rsa.pub
然後再點右上角的倒三角形->Settings
->SSH and GPG keys
->New SSH key
,記事本全選複製後貼到 Key 那欄裡面(Title 隨便填,不填也沒差),最後在按Add SSH key
就可以了,這時可以透過下面的指令測試有無設置成功。
$ ssh -T git@github.com
# 成功的話就會像下面這樣
> Hi <your name>! You've successfully authenticated, but GitHub does not provide shell access.
ssh-agent 是用來管理 SSH 的私鑰,如果前面設定了通行密碼,每次使用都需要輸入。ssh-agent 可以免除重複輸入密碼的麻煩。這邊只講如何設定。
* Windows 10 1709之前沒有內建 Open ssh,要使用必須自行安裝
* Windows 10 1803~21H1(目前最新)的 ssh-agent 有內建,但是是關閉的(???),可以透過 cmder 輸入 winver
來確認版本
PowerShell 的系統管理員 MODE
# 查看 ssh 位置
$ Get-Command ssh
# 查看 ssh-agent 狀態
$ Get-Service ssh-agent | select -property Status,Name,DisplayName,Starttype
# 改變 ssh-agent 狀態
$ Set-Service ssh-agent -StartupType Manual
# 啟動 ssh-agent
$ Start-Service ssh-agent
# 取得 ssh-agent 狀態
$ Get-Service ssh-agent
# 新增私鑰
$ ssh-add <私鑰 Path>/<私鑰 Name>
# 列出管理中的私鑰
$ ssh-add -l
# 讓 git 使用 Windows 的 ssh-agent,不使用 git 自帶的
$ git config --global core.sshCommand "'C:/Windows/System32/OpenSSH/ssh.exe'"
重要
強烈建議您將私密金鑰備份至安全的位置,然後在將它新增至 ssh-agent 之後,從本機系統將它刪除。如果您失去私密金鑰的存取權,就必須建立新的金鑰組,並在您互動的所有系統上更新公開金鑰。
Git 主要功能是控管每個檔案的版本關係,自然會記錄有關檔案狀態的東西(我不太知道如何形容)。
Git 中檔案的狀態(可以這樣說嗎?)可分為 4 種,而每個檔案版本所在的區塊也有 4 種。根據我個人的理解,把它們組合起來看會長這樣:
先稍微介紹一下很明顯的檔案區塊的4種:
Working Directory (在此簡稱: W): 現在存在於資料夾內的、編輯器可以打開的位置。
Staging Area (在此簡稱: S): 暫存狀態。
Local Repository (在此簡稱: L): 本地(自己的電腦上的)倉庫。
Remote Repository (在此簡稱: R): 遠端(不在自己的電腦上的)倉庫。
再來稍微介紹一下檔案狀態的4種:
Untracked: 未被追蹤。
Unmodified: 追蹤中,未修改。
Modified: 追蹤中,已修改。
Staged: 追蹤中,待提交。
好,首先是檔案區塊, Working Directory 很容易懂,你看到的、可以修改的檔案都屬於它; Staging Area 裡面都是追蹤中、會提交進倉庫的檔案; Local Repository 就是在本地(自己的電腦上)的倉庫; Remote Repository 就是遠端(不在自己的電腦上)的倉庫;基本上修改完畢都必須提交進倉庫儲存,檔案區塊大概就是這樣。
接著是檔案狀態,檔案狀態就是檔案儲存後的內容,離開 Working Directory 才會Care 版本的問題(雖然有點不精確,但大概是這樣的概念)。如果是新建一個 git 的倉庫( init
不是 clone
後面會講道),所有檔案一開始會處於 W-WS(突然出現的集合論??) 的區塊;只要加入追蹤,就會從 W-WS 的區域移到 WS 的區域;到這裡應該知道了 Untracked (W-WS)的檔案狀態了吧?再來是 Staged (S-WS)的狀態,這裡面是預備提交進入倉庫的狀態;阿剩下兩個狀態是怎麼回事?Unmodified 簡單說就是 S-WS 跟 WS 之間狀態一樣;而 Modified 就是 S-WS 跟 WS 之間狀態不一樣。
順便插入說明一下 Branch,Branch 功能主要是讓不同 Branch 可以有不同任務,例如穩定發行版、開發測試版等等;跟分支很像的功能叫 Fork,Fork 是主要是給不同人可以同時開發不同東西,不會互相影響的;而兩個都可以透過 merge 合併(雖然 Fork 要原作者同意才可以 merge ),然後自己可以 Fork 別人的專案(可以選擇 Fork 別人的不同 Branch )後 Branch,但沒有自己 Branch 自己的專案後再 Fork 的。
是不是有點概念但好像還不太懂?只要記得你可以打開來操作的檔案全部都在 Working Directory (包括 W-WS 跟 WS),Working Directory 以外的都是狀態就好,接著搭配著語法看應該就懂了!
# 將現在所在的資料夾變成一個倉庫 | 資料夾內的檔案都是 Untracked (W-WS)
$ git init
# 複製一個專案到現在位置 | 專案資料夾內的檔案都是 Unmodified
$ git clone <url>
# 加入追蹤 | 英文句號 . 代表全部檔案 | W-WS 移進 WS, WS 複製狀態進 S-WS
# 第一次 W-WS 移進 WS 的時候會順便複製狀態進 S-WS
$ git add <filename>
# 取消追蹤 | WS 移進 W-WS
$ git rm --cached <filename>
# S-WS 的狀態取代 WS 的狀態(對,你辛苦做好的程式只要下這個指令就會不見了)
$ git restore <filename>
# S-WS 的狀態提交給 L,順便加上一段說明了你幹了什麼的訊息
$ git commit -m "<commit message>"
# S 的狀態提交給 L,順便加上一段說明了你幹了什麼的訊息
$ git commit -am "<commit message>"
Fork 請在網頁上操作
# 查看 L 有哪些 Branch
$ git branch
# 新增 L 的 Branch
$ git branch <branch name>
# 切換現在 L 的 Branch
$ git checkout <branch name>
# 合併 L 的 Branch | B 要併進去 A 要先切回 A 後 merge B
$ git merge <branch name>
# 查看現在有哪些 R | 正常會出現 <remote name> <remote url> 這樣
$ git remote -v
# 把 L 的 branch 推到 R 的 | R 沒有這支 branch 會自動新增
$ git push <remote name> <remote branch>
# 查看 L 的歷史紀錄
$ git log --graph
紀錄一些要忽略掉不想追蹤的檔案,git add .
就可以把剩下的全部加入了。
.gitignore
# 忽略 .env 檔案
.env
# 忽略 package 底下所有附檔名是 .py 的檔案
package/*.py
大概就醬。
Generating a new SSH key and adding it to the ssh-agent
Windows 1803之後git for windows無法透過Start-SshAgent啓用ssh agent - 需要一直輸入passphrase的問題
那麼就大概這樣,git 真的要好好學好,推到遠端前一定要看清楚,不然真的會出大事。
大家掰~掰~