Git-Tutorials 基本使用教學 :memo:
因為小弟覺得這東西蠻有趣的,所以就簡單寫個教學文,順便記錄一下:memo:,希望能幫助想學的人:smile:
如果教學有誤再請糾正:sweat_smile:
基本使用指令以及安裝可參考小弟之前拍的影片
影片教學包含如何產生 SSH key
如果步驟正確且沒出錯誤,可以在路徑下找到 .ssh資料夾,裡面有 id_rsa 以及 id_rsa.pub 兩個檔案,
這兩個就是 SSH Key, id_rsa是私鑰 ,不能洩露出去, id_rsa.pub是公鑰 ,可以很放心的告訴任何人。
安裝完 Git 之後,要做的第一件事情就是去設定自己的名字和信箱
git config --global user.name "twtrubiks"
git config --global user.email "twtrubiks@gmail.com"
可以輸入以下來確認是否輸入成功
git config --global user.name
git config --global user.email
Git 設定資料查看,可執行以下指令 ( 文章末會有較詳細的教學 ):
git config --list
git init 指令
初始化 git
git init
也可以指定資料夾
git init <directory>
git clone 指令
複製如圖位置網址 ( 不要複製我的哦~ 複製你自己的 )
git clone ( 複製的網址 ) SSH / HTTPS
( 如果你要使用 https 的方式, 請接著看 Personal Access Tokens )
git clone git@github.com:twtrubiks/test.git
第一次會出現 SSH 警告,選 YES 即可。
如圖 ( 下載成功 ),在你的下載路徑下就會多出一個資料夾
Personal Access Tokens
從 2021/8/13 開始, 如果你用 https 的方式你會發現
remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/xxxxx.git/'
這時候如果我們不想加入 ssh key, 也不想透過加入共同協做的方式,
可以透過這個 Personal Access Tokens (你可以把他想成臨時的權限),
先到你的 github 裡的 Settings -> Developer settings,
選 Personal Access Tokens, 產生你的 token
時間這邊你可以自己定義多久後會過期,
下面的部份則是這個 token 有哪些權限,
設定完之後, 就可以複製你的 token
再回去用 https clone 的方式,
原本是使用, 帳號 + password (已經不能使用了),
現在改成, 帳號 + 剛剛的 token 就可以順利 clone 了.
如何改善(加速)大型 repo git clone 速度
有時候我們會需要 clone 很大的 repo,執行 git clone
都需要很長的時間,是不是有方法可以
加速 clone 的速度呢 :question:
直接開始動手嘗試 ( 使用 django 當範例 ),
git clone git@github.com:django/django.git
( 你會發現 clone 需要一些時間 :triumph:)
接著查看 log,git log
嘗試切換 branch git checkout stable/2.2.x
開始改善(加速) clone 的時間,
可以透過 --depth
這個參數來完成,簡單說明一下他的功能,當我們一般執行 clone 之後,
接著執行 git log
你會發現有大量的 log,在某修情況下,你可能不需要那麼多的 log,
也就是說你可能只需要最近 10 筆的 history commit,甚至你只需要 1 筆 ( 也就是根本不需要
history commit ),這時候就很適合使用 --depth
。
git clone git@github.com:django/django.git --depth 1
( 你會發現這次快很多了 )
接著查看 log,git log
( 會變快的原因是因為我們只保留最新的一筆 history commit ,
如果你需要最近 10 筆,改成 --depth 10 即可 )
但是會有一個問題,當嘗試切換 branch git checkout stable/2.2.x
( 你會發現你無法切換 remote branch :scream:
原因是因為使用 --depth
相當於是 --single-branch
,
所以當然沒有其他的 branch。 )
也就是說以下兩條指令其實是相等的
git clone git@github.com:django/django.git --depth 1
git clone git@github.com:django/django.git --depth 1 --single-branch
為了解決這個問題,比較好的做好應該是這樣
git clone git@github.com:django/django.git --depth 1 --no-single-branch
( 這個和 --single-branch
比會稍微久一點點,因為每個 branch 的最新一個 history commit 都要 clone 下來 )
這樣的話,就可以保留 remote 的 branch 了,
成功切換 remote 的 branch, git checkout stable/2.2.x
。
最後稍微整理,
如要 clone 最近一次的 history,而且也需要其他 branch,使用如下,
git clone git@github.com:django/django.git --depth 1 --no-single-branch
如果你想要指定分支, 加上 -b
,
git clone git@github.com:django/django.git --depth 1 --no-single-branch -b stable/3.1.x
如要 clone 最近一次的 history,而且不需要其他 branch,使用如下,
git clone git@github.com:django/django.git --depth 1 --single-branch
or
git clone git@github.com:django/django.git --depth 1
更多詳細參數說明請參考 git clone
git status 指令
git status
可以讓我們觀看目前的 repository ( repo 容器 )。
意思是目前你的工作區是乾淨的。
工作區與暫存區 ( Stage )
git add 意思是把要送出的文件放到暫存區 ( Stage ) ,
然後執行
git commit 就可以把暫存區 ( Stage ) 裡所有修改的內容送到目前的分支上。
一旦送出 ( git commit ) 後,如果你又沒有對工作區做任何修改,那麼工作區就是"乾淨"的。
git commit -m "xxxxx" 指令,-m 後面輸入的內容是本次修改 ( 送出 ) 的說明,
盡量輸入一眼就可以看出這次送出修改了什麼的內容 ( 方便以後回去觀看能快速了解此次 commit 修改了什麼 )。
以下 demo 為在一個資料夾內新增一個 Hello.py 檔案
然後使用 git status 觀看目前的 repository ( repo 容器 ),你會看到 Hello.py 未被追蹤,如下圖
可以使用如下指令
git add Hello.py
額外補充,下面這個指令很有趣,大家可以玩玩看
git add -p
接著再使用
git commit -m "文字"
git commit -m "add Hello.py"
再使用 git status,你會發現工作區變乾淨了。如下圖
補充,如果只有輸入
git commit
這時會跳出編輯視窗
這時可以按鍵盤的 Ins鍵 ( 或按鍵盤上的 英文字 i ) 即可輸入文字
輸入完先按 Esc鍵 ,按完後底下的 INSERT 會消失,接著直接打 :wq ,再按 enter 就會儲存並離開了。
更多參數可參考 https://git-scm.com/docs/git-commit 說明。
如何修改最後一次的commit呢 ?
有時候我們 commit 完之後,才發現自己的 commit 內容手殘打錯了
這時候可以使用如下指令,他會跳出編輯視窗給你編輯你上一次的 commit 內容。
git commit --amend
又或是我們 commit 完之後,才發現自己漏了幾個檔案沒有 add 進去
這時候可以使用如下指令
git commit -m "init commit"
git add missing_file.py
git commit --amend
如上狀況為當我 git commit -m "init commit" 之後,
我發現我漏掉了 missing_file.py 這個檔案 ( commit 前忘記 add 進去 ) ,
這時候就可以使用 git commit --amend 來修改最後一次的 commit 。
有時候我們會為了方便,直接使用下面的指令一次加入全部的檔案
git add .
但是加完後發現其實有些檔案是不需要 add 進入的,這時候就可以使用如下指令去取消 add
git reset HEAD <file>
範例,路徑下有 A.py 以及 B.py 這兩個檔案,然後我使用 git add . 加入,
但加入完我發現其實 B.py 我還沒有要 add 進入,所以我這時候就可以使用 git reset HEAD B.py 去還原。
git push 指令
git push
將程式 push 到 github ( or bitbucket 之類 )上 , 如下圖
版本控制 - 歷史記錄
git log
按 小寫q 可退出
如果覺得版面太雜,可以使用下列指令
git log --pretty=oneline
按 小寫q 可退出
另外底下也是一個看 log 的方式( 很酷 :satisfied:),有 GUI 的感覺( 來源為文章最後的連結 )
git log --graph --pretty=format:"%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset" --abbrev-commit --date=relative
Git 中,使用 HEAD 表示目前的版本,
git reset --hard HEAD
如果現在要把目前版本退回到上一個版本,就可以使用 git reset 指令:
上一個版本就是HEAD~1,
git reset --hard HEAD~1
![alt