Git教程
Git基礎
直接快照,而非保存差異
其他版本管理在每個版本記錄每個文件與上一版本的差異信息。而git每個版本直接快照每個文件,如果文件未被修改則記錄鏈接到上一快照的鏈接。比較差異則是比較兩次快照。
文件狀態管理
文件狀態:未跟蹤,已提交,已修改,已暫存。
文件區域:本地數據目錄,工作目錄,暫存區
git使用
初始化
配置信息分爲系統級、用戶級、倉庫級。其中系統級配置文件在操作系統或安裝目錄的/etc/gitconfig
中,用戶級在操作系統的user/.gitconfig
中,倉庫級則在改倉庫的.it/gitconfit
中。
1. 在需要進行版本管理的倉庫根目錄下運行git init
(之後的命令一般都在此目錄下運行)
該命令會在目錄下創建.git
文件夾,其中包含配置信息等文件。
1. 表明身份
運行命令git config user.email "[email protected]"
來指明郵箱地址
運行命令git config user.name "UserName"
來指明稱呼
注意該命令表明的身份僅在該倉庫下有效,所保存的user信息也只在該目錄下的
.git/config
文件中。
如果是git config --global user.email "xxxx"
和git config --global user.name "xxxx"
則在本電腦中本用戶下有效,配置信息也將保存到操作系統下的user
目錄下。
1. 指定默認文本編輯器(可選)
1. 指定差異分析工具(可選)
1. 查看配置信息
- 使用git config --list
命令來查看配置信息。
如果看到同一個配置出現多次,則表示它可能在系統級或用戶級均有設置,在本git倉庫中只有最後一個生效。
- 使用git config user.name
命令來查看指定配置信息
git add
將文件添加到版本控制(跟蹤文件)
git add filename
添加指定未跟蹤文件到版本控制,或添加跟蹤後已修改文件到暫存區git add .
添加該目錄下所有文件到版本控制
git commit
提交修改
git commit
不帶參數時會打開默認文本編輯器讓輸入提交說明(可以指定編輯器)git commit -m "infomation"
帶描述信息提交修改git commit -m "infomation -a"
自動將已跟蹤文件暫存,並提交修改git commit --amend
將暫存區補交到上一次提交
提交暫存區的信息。如果修改後未進行
git add
,則該修改不會被提交。
git clone
從現有倉庫克隆
git clone git://github.com/schacon/grit.git
會在當前目錄下創建一個grit
文件夾,裏面就是克隆下來的倉庫了。git clone git://github.com/schacon/grit.git mydir
較上面那個命令,將girt
文件夾改名爲mydir
git status
倉庫狀態
- 執行
git status
命令後會返回一些信息,內容如下
- Untracked files 列出未跟蹤文件
- Changes to be committed 列出已暫存需要被提交文件(當存在未跟蹤文件時不顯示此信息)
- Changes not staged for commit 暫存或提交後被修改文件
忽略某些文件
創建.gitignore
文件,將需要忽略的文件寫在.gitignore
中即可。
1. 支持簡化正則表達式(*
、[]
、?
)
1. 以#
開頭表示該行爲註釋
1. 以/
結尾表示忽略改文件夾
git diff
比較差異
git diff
不加參數時比較的是未暫存和已暫存的快照差異git diff -cached
比較的是已暫存和已提交的快照差異(同git diff -staged
)
git rm
從git移除某個文件
git rm filename
將filename從暫存區移除(從版本管理移除)git rm filename -f
如果要移除的文件修改過並add到暫存區,則需要加上-f
參數
注:上兩條命令會將文件從本地刪除git rm filename --cached
從版本控制移除,但不刪除文件(之後需要手動添加到.gitignore
)- 此命令中的文件名參數支持簡化正則表達式
git mv
移動或重命名某個文件
git mv file to new
重命名“file”爲“new”
重命名會同時將文件重命名
直接在外面修改文件名,再git status
提示舊文件被刪除,新文件未跟蹤;再git add .
之後提示文件重命名
git log
查看提交歷史(未完整)
git log
顯示歷史記錄git log -2
顯示最新兩次提交git log -p
顯示帶內容差異的歷史記錄git log --name-only
增加顯示文件名git log --name-status
增加顯示文件名即文件操作git log --stat
顯示帶增刪行數的歷史記錄git log --shortstat
相對--stat
不顯示具體每個文件情況git log --pretty=oneline
每個提交信息在一行中顯示git log --pretty=short
不帶日期git log --pretty=full
同git log
git log --pretty=fuller
增加提交人和提交時間git log --pretty=format:"%h - %an, %ar : %s"
指定log格式
%H
提交對象哈希串(完整)%h
提交對象哈希串(簡短)%T
樹對象的哈希串(完整)%t
樹對象的哈希串(簡短)%P
父對象的哈希串(完整)%p
父對象的哈希串(簡短)%an
作者名字%ae
作者郵件%ad
作者修訂日期,可用-date=
定製格式%ar
作者修訂日期,按多久以前的格式%cn
提交者名字%ce
提交者郵件%cd
提交日期,可用-date=
定製格式%cr
提交日期,按多久以前的格式%s
提交說明
git log --graph
顯示每個提交所在分支及分支的分化合並情況,推薦在單行情況下使用該參數- 信息顯示不完時會進入控制模式
q
退出↓
顯示下一行
git reset
git reset HEAD filename
從暫存區取消filenamegit reset HEAD~3
向回移動HEAD三個提交
回退到歷史注意記住當前commit的id,便於移動HEAD到將來git reset HEAD~
向回移動HEAD一個提交(同上)git reset sha_id
移動HEAD到指定commitID
git checkout
之取消對文件的修改
git checkout -- filename
取消對文件filename的修改
遠程倉庫
git remote
查看遠程倉庫
git remote
查看遠程倉庫git remote -v
查看倉庫對應的地址(同--verbose
)git remote add origin giturl.git
添加遠程倉庫giturl.git簡稱origingit remote show origin
查看遠程origin倉庫的信息git remote rename pb pa
將遠程倉庫pb重命名爲pagit remote rm pb
將遠程倉庫pb移除
git fetch
從遠程倉庫抓取數據
git fetch xxxx
從遠程倉庫xxxx抓取數據(只是將遠端數據拉倒本地,並不自動合併到當前工作分支)
git pull
從遠程倉庫抓取數據
git push
推送數據到遠程
git push origin master
推送master分支到origin倉庫git push origin v1.5
推送標籤v1.5到遠程origin倉庫git push origin --tags
推送所有標籤到遠程origin倉庫
git tag
打標籤
git tag xxx
創建一個不帶附註的輕量級標籤(不推薦)git tag -a xxx -m "yyy"
創建一個附註爲yyy的標籤xxxgit tag -s xxx -m "yyy"
創建並使用私鑰簽署標籤git tag -v xxx
使用簽署者的公鑰驗證已簽署的xxx標籤git tag
查看現有標籤git tag -l “v1.4.2.*”
查看所有v1.4.2
開頭的標籤git tag -a xxx yyyyyy -m "zzzz"
爲以前的提交打標籤。yyyyy爲需要假標籤的提交的校驗和,xxx爲標籤名,zzz爲說明
git show
顯示當前信息
git show
顯示最後一次提交信息git show xxx
顯示標籤爲xxx的提交信息
git技巧
自動補全
命令別名
本地分支
分支結構
- HEAD指針指向當前工作分支
- 分支指針指向該分支最後一次提交的commit對象
- commit對象包括
- 指向上一次提交對象的parent指針(第一次提交沒有)
- 作者信息
- 提交者信息
- 指向提交文件目錄樹的指針
- 提交文件目錄樹
- 一個目錄樹爲一個Tree對象
- 包括該目錄下的文件快照和子目錄樹對象
- 文件快照
- 一個文件快照爲一個blob對象
git branch
管理分支
git branch
列出當前所有分支(當前工作分支前有*
)git branch -v
帶最後一次提交信息的分支列表git branch --merge
查看那些分支已經與當前分支合併git branch --no-merge
查看那些分支未與當前分支合併git branch name
在當前commit對象創建一個name分支
創建分支並不會影響當前工作分支,需要手動將工作分支切換到新建的分支git branch -d name
刪除name分支git branch -D name
強制刪除name分支(比如name分支未合併時只能強制刪除)
git checkout
之切換工作分支
git checkout name
將工作分支切換到name分支(讓HEAD指針指向name分支,將工作目錄中的文件替換爲name分支指向的文件快照內容)git checkout -b name
新建並切換到name分支
git merge
合併分支
git merge name
合併name分支到當前工作分支
遠程分支
git fetch
抓取遠程倉庫
git clone
命令在本地建立記錄遠程分支的origin/master,與本地master分支
1.git fetch origin
抓取遠程倉庫origin的master分支,更新本地記錄的遠程分支origin/master
git rebase
衍合(未完整)
git rebase master
將master分支上提交的修改(從公共parent開始),在當前工作分支上重做一遍
將已有代碼提交到github
- 添加
.gitignore
文件,添加忽略列表 - 執行
git init
初始化代碼倉庫 - 執行
git config user.email ""
和git config user.name ""
初始化配置
不建議帶--global
參數,最好每個代碼倉庫使用獨立配置信息 - 執行
git add .
添加全部內容到本地倉庫 - 執行
git commit -m ""
提交當前代碼到本地倉庫 - 在GitHub上
New respository
(只填寫Repository name
即可) - 複製網頁上的https到剪貼板(不是瀏覽器地址欄,是在頁面上的)
- 執行
git remote add origin xxx
添加遠程倉庫
在命令行寫到origin
後按鼠標右鍵即可將剪貼板內容粘貼至此 - 執行
git push origin master
提交代碼
這裏不建議使用-u
參數。該參數表示以後的push``pull
操作默認使用本次的遠程服務器。建議每次執行命令都帶上要操作的對象,不使用默認。 - 在網頁上刷新一下即可看到提交結果。