2021年2月1日 星期一

BDSE15 - Learn Git

  從事資訊相關工作四年多,始終無法自學出能獨當一面的資訊工作技能,以做為長期謀生的一技之長,剛好工作遭受COVID-19嚴重衝擊,經過長考,決定離職,重新接受資訊課程的訓練,有鑑於過去的工作經歷,最後選擇報名參加「巨量資料分析就業養成班」。

  四個多月的課程期間不但沒有收入,還需繳交昂貴的學費,幸好後來「產業新尖兵計畫」的補助緩解財務上的壓力,這要感謝同學們的幫忙。說到同學,同學其實是我覺得參加課程最主要的價值,過去三年多自學的過程,沒有同儕的相互照應,其實學習進程是相當緩慢的,更不容易處理自學當中產生的各種困難與負面情緒,因此我頗重視與大家的相處過程。

  關於四個多月的課程成果,將陸陸續續整理好筆記呈現出來,這一系列筆記的第一篇,我想先搞懂GitGitHub,讓我可以將專題成果整理、包裝好,以利年前、年後這段期間的求職,祝福一同努力的同學們,也祝福我吧!

一、環境準備

 

學習資源

l   連猴子都能懂的Git入門指南:
https://backlog.com/git-tutorial/tw/

l   助教筆記:
https://www.notion.so/Copy-of-Git-f60eb4d2c8454d61a441de154237d6d2

 

安裝Git

l   使用主控台(命令列)操作,安裝後,透過Git Bash啟動程式:
http://git-scm.com/

l   查看Git版本以確認是否安裝成功:
$ git --version

 

二、開始使用Git相關指令

 

建立本地端數據庫

l   移動到這個目錄並建立為本地端數據庫,成功後將出現.git隱藏資料夾:
$ mkdir tutorial
$ cd tutorial
$ git init

l   列出所有設定,非--global選項將記錄在.git資料夾中的config檔,否則記錄在用戶目錄首頁的.gitconfig檔案裡,或記錄在Git程式安裝目錄的etc\config檔案裡:
$ git config -l

l   設定使用者名字與電子信箱,建議不使用--global選項:
$ git config user.name "<
使用者名字>"
$ git config user.email "<
電子信箱>"

 

異動本地端數據庫

l   在本地端數據庫異動檔案前後,確認工作目錄與索引的狀態:
$ git status

l   將檔案加入索引,可使用空白鍵分開選取檔案,亦可使用.-A全部選取檔案:
$ git add -A

l   提交索引,單純用git commit會需要用文字編輯器(vivimnanonotepad++)進行提交訊息的編輯:
$ git commit -m "<
提交訊息>"

l   顯示歷史提交記錄,--graph以圖表方式顯示分支歷史,--oneline簡化輸出訊息,--all顯示所有版本,HEAD表示現在的位置:
$ git log --graph --oneline --all

 

復原本地端數據庫

l   先檢查版本hash代碼再返回前版:
$ git log --graph --oneline --all
* a25aa04 (HEAD -> master) second commit
* f36e868 first commit
$ git checkout f36e868

 

 三、共享數據庫相關指令

 

建立遠端數據庫

l   先在GitHub建立一個名為git_tutorial的數據庫,並準備本地端數據庫如下:
$ echo "# git_tutorial" >> README.md
$ git init
$ git add README.md
$ git commit -m "first commit"

l   修改branch的名字,從master改名為main
$ git branch -M main

l   增加一個遠端數據庫,origin這個名字代表後面的url,可用git config -l檢視增加後的設定:
$ git remote add origin https://github.com/user_id/git_tutorial.git

l   變更到遠端數據庫,在執行提交時指定參數-u項目,之後就可省略指定分支名稱,亦即以後只打git push即可:
$ git push -u origin main

 

自遠端數據庫複製

l   git clone <repository> <directory><repository>指定遠端數據庫的URL<directory>指定要複製的目錄名稱:
$ git clone https://github.com/user_id/git_tutorial.git

 

自遠端數據庫更新

l   git pull <repository> <refspec><repository>指定遠端數據庫的URL<refspec>指定要更新的branch
$ git pull origin main

 

.gitignore用以不要推送到GitHub上做版控與內容比對

l   data資料夾的內容都不要更新,方法一:
$ echo "data/*" >> .gitignore

l   data資料夾的內容都不要更新,需要用文字編輯器加上data/*,方法二:
$ touch .gitignore
$ nano .gitignore

l   常見的.gitignore寫法:
#
字元開頭表示註解
檔案名稱可以使用萬用字元*
!
字元表示排除
http://gitignore.io/

 

README.md

l   Markdown是一種輕量級標記式語言:
https://guides.github.com/features/mastering-markdown/

l   字體:
**bold**
# This is an h1 tag
## This is an h2 tag

l   列表:
* Item 1
* Item 2
  * Item 2a
  * Item 2b

l   CheckBox
- [x] This is a complete item
- [ ] This is an incomplete item

l   區塊:
`Format one word or one line`
    code (4 spaces indent)

l   程式碼:
```js
//
這邊是JavaScript程式碼
var ams = [];
for (let i=100; i<=999; i++) {
        var digit3 = Math.floor(i/100);
        var digit2 = Math.floor((i-digit3*100)/10);
        var digit1 = i-digit3*100-digit2*10;
        if (i == (Math.pow(digit3, 3) + Math.pow(digit2, 3) + Math.pow(digit1, 3))) {
            ams.push(i);
    }
}
document.getElementById("amstrong").innerHTML = ams;
```

l   圖片:
![GITHUB](
圖片網址 "圖片名稱")

l   階層式區塊:
>Quote one sentences
>>Quote two sentences
>>>Quote three sentences

 


四、使用分支相關指令

 

branch相關指令

l   顯示branch列表,前面有*的就是現在的branch
$ git branch

l   新增名字為main2branch
$ git branch main2

l   刪除名字為main2branch
$ git branch -d main2

 

branch合併,沒有衝突問題

l   第一步,修改main branch的內容。

l   第二步,新增並切換至main2 branch
$ git checkout -b main2

l   第三步,修改main2 branch的內容,與修改main branch的內容不重疊。

l   第四步,切換至main branch並合併main2 branch
$ git checkout main
$ git merge main2

 

branch合併,有衝突問題

l   第一步,修改main branch的內容:
$ git log --graph --oneline --all
* af3af54 (HEAD -> main) a.txt a main
* 90997cc (main2) a.txt A main2

l   第二步,切換至main2 branch
$ git checkout main2

l   第三步,修改main2 branch的內容,與修改main branch的內容重疊:
$ git log --graph --oneline --all
* fb1d32b (HEAD -> main2) a.txt A main2
| * af3af54 (main) a.txt a main
|/
* 90997cc a.txt A main2

l   第四步,切換至main branch並合併main2 branch,顯示衝突:
$ git checkout main
$ git merge main2
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt
Automatic merge failed; fix conflicts and then commit the result.

l   第五步,修改main branch衝突的內容後,執行git add再執行git commitgit merge --continue
$ git log --graph --oneline --all
*   8cfc024 (HEAD -> main) a.txt merge
|\
| * fb1d32b (main2) a.txt A main2
* | af3af54 a.txt a main
|/
* 90997cc a.txt A main2

 

git mergegit rebase都是合併歷史紀錄

l   git merge
多分支的修改內容會維持原狀,亦即合併後的歷史紀錄會比較複雜。

l   git rebase
修改內容的歷史紀錄會接在要合併的分支後面,合併後的歷史紀錄會比較簡單,但是會比使用git merge更容易發生衝突。

 

五、使用標籤相關指令

 

標籤相關指令

l   HEAD指向的提交裡增加名為apple的標籤:
$ git tag apple

l   顯示標籤列表:
$ git tag

l   HEAD指向的提交裡增加名為banana的標籤與註解:
$ git tag -am "
連猴子都能懂的Git" banana

l   顯示標籤列表與註解:
$ git tag -n

l   刪除標籤:
$ git tag -d banana

 

六、改寫提交相關指令

 

改寫git commit -m "<提交訊息>"的提交訊息

l   在預設編輯器修改上一次的提交訊息,之後儲存變更並離開編輯器:
$ git commit --amend

 

取消提交

l   取消指定的提交內容,方式為繼續新增git log,但為git commit的相反操作:
$ git revert HEAD

l   取消指定的提交內容,方式為直接退回git log某階段,下例為退回HEAD之前二個階段:
$ git reset --hard HEAD~~

l   執行時,需要根據影響的範圍指定不同的模式,預設為mixed模式:
soft
模式:
HEAD
的位置修改、索引不修改、工作目錄不修改
mixed
模式:
HEAD
的位置修改、索引修改、工作目錄不修改
hard
模式:
HEAD
的位置修改、索引修改、工作目錄修改

l   執行時,使用~(tilde)^(caret)指向某個提交的相對位置:
~(tilde)
指向第幾代的父代,^(caret)指向幾世代以前的父代,下例三者是相同意義的操作:
$ git reset --hard HEAD~~
$ git reset --hard HEAD~2
$ git reset --hard HEAD~1^1

l   git reset錯誤的時候,可以還原到git reset前的狀態:
$ git reset --hard ORIG_HEAD

 

其餘branch改寫提交指令

l   從其它branch複製指定的提交,然後導入當前branch,需要先以git log檢查版本hash代碼:
$ git cherry-pick 99daed2

l   欲合併名字為issue1branch,在當前branch新建一個匯合所有提交的提交:
$ git merge --squash issue1

l   使用git rebase並給予-i參數,可以改寫提交、替換、刪除、合併,下例為退回HEAD之前二個階段:
$ git rebase -i HEAD~~
之後的操作:
若為合併提交,在預設編輯器修改picksquash;若為修改提交,在預設編輯器修改pickedit

沒有留言:

張貼留言