Git
Git 是⼀種分散式版本的版本控制系統,就像是我們以前做報告時,會把一份報告根據不同的更改紀錄而有不同的名稱,一個檔案會有不同的版本,我們希望能夠把這些版本都保存起來
我們這樣做會難以照到報告之間的關係是什麼,很難以得知哪一個檔案是根據哪一個為基底去做更改。因此當檔案量很多的話,我們就會希望有一個版本控制的系統來幫助我們使用
在團隊上,一個軟體的開發會有不同的分支,要從某一個版本切出不同的分支,再由這些分支合併
版本控制的流程:
- 需要一個新版本時: 開一個資料夾,把資料放進去
- 不想加入版本控制: 不要加入資料夾
- 避免版本號衝突: 用看似術數的東西當作資料夾名稱
- 知道位新版本: 用一個檔案來存
- 會有個檔案來記錄歷史順序
通常我們是開一個新的branch 來做專業,為了保持master的穩定而不直接在master上面操作
Git 指令
git init
對我們的專案使用git這個軟體,主要⽬的是要讓 Git 開始對這個⽬錄進⾏版本控制。
這個指令會在這個⽬錄裡建立⼀個 .git 隱藏⽬錄,整個 Git 的需要的東西都在這個⽬錄裡。
git status
查看目前版本控制的狀態
git add
把我們想要的檔案加入倒版本控制中,而加入的同時我們可以看他們的狀態。如果出現
- untracked: 表示沒有加入到版本控制
- staged: 已經加入到版本控制,但還沒有正式加入倒新的版本
(changed to be committed 這區塊)
如果有很多檔案要加入的話,可以輸入 git add .
,就可以一口氣把所有的檔案都加入到版本控制,也可以輸入資料夾名稱,把資料夾的所有檔案都加入版本控制
要記得加入版本控制這個動作是每次都要做一次,才能接下來的git commit
的動作
git commit
新建一個版本,就像是新建一個資料夾,而它的名稱就是那一長串的亂碼編號
通常是在於完成一個小進度時再 commit
沒有成功是因為我們沒有 commit message,因此要改為 git commit -m "要輸入的訊息"
再來查看他的狀態是否已經有新的版本
我們可以利用一個合併的語法,把git add
和git commit
合併起來
git commit -am "要輸入的訊息"
就可以把修改的檔案加入倒版本控制並且新建一個版本,但要記得她不會把新的檔案加入倒暫存區裡面
如果我們不小心訊息輸入錯誤的話,則可以利用git commit --amend
來更改訊息
git reset HEAD^
如果不想要這個commit時,想要收回可以利用git reset HEAD^ --hard
就會全部不見(包含改過的檔案)
我們就把它移除了,因此git log的時候剛剛的commit完全不見
如果想要改過的檔案還在的話,可以用git reset HEAD^ --soft
指令
HEAD^
: 上一個的意思,head指最前面的那個
git log
可以用來查看歷史紀錄
git log --oneling
: 可以顯示出比較簡短的歷史紀錄
git checkout
可以回到過去的版本
git checkout
編碼: 回到那個狀態的檔案
git checkout master
: 可以讓你回到最新的狀態
如果想要把檔案改回到還沒改過的檔案時,可以利用git checkout --檔案名
會回復到你上一個commit的狀態
.gitignore
可以把想要忽略的檔案放在裡面,可以想像這檔案會被排除在資料夾外
像我們之前的例子,有一個檔案 test 是我們不想要放進版本控制內的檔案(利入 log 紀錄檔或者作業系統的檔案,跟此專案本身沒什麼關係),因此我們可以把要忽略的檔案放在.gitignore
裡面,做完後記得這個檔案本身也要加入到版本控制內(因為其他專案的人也要看到是什麼檔案被忽略)
(把test加入進去)
git diff
可以看在你 commit 之前,做了哪些事情,看你這一次跟上一次的差別在哪
Branch
一條線的開發模式,其實問題很大,因為沒辦罰同時處理很多事情,因為東西都在同一條commit上
引進branch後,大家可以分工各做各的事情,平行開發,最後做完再把它們合併起來
再合併的部分其實就是把branch後面的分支拿下來,因為他們有共同的祖先,然而最麻煩的是兩個branch改道同一個檔案,會不知道要合併哪個檔案=> conflict
git branch
就像是複製一個資料夾近來
git branch -v
可以看到目前有哪些branch
再git裡面,master 為主幹(最主要的分支)
如果要建立新的 branch 則輸入git branch 名稱
即可
刪除特定的branch git branch -d 名稱
NOTE:-d
通常都是刪除的意思
如果要改名的話可以用git branch -m 新的名稱
來執行
如果要抓遠端branch的話則可以直接利用 git checkout branch名稱
git就會直接把遠端的branch給抓下來
git checkout
跟前面的 checkout 用法一樣
git checkout branch-name
我們讓這個分枝有個 commit 新的資料夾
git merge
當我們在分支開發完後,需要合併回 master
指令: git merge 名稱
把新的分支合併進去到master
合併完後就可以把之前的那個branch給移除
conflict
假如在處理專案時,與同事同時更改到同一專案時,git會無法判別要使用哪一個檔案
此時需要手動來解決,git會出現衝突並且此時出現的衝突在哪裡,自己可以手動解決,最後再 commit 即完成
Head 代表目前所在位置的檔案,我們必須決定合併完的內容要長怎樣
github
主要功能可以放 git repository 的地方,讓大家可以多人協作共用一個git的project
issue: 可以當作一個專案的討論區
contributor: 有誰跟你一起協作
pull request: 當有一個 branch 想要合併到另一個 branch 的時候,可以利用它來做審核,直接在上面可以看到有直接在上面可以看到那些檔案改變,並且給予建議以及合併
上傳code
首先直接點選github裡面的new repository
接著跟著只是
git remote add origin https://github.com/impala8012/test1.git
git push -u origin master
把指令輸進去 就可以順利把檔案上傳進去
Note: 如果要複製貼上的話不能使用一般的Ctrl+c/+v
而是要用
Ctrl+ins 複製
Shift+ins 貼上
git push 指令
利用push指令來把本地最新的改變給傳上去
Github 這邊也上傳成功
此外也可以上傳一個branch
git pull
如果有人改變了這個 repository,我們要利用 pull 把這個改變給抓下來
首先假如我們在github裡面有座先更改
接著我們利用git pull origin master
把最新的資料抓下來
pull request
可以在 github 的介面裡合併兩個 branch,並且會顯示兩個 file 中的變化
點選 compare & pull request
最後點選 merge,並且可以 delete branch
於是可以發現 master branch 已經把檔案給合併起來了
通常都會在github上面利用pull request合併
git clone
假如我們看到別人的repository不錯,我們可以利用git clone 把牠抓下來
可以複製裡面的網址然後輸入git clone 網址
就可以把牠抓下來了
但是我們要注意這個是別人的repository,我們只能本地commit但不能push回去,因為我們沒有權限
如果要push上去的話,需要利用fork,把那個repository複製過來然後再重新clone一次
最後也可以push回去了
github pages
github 製造一個免費的靜態網頁的空間,可以讓我們上傳我們的靜態網頁
github workflow
一個github的流程:
- Create a branch
- Add commits
- Open a Pull Request
- Discuss and review your code
- Deploy
- Merge
GitLab 與 Bitbucket有其他類似github的服務
hook
在程式裏面的hook則代表發生某件事情的時候會通知我,可以偵測某些指令。例如有人 commit 時通知我或者有人push時通知我等等。
在我們 .git 的資料夾裡面有一個 hook 的資料夾
Shell Script
shell script (程式化腳本),是一個文字介面底下讓我們與系統溝通的一個工具介面,讓我們以更方便,更自動化的方式來執行想要執行的指令。快速的協助使用者 or 管理者大量地執行重複性的動作與指令。
Shell Script撰寫
在windows,我們可以利用git bash要執行Shell script
創建一個.sh
的檔案 => touch num.sh
接著可以利用vim文字編輯器在裡面寫入我們要的程式
以Lidemy的作業為例:
寫一個 shell script,可以傳入一個數字 n,然後會產生 1~n 個檔案,檔名是 {number}.js
。
這時候我們要利用迴圈的方式來完成
我們可以寫
for((i = 1; i<=$1;i++))
do
touch ${i}.js
done
echo "File created"
用while迴圈的話則會長這樣
i=1
n=$1
while [ $i -le $n ]
do
touch $i.js
((i++))
done
echo "File Created"
注意:讀取參數位置來獲取參數時,需要用 $1 到 $9 獲取第1到第9個的命令行參數。$0為shell名。
參考資料
技術共筆部落格
鳥哥的Linux私房菜
Shell Script 教學
it邦
grep、cut、awk、sed文本处理
sed与awk实例
shell判斷式