# :memo:Git 操作紀錄 Git是一套Source code版本管理的工具,學會使用版本控制(以下簡稱:版控)是很方便的。 ### Git的基本概念 在實際操作前,我認為理解它的基礎理論和知識對日後的使用會有很大的幫助。 謹記***如果觀念不清楚,即使給你再好的工具也沒有用*** * **Git是個分散式版本控管系統** 過去沒有git的時候,主要存在兩種版本控管方法: 1. Local端版控:在自己的電腦內建立一個版本資料庫 2. 集中式版控:在一台Server上儲存所有的版本紀錄(例如:SVN[:link:](https://zh.wikipedia.org/wiki/Subversion)) > ***試想一下...都已經有這兩種版控方法了,為什麼還會出現Git呢?*** 顯然是**上述的方法皆存在一些弊端**...在**協同開發**的情況下,以本地端進行版控,顯然是不可能的;而以集中式進行,在**鎖定模式**下,開發者想要修改檔案、簽出該檔後,檔案就會進入鎖定狀態,變成**唯讀**的模式,使得其他開發成員無法對該檔進行修改,直到檔案簽回為止,這對於**開發效率**來說其實是**大打折扣**的。 > ***基於上述以及種種原因...分散式版控系統得以應運而生*** 由於Git屬於分散式版本控制系統,所以開發者可以在離線環境下進行開發(Local),等到有網路時再將檔案push到遠端(Remote)環境。 ### Git紀錄的是檔案的快照(Snapshop) 很多人會以為每次的commit是將編輯後的檔案拷貝一次,**其實不然**。 如果你仔細觀察你Github的Repository,隨著檔案更改次數的增加,Repository的實際大小並不會有太大的變化,造成這樣的原因就是Git使用了**快照(Snapshop)**。 或許你會想問,什麼是快照? **快照有別於備份**,雖然二者都是以"定格"的方式紀錄文件某一個時間點的狀態,但**備份的方法是**將**文件**進行**複製**,這也是日常中最常見的方式。而這樣的缺點,會隨著文件編輯的次數越多,導致其變得越來越複雜,除了會衍生出越來越多的版本,也導致硬碟空間的浪費。**快照紀錄的是檔案結構的文檔**,我們不必複製檔案的所有內容,就可以保存當前檔案的所有狀態。 # :memo:Git環境設置 & 基本指令 ### 安裝Git 首先你需要先Download git([:link:](https://git-scm.com/)) 它會自動偵測你的系統,像下圖(紅框部分)就會顯示這台電腦的系統以及版號  安裝完後會看到Desktop出現Git Bash 如下圖  ### 執行Git Bash 點擊Git Bash的icon後執行  會發現它的介面類似Linux(這是因為git本身是架設在mingw上) 一開始預設的是你的使用者的home目錄 *基本指令如下* * **pwd**  會顯示現在的所在位置(目錄) * **ls**  會列出資料夾底下所有的檔案 * **clear** 使用clear可以清空原本介面顯示的資訊(包含操作過的指令) * **cd Desktop**  使用cd就可以進入資料夾,例如進入桌面 上述指令都是linux指令,正如前面所說,git原先是出現在linux上的 # :memo:Git基礎操作 在進一步實作前,先在Git設定中設定你的帳戶,讓Git知道這台電腦要與哪個Github使用者進行連結。 * **git config --global user.name "Githun帳號"** * **git config --global user.email "註冊Github的信箱"** ### 初始化 * **git --version** 查看你的git版本 當要在自己的專案上新增一個數據庫(Repository),需要先在本機端新增一個資料夾,並透過指令進入該資料夾 * **git init** //初始化,建立隱藏的.git資料夾  執行完成後,會回饋上圖資訊,就表示本地數據庫建立成功 ***如果出現"Reinitialized existing Git repository in "資料夾路徑"/.git/"表示該資歷夾已經存在.git資歷夾了*** 檢視目前的資料夾也能發現完成初始化後多了一個隱藏的.git資料夾,如附圖  `題外話,你也可以在git bash上用指令的方式建立資料夾,之後透過 cd 移動至建立好的資料夾中在進行git初始化,範例如下:` `Step1. mkdir "資料夾名稱"` `Step2. cd "資料夾名稱"` `Step3. git init` >>Q.如果專案想移除Git版控怎麼辦? >>A.最簡單,也是最暴力的方法就是,點開資料夾右鍵刪除.git。 但還是建議可以學一下如何用git bash下指令刪除, 只要輸入 ***rm -r .git*** 即可完成相同結果。 * **ls -la** 用於列出資料夾下的所有檔案(-l 為列出詳細資料,-a 為列出隱藏資料夾,例如.git資料夾) * **git status** 可以檢視目前版本控制的狀況,如附圖  可以看到**目前所在的分支(branch)是"master"**; 由於目前沒有將任何檔案加入版本控制,因此在追蹤的部分是沒有任何檔案資訊的 ### 將檔案加入版控 * **git add "檔案名稱"** 如附圖,先將檔案加入版控中,透過先前所提的***git status***指令,可以發現範例中的檔案為已被追蹤的狀態,而**檔名為紅字**的表示尚未被加入版控中 >>Q.如果我資料夾所有的檔案都要加入版控怎麼辦?總不可能一個一個add吧?! >>A.如果想要一次將所有檔案加入,只要將原本指令中**檔案名稱**的位置改成"." (***git add .***)即可。 * **git rm --cached "檔案名稱"** 可以將原本被追蹤的檔案狀態改為取消追蹤 當檔案已被追蹤後,你依然可以繼續編輯該檔,而若再完成編輯並儲存後再使用***git status***檢視版控狀態,你會發現出現了以下資訊(紅框部分)  這是因為,編輯後的檔案並不在原先版控的範圍中,代表編輯後的內容並沒有被追蹤。若想要再次被追蹤,那就再次使用***git add "檔案名稱"***的指令。 * **git commit -m "簡述此次調整"** 僅透過add調整檔案的異動是不夠的,若要讓檔案內容完整保存,需使用commit指令完成,如附圖。  >>謹記,如果修改了檔案卻沒有執行***git add***指令而是直接進行***git commit***,那麼那些沒add到的檔案是不會被commit的。 而當你再次使用***git status***指令,你會發現已經看不到原先被追蹤的檔案,這是因為我們已經完成這次版本的提交了,如以下範例。  * **git log** 此指令可以檢視我們提交的版本(**版本的ID是由40位的雜湊值組成**,基本上只要前六位就可以做為唯一標識了),以及調整的資訊,例如分支位置、作者、提交日期。  ### 檔案的前世今生 如果我們針對檔案再做一次上述的流程(編輯 -> add -> commit),最後再log檢視,會發現又多了一個版號,如附圖。  * **git show "版號"** 可以用來檢視在這個版本中被修改的部分,附圖**綠色段落**即為新增的部分。 >>現在,我們可以透過***git log***檢視檔案的板號,透過***git show***檢視版本被修改的內容。 >>接下來要了解的就是該如何將檔案回朔到過去的某一版本。 * **git reset --hard "版號"** 使用此指令,可以讓檔案恢復到我們所指定的版本,如附圖。另外,你也可以使用***git log***指令進行檢視。 ***記住,--head 一定要加,這代表目前的檔案(和branch類似),如果不加的話就只有版號會恢復,而檔案內容是不會改變的。*** ***git log***指令只能看到**過去**和**現在**的版本。以目前實作的例子來說,現在有兩個版本,在rest到前一版本後,用***git log***指令,會發現只剩下一個版號,如附圖  問題來了,如果我想回到第二個版本,該怎麼做? * **git reflog** 可以檢視***git log***所看不到的那些所謂**未來**的版本,如附圖。 當再次使用***git reset --hard "版號"*** 指令,版本就會恢復到所指定的版本。 ### 建立分支 預設的branch叫做**master** 預設的remote叫做**origin** * **git branch** 可以檢視創建的分支 * **git branch "分支名稱"** 用於創建新的分支 * **git checkout "分支名稱"** 切換到指定分支 以上操作如附圖,會看到已切換過至指定branch中 >>所以如果你已經執行***git checkout "分支名稱"*** 指令並繼續使用cmmit指令的話,那麼**變更的版本會記錄在新的分支**中而非master * **git merge "分支名稱"** 用於將分支合併(此指令的意思是將所指定的分支合併到目前我們所在的分支當中。因此,下此指令時必須先切換至目標分支。) * **git branch -d "分支名稱"** 用於刪除指定分支 ### 將Local檔案上傳到Remote 想要將本地端檔案push到遠端的Repsitory,首要做的就是將本地端與遠端進行連結。 * **git remote add "遠端名稱" <遠端Repsitory網址>** 讓本地端知道遠端的對應網址 * **git push -u "遠端名稱" "分支名稱"** 將本地端檔案push到遠端Repsitory ### 從Local刪除Remote的分支 可以查看remote的分支 * **git branch -a** 如果想要從本地將遠端Repsitory的分支刪除可以使用以下指令 * **git push "遠端名稱" --delete "分支名稱"**  #持續更新...
×
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