下面是對git的各類使用及命令的基礎使用,來自廖雪峯老師的git教程,這個收錄下,做爲git的使用總結。git
github上面地址爲:https://github.com/Zhangguoliu/learn-git/blob/master/learngit-note.mdgithub
++++++++++++++++++++++++++++++++++++++++++++++++++安全
Git學習筆記服務器
目錄app
Git簡介ssh
安裝Git編輯器
建立版本庫||使用vi編輯器||把文件添加到版本庫||查看工做區當前狀態分佈式
Git簡介
Git是分佈式版本控制系統
集中式VS分佈式:
集中式版本控制系統,版本庫集中存放在中央服務器,必需要聯網才能工做,沒有歷史版本庫。
分佈式版本控制系統,沒有「中央服務器」,每一個開發人員電腦上都有一個完整的版本庫。
分佈式優點:安全性更高,無需聯網,若「中央服務器」故障,任何一個其餘開發者本地都有最新的帶歷史記錄的版本庫。
主要區別在於歷史版本庫的存放,集中式歷史版本只存在於中央服務器,而分佈式中每一個本地庫都有歷史記錄存放。
安裝Git
Linux系統
Debian或Ubuntu Linux
sudo apt-get install git
老版本Debian或Ubuntu Linux
sudo apt-get install git-core
其餘版本Linux,官網下載源碼解壓,而後依次輸入
./config ——> make ——> sudo make install
Windows系統
官網下載,安裝完成後,「Git」->「Git Bash」便可打開
Git配置
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
注意--global參數表示你這臺機器上全部的Git倉庫都會使用這個配置。
Git命令
建立版本庫
選擇一個合適目錄
Windows系統請確保目錄名(包括父目錄)不包含中文
如$ cd d:
$ mkdir <repository-name>,建立庫名
$ cd <repository-name>,進入庫內
補充pwd顯示路徑,ls顯示當前目錄,ls -ah顯示隱藏目錄
在當前目錄初始化庫
$ git init
使用vi編輯器
$ vi <file-name>,新建或修改文件
按i進入編輯
編輯完成後按ESC,而後選擇如下某個命令輸入
命令效果
:w保存文件,不退出vi
:w <file-name>另存爲file,不退出
:w!強制保存,不退出
:wq保存文件,退出
:wq!強制保存,退出
:q不保存,退出
:q!不保存,強制退出
:e!放棄全部修改,回到上次保存文件開始編輯
查看文件內容
cat <file-name>
把文件添加到版本庫
$ git add <file-name>
$ git commit -m "description"
注意能夠屢次git add ,最後一次git commit
查看工做區當前狀態
$ git status
時光穿梭(回退)
$ git reset --hard commit-id
肯定版本回退commit-id
經過查看提交歷史
$ git log
按q退出查看
簡化顯示提交歷史
$ git log --pretty=oneline
HEAD,當前版本
HEAD^,上個版本
HEAD^^,上上個版本
HEAD~100,往上100個版本
肯定重返將來commit-id
經過查看命令歷史
$ git reflog
工做區與暫存區

工做區就是電腦中能看到的目錄,工做區有一個隱藏目錄.git,這是Git的版本庫
管理修改
修改但未add
比較工做區與暫存區(即上次git add的內容)的不一樣
比較全部修改文件的不一樣
$ git diff
比較指定修改文件的不一樣
$ git diff <file-name>
修改已add但未commit
比較暫存區與倉庫分支(上次git commit)的不一樣
$ git diff --staged
或
$ git diff --cached
撤銷修改
場景1——工做區已修改但未add到暫存區
$ git checkout -- <file-name>
其實就是用版本庫裏的版本替換工做區的版本
場景2——工做區修改且已經git add到暫存區,分兩步
$ git reset HEAD <file-name>
回到場景1,再按場景1操做
場景3:已經commit但沒有推送到遠程庫——版本回退
刪除文件
假設文件原已commit,目前狀況是——已經在目錄下手動或$ rm <file-name>刪除文件
選擇一:確實要從版本庫中刪除該文件,分兩步
第一步
$ git rm <file-name>
或
git add <file-name>
第二步
$ git commit -m "description"
選擇二:刪錯了,要恢復
$ git checkout -- <file-name>
其實就是用版本庫裏的版本替換工做區的版本
遠程倉庫
建立SSH Key
$ ssh-keygen -t rsa -C "youremail@example.com"
補充在用戶主目錄下(cd)
$ ls -ah可見.ssh目錄
$ cd .ssh可見id_rsa(私鑰不能泄露)和id_rsa.pub(公鑰可公開)
關聯遠程倉庫
$ git remote add origin git@github.com:username/repositoryname.git
或
$ git remote add origin https://github.com/username/repositoryname.git
遠程庫默認名字爲origin
刪除已經關聯的遠程庫
git remote rm remote-name
若遠程庫默認名字爲origin,則
git remote rm origin
推送到遠程倉庫
第一次推送到GitHub
$ git push -u origin master
推送master分支
後續推送
$ git push origin master
再也不使用參數-u
從遠程庫克隆
$ git clone git@github.com:username/repositoryname.git
或
$ git clone https://github.com/username/repositoryname.git
分支管理
查看分支
$ git branch
建立分支
$ git branch <branch-name>
切換分支
$ git checkout <branch-name>
建立+切換分支
$ git checkout -b <branch-name>
合併某分支到當前分支
$ git merge <branch-name>
普通模式合併分支
$ git merge --no-ff -m "description" <branch-name>
一般進行分支合併時,若是能夠,Git會使用Fast forward模式,刪除分支後,分支歷史信息會丟失
--no-ff表示禁用Fast forward模式,能看出曾作過合併
刪除分支
$ git branch -d <branch-name>
強行刪除分支
$ git branch -D <branch-name>
查看分支合併圖
$ git log --graph
簡潔查看
$ git log --graph --pretty=oneline --abbrev-commit
Bug分支
假設場景——設A爲遊戲軟件
master 上面發佈的是A的1.0版本
dev 上開發的是A的2.0版本
這時,用戶反映 1.0版本存在漏洞,有人利用這個漏洞開外掛
須要從dev切換到master去填這個漏洞,正常必須先提交dev目前的工做,才能切換
而dev的工做還未完成,不想提交,因此先把dev的工做stash一下。而後切換到master
在master創建分支issue101並切換
在issue101上修復漏洞
修復後,在master上合併並刪除issue101
切回dev,恢復本來工做,繼續工做
保存工做現場
$ git stash
查看保存的工做現場
$ git stash list
恢復工做現場
$ git stash apply
刪除工做現場
$ git stash drop
恢復並刪除工做現場
git stash pop
Feature分支
每添加一個新功能,最好新建一個feature分支,在上面開發完成後,合併,最後,刪除該feature分支
多人協做
多人協做一般的工做模式
先試圖推送本身的修改git push
若推送失敗,則遠程分支比本地分支更新,git pull拉取遠程分支試圖合併
若合併有衝突,則解決衝突,並在本地提交(add和commit)
若沒有衝突或解決了衝突,再次推送git push
查看遠程庫信息
$ git remote
詳細查看
git remote -v
本地推送分支
$ git push origin <branch-name>
在本地建立和遠程分支對應的分支
$ git checkout -b <branch-name> origin/<branch-name>
創建本地分支和遠程分支的關聯
$ git branch --set-upstream <branch-name> origin/<branch-name>
或
$ git branch --set-upstream-to=origin/<branch-name> <branch-name>
從遠程抓取分支
$ git pull
Rebase「變基」
$ git rebase
把分叉的提交歷史「整理」成一條直線,看上去更直觀。缺點是本地的分叉提交已經被修改過了。
只對還沒有推送或還沒有分享給別人的本地修改執行變基操做清理歷史,從不對已推送至別處的提交執行變基操做
標籤管理
發佈一個版本時,咱們一般先在版本庫中打一個標籤(tag),這樣,就惟一肯定了打標籤時刻的版本
未來不管何時,取某個標籤的版本,就是把那個打標籤的時刻的歷史版本取出來。因此,標籤也是版本庫的一個快照
建立標籤
$ git tag <tag-name>
在最新commit上打一個標籤
$ git tag <tag-name> commit-id
在對應的commit_id上打一個新標籤
建立帶有說明的標籤
$ git tag -a <tag-name> -m "description" commit-id
-a指定標籤名,-m指定說明文字
查看全部標籤
$ git tag
查看對應標籤的信息
$ git show <tag-name>
注意標籤老是和某個commit掛鉤。若是這個commit既出如今master分支,又出如今dev分支,那麼在這兩個分支上均可以看到這個標籤。
操做標籤
推送某個標籤到遠程
$ git push origin <tag-name>
一次性推送所有還沒有推送的標籤到遠程
git push origin --tags
刪除一個本地標籤
$ git tag -d <tag-name>
刪除一個遠程標籤
先從本地刪除
$ git tag -d <tag-name>
再從遠程刪除
$ git push origin :refs/tags/<tag-name>
使用GitHub
如何參與一個開源項目
Fork任意開源庫 ——> 從本身的帳戶下clone——> 修復bug或者新增一個功能 ——> 若但願官方庫接受你的修改,能夠在GitHub上發起一個pull request
本地庫既關聯GitHub,又關聯碼雲
如原來已經關聯了默認名origin的GitHub
先刪除已關聯的名爲origin的遠程庫:
$ git remote rm origin
而後,先關聯GitHub的遠程庫:
$ git remote add github git@github.com:username/repositoryname.git
注意,遠程庫的名稱叫github,不叫origin了
接着,再關聯碼雲的遠程庫:
$ git remote add gitee git@gitee.com:username/repositoryname.git
一樣注意,遠程庫的名稱叫gitee,不叫origin了
注意多個關聯後以上因此命令含的origin都換成相應的github或gitee
若是要推送到GitHub,使用命令:
$ git push github master
若是要推送到碼雲,使用命令:
$ git push gitee master
自定義Git
顯示顏色
讓Git顯示顏色,會讓命令輸出看起來更醒目:
$ git config --global color.ui true
忽略特殊文件
配置別名
如
用git st就表示git status
$ git config --global alias.st status
配置一個git last,讓其顯示最後一次提交信息:
$ git config --global alias.last 'log -1'
甚至還有人喪心病狂地把lg配置成了:
$ git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
試試git lg的效果,很炫酷
配置文件
配置Git的時候,加上--global是針對當前用戶起做用的,若是不加,那隻針對當前的倉庫起做用
查看用戶的配置信息:
$ git config --global --list
要查看當前倉庫的,把global改爲local就好
配置文件放哪了?每一個倉庫的Git配置文件都放在.git/config文件中:$ cat .gitconfig
別名就在alias後面,要刪除別名,直接把對應的行刪掉便可
搭建Git服務器
GitHub就是一個免費託管開源代碼的遠程倉庫
可是對於某些視源代碼如生命的商業公司來講,既不想公開源代碼,又捨不得給GitHub交保護費,那就只能本身搭建一臺Git服務器做爲私有倉庫使用