簡介
Git為分散式版本控制系統,是為了更好管理Linux內核而開發的。
一人開發:一份報告、文件有不同版本,為了要保留每個版本,就是在做版本控制
團隊開發:很多人共同開發一個檔案,如果有兩個人同時進行編輯的話,先進行編輯的人的修改內容會被覆蓋,相信大家都有這樣的經歷。這時候就容易產生有錯誤。
Git的版本控制系統就是為了解決這樣的問題而開發的。
優點:
1.有系統的存放每個版本
2.不需要儲存過多的檔案(備份)
3.可任意讀取之前的版本
常用指令
初始化
到任何一個新的目錄都必須先初始化,該目錄下有 .git 的資料夾,就代表該目錄可使用 git 版本控制,查看 git 目前的狀態,可以使用 git status
。
git init (folder)
git 初始化,該目錄下會建立 .git 檔案並建立新的folder中,有.git檔案
git 有三個層級 :local < global < system
git config <user.name & email>
: git 規定一定要有 user.name & email 才可以順利執行版控,所以在git init
後,要git config
設定使用者與信箱
範例
git config --global user.name "your name"
git config --global user.email "youremail"
git config --list (--local /global /system )
:列出目前有效的設定( 可選擇層級)
為什麼要設帳號與email?
擁有 user.name & email 的資訊,未來在 commit 等等都會留存資料,在團體開發時,若有衝突 Conflict,較快可抓到兇手(誒~不是拉),是比較好團隊溝通
四大區域 ( workspace 工作目錄 , staging暫存區 ,local 本地端 , remote 遠端)
我稱它為四大區域,簡單可以把它想像成:
workspace
:我現在的位置
staging
:暫存區(放那些準備要去新版本資料的地方)
local repo
:本地端的資料夾( PC 上)
remote repo
:遠端的資料夾(GitHub)
每一個 commit ,都可以想像成創立一個「新版本」的資料夾 ,在 commit 前的 add 就是這個版本的檔案,檔案可以有很多個
必學指令
git status
git 暫存區目前狀態
git add ( <file> / . )
:將 workspace 中的檔案加入到 staging 暫存區 ( . 代表全部檔案都加入)
git rm --cached <file>
: 將暫存區中的檔案退回工作區(不被追蹤的狀態)
git commit
:新建一個版本,將 staging 暫存區 的檔案加入local repo 本地資料庫,如果沒帶參數,他會跳到 Vim 編輯器,可輸入比較長的敘述(備註:新增了什麼功能等)
git commit -m “備註”
:新建一個版本,m 為 messerge 的意思,輸入較短敘述(備註)
git commit -am
:更改檔案內容且檔案已加入到 local repo 本地資料庫,可跳過暫存區直接 commit
git commit --amend
:可用來更改最新commit的檔案“標題與內容”,這邊指的標題與內容僅是上傳的標題
git log
:列出所有 commit 過的紀錄
git diff (A B)
:比較 暫存區與工作區 的比較差異/ 比較A、B版的差異
git diff --cached
:比較暫存區與HEAD比較差異
git cat-file -p _____
:查看__id的內容
git show ( ID )
:查看最新commit修改的log 包含異動內容//若要指定 就後面加個ID
git log --all
:log 全部的
git log --all --graph
顯示有線的log紀錄
git log --oneline
:可縮排成一行,較好閱覽
git reflog
可以查看所有 commit 紀錄與動作
log 與 show 差異
log 所有 commit 過的紀錄
show 是最新commit的修改,包含異動內容
git add -p
:選取部分內容加入到暫存區
(按s可以切割成更小區塊,y 加入到暫存區,e取消到暫存區)
以上用法適用於該檔案,已commit過到local respository才可
.gitignore
用法
比較機密的專案或沒有實質幫助的資料,不想放在 git 中備份的,就可新增.gitignore的檔案,並在內文打上不要需要備份的檔名, git 皆自動不將它儲存
分支多重要
git branch
:產生分支
git branch < new-branch-name > -m
: 重新命名目前分支的名稱
git switch <branch>
:切換分支
git branch -v
:顯示目前所有分支與當前 commit
git branch --list
:顯示目前所有分支
git branch <branch-name> -d
:刪除分支
git branch <branch-name> commit id
:建立dev分支在特定的commit 上
要跳到別的分支,可使用 checkout
merge 跟 rebase 差異
merge :我拉別人-我在主線 拉分支
rebase :別人拉我 -我跳到分支 拉主線
fast-forward :快進(只需要移動分支)。
rebase的概念
no fast-forward :一定會產生commit ,因此會有節點,優於未來尋找分支方便。
merge的概念
進階(不一定要記)
git stash save 命名
:將目前未commit 檔案收藏起來
git stash list
:列出暫存的項目,先進後出
運用git stash pop
可將收藏項目推出來
切換狀態
git revert (-n)
:復原 commit ,重做一個的意思 (不會重送出commit)
revert 的恢復是有順序性
git checkout
:改變目前的版本/將 HEAD 轉移到指定 branch 上,
- 有分 file - 工作目錄重設
- commit / branch - 工作目錄, HEAD 重設
git reset
有分三種--hard
/--mixed
/--soft
三者皆會HEAD位置&目前分支重設,預設為--mixed
hard & mixed 的差異
差異為 hard 工作目錄區也會一併重設
git cherry-pick commit
:擷取某個commit套用在目前分之上
git tag
:標籤(跟隨版本紀錄)
gitk --all
:git 內建陽春版圖形化介面
以上內容參考
1.偷米齊巴哥-簡單介紹GIT版本控制-Part1-4
2.[GIT101] Git 超新手入門