Git和SVN的對比:git
1)Git是分佈式的,SVN是集中式;程序員
2)Git每一個歷史版本存儲完整的文件,SVN存儲文件的差別;github
3)Git可離線完成大部分操做,SVN則必須與中央服務器進行網絡交互;服務器
4)Git有着優雅的分支和合並功能;網絡
5)Git有着更強的撤銷修改和修改版本歷史的能力;ssh
6)Git速度更快,效率更好;分佈式
Git安裝:工具
CentOS6.5環境:yum install git學習
下載源碼進行編譯再安裝:本身查閱網絡資料網站
which -a git 查看git的安裝位置
git version 查看git的版本
建議你們先在GitHub上面註冊一個帳號
如何學習Git的命令:git help
添加user.name和user.email
git config --global user.name fyuan925
git config --global user.email fyuan925@gmail.com
獲得user.name/user.email
git config user.name
git config user.email
添加一個新的user.name
git config --global --add user.name kgc
獲得屬性的值
git config user.name
git config --get user.name
獲得全局全部屬性的值
git config --list --global
刪除一個屬性,而且是指定屬性名進行刪除
git config --global --unset user.name kgc
git config --list --global
當只有一個屬性值的時候,咱們能夠在刪除時不指定值
git config --global --unset user.name
git config --list --global
git config --global user.name fyuan925
git config --list --global
Git命令的基本使用(版本控制工具只能跟蹤文本文件的改變):
git init 建立倉庫
添加一個readme.txt
git status 查看當前版本庫的狀態(查看暫存區的工做狀態)
git add filename 使用git add命令告訴git,把該文件添加到倉庫
git commit -m 'comment' 使用git commit命令告訴git,把文件提交到倉庫
將文件提交到倉庫,須要兩步:
1) add
2) commit
git add 能夠反覆添加多個
git diff 查看修改的內容
git log 能夠查看全部的提交歷史記錄
git log filename 僅查看指定文件名的提交歷史記錄
git log --pretty=oneline filename
d085ee8434392d2cf88b48592f29fbeefb0818f7 commit id(版本號) SHA-1 Hash計算出來一個16進制的值
版本回退:
前提:知道當前版本是哪一個, HEAD表示當前版本(HEAD是指最後一次提交的commitid)
回退到上一個版本: HEAD^ 一個^就表是前一個版本, 若是N個前版本能夠用HEAD~N
回退:git reset --hard HEAD^
回退以後你後悔了又想回到後退以前的那個版本: git reset --hard xxxxxxxxx
xxxxxxxxx 前面能夠經過 git log filename
3commit <== HEAD
2commit
1commit
執行了git reset --hard HEAD^以後
3commit
2commit <== HEAD
1commit
git reset:版本穿梭, 可使用git log查看提交歷史,以便肯定回退/穿梭到哪一個版本
HEAD這個指針執行當前版本(也是git版本回退快速的緣由)
git reflog:查看命令歷史,以便肯定要回到將來/過去的哪一個版本(若是不知到到回退commitid可經過此命令查詢)
什麼是修改:新增一行、修改幾個字符、刪除一行、新增文件、刪除文件
Git管理的是修改,而不是文件
git status :是工做區和暫存區的對比,若是檢測出改變,會建議咱們add提交到暫存區或者撤銷修改。
git commit:只是將暫存區提交到歷史區,與工做區無關。
撤銷修改:
沒有提交到暫存區時,其實就在工做區: git checkout -- file
已經提交到暫存區了: 分兩步:
1)git reset HEAD file 清空暫存區中的修改
2)git checkout -- file 清空工做區的修改
刪除文件
手誤刪除,如何恢復: git checkout -- file
真刪除版本庫的文件:
1) git rm file
2) git commit -m 'xxx'
Git遠程操做之添加遠程庫
生成ssh:ssh-keygen -t rsa -C 'kgc@gmail.com'
在GitHub上設置ssh的公鑰
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAuDoeVYFqwhspG7SrOMugb32+q8jwu0fRptuQuEREjeqsCVkGPVBuFJo3hEPwXhk87VAgEHGd6JQUEtL6CFkrld3GWcMuz+dlNTIQ1/tNnwDABvYo5/dXlR6WZ6sdn/3eT/KO1KnyQI0VDFg/smAtAVVr5guXAzg36hOAgzihh3ZVM0Gcg4cOzd0/rO5+hO7nK1q0W1Wk2aem5xX+FOWF+r+g+nQpIERL4I45JgL9rXYCPEfFnP+17FjLBAUSNNaoj4I49Z4EboyN/as58PXVPbEv7Xdhh7ARn7qFRdPKxkIhVTI/4ljIp4OAyfENYtD6qanhBu3P3WX/hYCiHN0Lww== 947186883@qq.com
與遠程庫創建鏈接
git remote add origin git@github.com:iamxuas/git_demo.git
git push -u origin master
git push 就是把當前分支(master)推送到遠程
-u:第一次推送到master分支時,要設置了,後續就不須要再使用-u了
git push origin master
執行get push時出現錯誤及解決辦法:
當執行命令git push -u origin master時報以下錯誤
解決辦法:git remote set-url origin https://fdd8@github.com/fdd8/kgc_git.git,即在網址中添加GitHub的用戶名便可。
再執行命令git push -u origin master時,就不會報錯
遠程庫的兩種方式
1)先有本地倉庫,後有遠程倉庫
git remote add origin git@github.com:fangyuan925/kgc_git.git
git push -u origin master
第一次使用-u,後面再也不使用
2)先有遠程倉庫,再clone到本地(最多見的,通常都是先在GitHub上建立倉庫,而後開發人員再clone到本地)
git clone xxxxxx
git push -u origin master
第一次使用-u,後面再也不使用
Git會串成一條時間線,這條時間線就是分支, 默認就是master
HEAD並非指向提交,而是指向master
v1 ==> v2 ==> v3
|
master
|
HEAD
v1 ==> v2 ==> v3 ==> v4
|
master
|
HEAD
master
|
v1 ==> v2 ==> v3 ==> v4 ==> v5 ==> v6
|
dev
|
HEAD(建立分支以後,HEAD就不指向master了,而是指向分支)
Master(將dev分支合併到master上)
|
v1 ==> v2 ==> v3 ==> v4 ==> v5 ==> v6
|
dev
|
HEAD
查看分支:
git branch
* master
*表示你當前所處的branch是哪一個
git checkout -b dev (建立分支)
-b表示建立而且切換分支(HEAD指向dev分支)
切換分支: git checkout xxxx
git merge dev 把dev分支合併到當前分支,由於咱們當前分支是master,因此就是將dev合併到master(使用的是Fast-forward模式:直接將master指向v6,存在衝突是Fast-forward模式就不行了)
master =>master
|
v1 ==> v2 ==> v3 ==> v4 ==> v5 ==> v6
|
dev
|
HEAD(建立分支以後,HEAD就不指向master了,而是指向分支)
刪除分支: git branch -d dev
解決衝突:
feature1 : a.txt AND simple
master : a.txt & simple
master
|
v1 ==> v2 ==> v3 ==> v4 ==> v5 ==> v6
|
feature1
|
HEAD
在master和分支上分別對a.txt作了不一樣修改以後,合併分支出現如下錯誤:
git merge feature1
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt
Automatic merge failed; fix conflicts and then commit the result.
cat a.txt
a.txt
在master和分支上分別對a.txt作了不一樣修改以後,a.txt的內容以下:
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1
<<<<<<< ======= >>>>>>>標記出不一樣分支的內容
git log --graph --pretty=oneline --abbrev-commit
當Git沒法自動合併分支時,就必須首先解決衝突,再提交,最後再merge
可使用git log --graph命令能夠看到分支合併圖。
分支管理策略:
1)master分支: 代碼是穩定的,平時不能在上面幹活的,僅僅是用來發布新版本用
2)dev分支:是不穩定的,bug、feature能夠建立新的分支進行開發,最後再合併到master便可
bug-id 10000 bug-10000
標籤操做總結:
git tag <name> 新建一個標籤,默認是HEAD,也能夠指定一個commit id
git tag -a <name> -m 'xxxxxx'指定標籤信息
git tag 查看全部標籤
git tag -d v0.1 刪除標籤
提交標籤到GitHub:git push origin v1.0
將本地全部標籤提交到遠程github:git push origin --tags
若是tag已經推送到遠程,要刪除遠程標籤就須要麻煩一點,分2步:
1)刪除本地tag: git tag -d v0.9
2)git push origin :refs/tags/v0.9
Git控制檯顏色設置
git config --global color.diff auto
git config --global color.status auto
git config --global color.branch auto
顏色設置關閉
git config --global color.status false
忽略某些特殊文件不提交
1)只須要在git項目的根目錄下建立一個.gitignore
2) 把須要提交的文件或者目錄寫到.gitignore
3)若是你真正想提交的文件已經被包含在.gitignore裏面了,那麼就須要使用-f進行強制提交
Git配置別名:
git config --global alias.st status
git config --global alias.ci commit
git config --global alias.br branch
git config --global alias.co checkout
配置別名完成以後在什麼地方能看到呢?
默認在當前用戶的根目錄下有一個.gitconfig
cat .gitconfig
[user]
email = fyuan925@gmail.com
name = fyuan925
[color]
diff = auto
status = false
branch = auto
[alias]
st = status
ci = commit
br = branch
co = checkout
知識點總結:
分支管理
場景描述:開發一個新功能,預計一週完成,你三天開發好了70%的代碼,可是還沒連調,若是此時馬上提交,因爲代碼還沒寫完,不完整的代碼庫會致使別人不能幹活。若是等代碼所有寫完再一次提交,又存在丟失天天進度的巨大風險。
分支的誕生:本身在本身的分支上開發,和別人互不影響,開發完成後再合併到master上去便可。
查看分支:git branch
建立分支:git branch <name>
切換分支:git checkout <name>
建立&切換分支:git checkout -b <name>
合併某分支到當前分支:git merge <name>
刪除分支:git branch -d <name>
解決衝突時查看分支合併圖:git log --graph
Bug分支
Feature分支
標籤管理
什麼是標籤(tag):是版本庫的一個快照
發佈一個新版本時,一般先在版本庫中打一個標籤,不管在未來的時候,取出某個標籤的版本便可
建立標籤:git tag <tagname>
查看全部標籤:git tag
建立帶有說明的標籤:git tag -a <tagname> -m <desc>
查看標籤的說明:git show <tagname>
刪除標籤:git tag -d <tagname>
推送一個本地標籤:git push origin <tagname>
推送所有未推送的本地標籤:git push origin --tags
刪除一個本地標籤:git tag -d <tagname>
刪除一個遠程標籤:git push origin:refs/tags/<tagname>
多人協做
開源項目確定都是不少人蔘與到社區中,經過協做完成
多人協做經常使用操做
克隆遠程倉庫:git clone
查看遠程信息:git remove (-v)
解決衝突問題
推送分支:git push origin <branch-name>
建立Pull Request
(https://www.zhihu.com/question/21682976)
GitHub經常使用操做介紹
能夠將我的的開源項目放在GitHub中,既可讓別人參與你的項目,你也能夠參與到別人的開源項目中去
但願你們能真正參與帶本身感興趣的開源項目中去,作到從開源中來,而後回饋到開源中去
GitHub經常使用操做:clone、fork、watch、star
GitHub經常使用操做之博客
相信不少人都有寫博客的習慣,免費和收費的都有
近些年,一些程序員開始在github網站上搭建blog。他們既擁有絕對管理權,又享受github帶來的便利----無論什麼時候何地,只要向主機提交commit,就能發佈新文章
更妙的是,這一切仍是免費的,github提供無限流量,世界各地都能訪問
使用GitHub搭建博客
GitHub經常使用操做之組織
除了我的帳戶外,GitHub還提供被稱爲組織(Organizations)的帳戶
組織帳戶和我的帳戶同樣都有一個用於存放所擁有項目的命名空間,可是許多其餘的東西都是不一樣的
組織帳戶表明了一組共同擁有多個項目的人,同時也提供一些人具用於對成員進行分組管理
一般,這種帳戶被用於開源羣組(例如:「perl」或者「rails」),或者公司(例如:「google」或者「twitter」)
經過GitHub建立組織
Git其餘功能介紹
Git顏色設置
設置顏色:git config --global color.diff auto
git config --global color.status auto
git config --global color.branch auto
顏色設置關閉:git config --global color.status false
忽略特殊文件
1)只須要在git項目的根目錄下建立一個.gitignore
2) 把須要提交的文件或者目錄寫到.gitignore
3)若是你真正想提交的文件已經被包含在.gitignore裏面了,那麼就須要使用-f進行強制提交
設置經常使用命名別名
git config --global alias.st status