本文包括git的簡(jiǎn)介搂捧、基本使用方法、部分原理
這么好用的工具必須安利大家使用滥沫,真的是越使用越覺得其強(qiáng)大的功能侣集。
用過圖形界面和命令行,還是命令行下面使用的得心用手兰绣,推薦大家了解原理后使用命令行世分。
相關(guān)文檔
安裝
Windows
下載相應(yīng)包安裝即可
Linux
$ sudo yum install git #yum軟件包管理工具
$ sudo apt-get install git #基于Debian的發(fā)行版
Mac OS X
Terminal 里嘗試首次運(yùn)行 git 命令即可,會(huì)提示你安裝
源碼安裝
命令校驗(yàn)是否安裝成功
$ git --version
概述
概念
- 直接記錄快照缀辩,而非差異比較
- 近乎所有操作都是本地執(zhí)行
- Git 保證完整性
- Git 一般只添加數(shù)據(jù)
- 三種狀態(tài)
- 已提交(committed) 對(duì)應(yīng) .git directory(Repository) 工作區(qū)域
- 已修改(modified) 對(duì)應(yīng) Working Directory工作區(qū)域
- 已暫存(staged/Index) 對(duì)應(yīng) Index/Staging Area工作區(qū)域
配置
- 系統(tǒng)級(jí)別:
/etc/gitconfig
,通過git config --system
命令來配置 - 用戶級(jí)別:
~/.gitconfig
或者~/.config/git/config
,通過git config --global
來配置 - 倉(cāng)庫(kù)級(jí)別:
.git/config
# 設(shè)置用戶名
$ git config --global user.name "xxx"
# 設(shè)置email
$ git config --global user.email "xxx@xx.com"
# 設(shè)置默認(rèn)文本編輯器罚攀,當(dāng)Git需要你輸入信息的時(shí)候會(huì)調(diào)用它
$ git config --global core.editor emacs
# 檢查配置信息
$ git config --list
# 設(shè)置credential cache,省得多次輸入密碼
$ git config --global credential.helper cache
獲取幫助
# 有關(guān)命令的更多信息
$ git <verb> --help
$ git help <verb>
$ man git-<verb>
基礎(chǔ)文件操作
獲取Git倉(cāng)庫(kù)
-
git init
將現(xiàn)有目錄和文件初始化一個(gè)Git倉(cāng)庫(kù)雌澄,會(huì)生成一個(gè).git文件夾(這個(gè)文件夾就是本地Git倉(cāng)庫(kù)) -
git clone [url]
來克隆現(xiàn)有的倉(cāng)庫(kù)
$ git clone https://github.com/catchance/git-learning.git git-learning
檢查當(dāng)前文件狀態(tài)
$ git status
git status命令的功能
- 查看當(dāng)前工作區(qū)的狀態(tài)
忽略文件
創(chuàng)建.gitignore文件來來將某些文件不納入Git管理
# 忽略所有以 .o 或 .a 結(jié)尾的文件
*.[oa]
# Git 忽略所有以波浪符(~)結(jié)尾的文件
*~
- 匹配模式可以以
/
開頭防止遞歸- 匹配模式可以以
/
結(jié)尾指定目錄- 所有空行或者以 # 開頭的行都會(huì)被 Git 忽略斋泄。
- 可以使用標(biāo)準(zhǔn)的 glob 模式匹配(指 shell 所使用的簡(jiǎn)化了的正則表達(dá)式。)
- 星號(hào)(*)匹配零個(gè)或多個(gè)任意字符镐牺;
- [abc] 匹配任何一個(gè)列在方括號(hào)中的字符
- 問號(hào)(?)只匹配一個(gè)任意字符
- 使用兩個(gè)星號(hào)(*) 表示匹配任意中間目錄
a/**/z
- 方括號(hào)中使用短劃線分隔兩個(gè)字符炫掐,表示所有在這兩個(gè)字符范圍內(nèi)的都可以匹配
[0-9]
跟蹤文件,將文件添加到暫存區(qū),文件處于暫存狀態(tài)睬涧。
# 跟蹤文件募胃,文件處于暫存狀態(tài) 默認(rèn)是忽略溢出的操作
$ git add <file>...
# 跟蹤文件,文件處于暫存狀態(tài) 同時(shí)對(duì)于刪除的操作進(jìn)行記錄
$ git add --all <file>...
# 將文件撤出未跟蹤的狀態(tài)
$ git reset HEAD <file>...
# 將已經(jīng)修改的文件還原成HEAD索引指向的版本
$ git checkout -- <file>...
HEAD
指向當(dāng)前所在分支畦浓,將HEAD
想象為當(dāng)前分支的別名痹束。- git add命令的功能:
- 可以用它開始跟蹤新文件
- 把已跟蹤的文件放到暫存區(qū)
- 合并時(shí)把有沖突的文件標(biāo)記為已解決
- git checkout --命令
- 撤銷對(duì)工作區(qū)修改,這個(gè)命令是以最新的存儲(chǔ)時(shí)間節(jié)點(diǎn)(add和commit)為參照
- 覆蓋工作區(qū)對(duì)應(yīng)文件file讶请;這個(gè)命令改變的是工作區(qū)
- git reset命令
- 清空add命令向暫存區(qū)提交的關(guān)于file文件的修改(Ustage)
- 這個(gè)命令僅改變暫存區(qū)祷嘶,并不改變工作區(qū)
對(duì)比文件信息
# 對(duì)比工作目錄中的文件和暫存區(qū)的區(qū)別
$ git diff
# 對(duì)比暫存區(qū)的文件和上一次提交的不同
$ git diff --cached
# 效果等同于 --cached命令
$ git diff --staged
# 可以使用diff插件來分析結(jié)果
$ git difftool --tool-help
git show
命令
- 顯示具體的代碼改動(dòng)情況
# 查看某次commit的修改內(nèi)容 $ git show <commit-hash-id>
提交更新
# 提交更新
$ git commit -m "message"
# 跳過暫存區(qū)直接提交
$ git commit -a -m "message"
- 提交時(shí)記錄的是放在暫存區(qū)域的快照
- 每一次運(yùn)行提交操作,都是對(duì)你項(xiàng)目作一次快照,以后可以回到這個(gè)狀態(tài)论巍,或者進(jìn)行比較烛谊。
移除文件
# 將刪除的文件提交 rm <file>
$ git add --all <file>... 提交工作空間中刪除的文件
# 同 git add 命令一樣的
$ git rm <file>
# 如果工作空間不想刪除,而只是想刪除Git跟蹤的文件的話
$ git rm --cached <file>...
移動(dòng)文件
# Git 并不顯式跟蹤文件移動(dòng)操作
# 如果在 Git 中重命名了某個(gè)文件嘉汰,倉(cāng)庫(kù)中存儲(chǔ)的元數(shù)據(jù)并不會(huì)體現(xiàn)出這是一次改名操作
# git mv命令相當(dāng)于 mv xx xxx git rm xx git add xxx
$ git mv <file> <file>
查看提交歷史
git log
命令的輸出格式多種多樣丹禀,自行參考幫助文檔。
# 查詢提交歷史
$ git log
# 常用提交信息
$ git log --oneline --graph --all --decorate
# -2 用來顯示最近兩次提交鞋怀,-p用來顯示每次提交的內(nèi)容差異
$ git log -p -2
# 查看某個(gè)文件的修改歷史
$ git log -p <filename>
# 除了顯示基本信息之外双泪,還附帶了每次 commit 的變化
$ git log --stat
# 可以指定使用不同于默認(rèn)格式的方式展示提交歷史
$ git log --pretty=oneline
# 添加了一些ASCII字符串來形象地展示你的分支、合并歷史
$ git log --graph
# 顯示某個(gè)路徑或者文件的提交歷史
$ git log -- <path>
查詢引用變更的記錄
# 查詢操作的相關(guān)記錄
$ git reflog
撤銷操作
# 重新提交命令
# 這個(gè)命令會(huì)將暫存區(qū)中的文件提交,如果快照會(huì)保持不變密似,而你所修改的只是提交信息焙矛。
$ git commit --amend
# 撤銷暫存區(qū)的記錄,工作區(qū)的文件不變辛友。
$ git reset HEAD <path>
# 重置工作區(qū)中的文件薄扁,從暫存區(qū)或者上次提交中重置文件。
$ git checkout -- <path>
遠(yuǎn)程倉(cāng)庫(kù)
查看遠(yuǎn)程倉(cāng)庫(kù)信息
# 列出你指定的每一個(gè)遠(yuǎn)程服務(wù)器的簡(jiǎn)寫
$ git remote
#會(huì)顯示需要讀寫遠(yuǎn)程倉(cāng)庫(kù)使用的 Git 保存的簡(jiǎn)寫與其對(duì)應(yīng)的 URL废累。
$ git remote -v
# 要查看某一個(gè)遠(yuǎn)程倉(cāng)庫(kù)的更多信息
$ git remote show origin
添加遠(yuǎn)程倉(cāng)庫(kù)
# 添加一個(gè)新的遠(yuǎn)程 Git 倉(cāng)庫(kù)邓梅,同時(shí)指定一個(gè)你可以輕松引用的簡(jiǎn)寫
$ git remote add <shortname> <url>
從遠(yuǎn)程倉(cāng)庫(kù)中抓取與拉取
# 從遠(yuǎn)程倉(cāng)庫(kù)中獲得數(shù)據(jù),它并不會(huì)自動(dòng)合并或修改你當(dāng)前的工作
$ git fetch [remote-name]
# 通常會(huì)從最初克隆的服務(wù)器上抓取數(shù)據(jù)并自動(dòng)嘗試合并到當(dāng)前所在的分支。
$ git pull [remote-name]
推送到遠(yuǎn)程倉(cāng)庫(kù)
# 要將 master 分支推送到 origin 服務(wù)器時(shí) `git push [remote-name] [branch-name]`
$ git push origin master
遠(yuǎn)程倉(cāng)庫(kù)的移除與重命名
# 修改你的遠(yuǎn)程分支名字
$ git remote rename pb paul
$ git remote
# 移除一個(gè)遠(yuǎn)程倉(cāng)庫(kù)
$ git remote rm paul
$ git remote
打標(biāo)簽
# 過濾顯示定義的標(biāo)簽
$ git tag -l 'v1.8.5*'
# 創(chuàng)建標(biāo)簽
$ git tag -a v1.4 -m 'my version 1.4'
# 輕量標(biāo)簽 輕量標(biāo)簽本質(zhì)上是將提交校驗(yàn)和存儲(chǔ)到一個(gè)文件中 - 沒有保存任何其他信息邑滨。
$ git tag v1.4-lw
# 后期打標(biāo)簽 9fceb2每次提交的校驗(yàn)和
$ git tag -a v1.2 9fceb2
# 共享標(biāo)簽 默認(rèn)情況下日缨,git push 命令并不會(huì)傳送標(biāo)簽到遠(yuǎn)程倉(cāng)庫(kù)服務(wù)器上。
# 在創(chuàng)建完標(biāo)簽后你必須顯式地推送標(biāo)簽到共享服務(wù)器上掖看。
$ git push origin [tagname]
# 檢出標(biāo)簽 `git checkout -b [branchname] [tagname]`
$ git checkout -b version2 v2.0.0
Git別名
# 取消暫存文件別名
git config --global alias.unstage 'reset HEAD --'
# 輕松地看到最后一次提交
git config --global alias.last 'log -1 HEAD'
Git分支
創(chuàng)建分支
創(chuàng)建分支匣距,就相當(dāng)于在當(dāng)前分支上面創(chuàng)建一個(gè)指針。
Git有一個(gè)HEAD的特殊指針哎壳,指向當(dāng)前所在的本地分支毅待。
# 創(chuàng)建分支
$ git branch testing
stash的常用操作
$ git stash #保存當(dāng)前的修改
$ git stash pop #彈出stash中最頂端的即stash<0>的內(nèi)容
$ git stash list #查看stash中所有的改動(dòng)
$ git stash apply @stash<id> #彈出stash<id>的修改
$ git stash pop @stash<id> #彈出stash<id>的修改
$ git stash clear #清除所有的stash
$ git stash drop @stash<id> #移除stash<id>
切換分支
切換分支的時(shí)候通過保存進(jìn)度(stashing) 和 修補(bǔ)提交(commit amending)
保持好一個(gè)干凈的狀態(tài)。
$ git checkout testing
$ git checkout master
# 創(chuàng)建分支并且切換分支
$ git checkout -b <branchname>
刪除分支
# 刪除分支
$ git branch -d <branchname>
合并分支
fast-forward
分支所指向的提交是你當(dāng)前提交的直接上游
# 合并test分支到當(dāng)前分支
$ git merge test
沖突的解決
分支管理(開發(fā)分支流)
- 長(zhǎng)期分支 用來維護(hù)不同層次的穩(wěn)定性
- master分支 只保留完全穩(wěn)定的代碼
- develop/next分支 后續(xù)開發(fā)和測(cè)試穩(wěn)定性
- pu(proposed updates) 建議更新分支归榕,不成熟的內(nèi)容不適合放入master和develop的
- test 測(cè)試部門使用的需要測(cè)試的分支
- 短期分支尸红,特性分支
- issue分支 特性分支
- hotfix分支 緊急修復(fù)補(bǔ)丁分支
遠(yuǎn)程分支
$ git remote show <remote>
$ git ls-remote <remote>
- 推送
$ git push <remote> <branch> # 將本地的 localbranch 分支推送到遠(yuǎn)程倉(cāng)庫(kù)上的 serverfix 分支 $ git push origin localbranch:serverfix # 運(yùn)行 git merge origin/serverfix 將這些工作合并到當(dāng)前所在的分支 $ git merge origin/serverfix
- 跟蹤分支
# 查看設(shè)置的所有跟蹤分支 $ git branch -vv # 在自己的 serverfix 分支上工作,可以將其建立在遠(yuǎn)程跟蹤分支之上 $ git checkout -b serverfix origin/serverfix # 上面命令的快捷方式 $ git checkout --track origin/serverfix # 設(shè)置已有的本地分支跟蹤一個(gè)剛剛拉取下來的遠(yuǎn)程分支 $ git branch -u origin/serverfix
- 拉取
# 抓取本地沒有的數(shù)據(jù)時(shí)刹泄,它并不會(huì)修改工作目錄中的內(nèi)容 $ git fetch # 相當(dāng)于fetch然后緊接著一個(gè)merge命令 $ git pull
- 刪除遠(yuǎn)程分支
# 刪除分支 $ git push origin --delete serverfix
變基rebase
整合分支的兩種方式:rebase和merge
merge:它會(huì)把兩個(gè)分支的最新快照以及二者最近的共同祖先進(jìn)行三方合并外里,合并的結(jié)果是生成一個(gè)新的快照并提交
rebase:提取在分支中所做的補(bǔ)丁和修改,然后在需要合并的分支上再應(yīng)用一次特石。用于把一個(gè)分支的修改合并到當(dāng)前分支盅蝗。rebase用來修改本地私有提交歷史的。
# git rebase [basebranch] [topicbranch]
# 在git rebase后面加上參數(shù)<branch>姆蘸,那么會(huì)先執(zhí)行g(shù)it checkout到這個(gè)分支墩莫,如果沒有加分支則表示對(duì)當(dāng)前分支進(jìn)行操作
$ git rebase master server
# git add 解決沖突后繼續(xù)rebase
$ git rebase --continue
# --abort參數(shù)來終止rebase的行動(dòng)芙委,并且"mywork" 分支會(huì)回到rebase開始前的狀態(tài)。
$ git rebase --abort
# 想維持樹的整潔
$ git fetch origin master
$ git rebase origin/master
$ git push
不要對(duì)在你的倉(cāng)庫(kù)外有副本的分支執(zhí)行rebase操作
Git Revert原理:根據(jù)你要回退的提交所做的改動(dòng)做相反的改動(dòng)贼穆,然后重新提交代碼题山,使代碼達(dá)到?jīng)]有這些舊提交所能達(dá)到的狀態(tài)兰粉。
使用git reset是不影響遠(yuǎn)程分支的故痊,一切都在本地發(fā)生。如果回退需要很快影響遠(yuǎn)程分支的玖姑,應(yīng)該使用git revert
規(guī)范
-
如果某些文件已經(jīng)被跟蹤了愕秫, 再放入到.gitinore可能會(huì)失效, 用以下命令來忽略
# 忽略文件 $ git update-index --assume-unchanged filename # 撤銷用: $ git update-index --no-assume-unchanged filename
git diff --check
找出可能的空白錯(cuò)誤并將它們列出來-
本地分支和遠(yuǎn)程分支的綁定(tracking)焰络,加上 rebase 策略
[branch "master"] remote = origin merge = refs/heads/master rebase = true
解決多個(gè)問題戴甩,最好不要一次提交,根據(jù)任務(wù)分開提交闪彼。
-
每次提交信息的模板
修改的摘要(50 個(gè)字符或更少)
如果必要的話甜孤,加入更詳細(xì)的解釋文字。在
大概 72 個(gè)字符的時(shí)候換行畏腕。在某些情形下缴川,
第一行被當(dāng)作一封電子郵件的標(biāo)題,剩下的
文本作為正文描馅。分隔摘要與正文的空行是
必須的(除非你完全省略正文)把夸;如果你將
兩者混在一起,那么類似變基等工具無法
正常工作铭污。空行接著更進(jìn)一步的段落恋日。
句號(hào)也是可以的。
項(xiàng)目符號(hào)可以使用典型的連字符或星號(hào)
前面一個(gè)空格嘹狞,之間用空行隔開岂膳,
但是可以依據(jù)不同的慣例有所不同。