引述:廖雪峯 Git 教程git
初始化一個Git倉庫,使用git init命令。github
添加文件到Git倉庫,分兩步:
第一步,使用命令git add <file>,注意,可反覆屢次使用,添加多個文件;
第二步,使用命令git commit,完成。網絡
要隨時掌握工做區的狀態,使用git status命令。ssh
若是git status告訴你有文件被修改過,用git diff能夠查看修改內容。編輯器
HEAD指向的版本就是當前版本,所以,Git容許咱們在版本的歷史之間穿梭,使用命令git reset --hard commit_id。分佈式
穿梭前,用git log能夠查看提交歷史,以便肯定要回退到哪一個版本。fetch
要重返將來,用git reflog查看命令歷史,以便肯定要回到將來的哪一個版本。加密
工做區有一個隱藏目錄.git,這個不算工做區,而是Git的版本庫。url
Git的版本庫裏存了不少東西,其中最重要的就是稱爲stage(或者叫index)的暫存區,還有Git爲咱們自動建立的第一個分支master,以及指向master的一個指針叫HEAD。指針
由於咱們建立Git版本庫時,Git自動爲咱們建立了惟一一個master分支,因此,如今,git commit就是往master分支上提交更改。
你能夠簡單理解爲,須要提交的文件修改統統放到暫存區,而後,一次性提交暫存區的全部修改。
Git管理的是修改,Git每次修改,若是不add到暫存區,那就不會加入到commit中。
場景1:當你改亂了工做區某個文件的內容,想直接丟棄工做區的修改時,用命令git checkout -- file。
場景2:當你不但改亂了工做區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file,就回到了場景1,第二步按場景1操做。
場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,用git reflog查看命令歷史, 再使用命令git reset --hard commit_id,以便肯定要回到將來的哪一個版本。不過前提是沒有推送到遠程庫。
命令git rm用於刪除一個文件。若是一個文件已經被提交到版本庫,那麼你永遠不用擔憂誤刪,可是要當心,你只能恢復文件到最新版本,你會丟失最近一次提交後你修改的內容。
本地Git倉庫和GitHub倉庫之間的傳輸是經過SSH加密,因此,須要一點設置:建立SSH Key。在用戶主目錄下,看看有沒有.ssh目錄,若是有,再看看這個目錄下有沒有id_rsa和id_rsa.pub這兩個文件,若是已經有了,可直接跳到下一步。
第1步:
若是沒有,打開Shell(Windows下打開Git Bash),建立SSH Key:$ ssh-keygen -t rsa -C "youremail@example.com"
你須要把郵件地址換成你本身的郵件地址,而後一路回車,使用默認值便可,因爲這個Key也不是用於軍事目的,因此也無需設置密碼。
若是一切順利的話,能夠在用戶主目錄裏找到.ssh目錄,裏面有id_rsa和id_rsa.pub兩個文件,這兩個就是SSH Key的祕鑰對,id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,能夠放心地告訴任何人。
第2步:登錄GitHub,打開「Account settings」,「SSH Keys」頁面。而後,點「Add SSH Key」,填上任意Title,在Key文本框裏粘貼id_rsa.pub文件的內容。
要關聯一個遠程庫,使用命令git remote add origin git@github.com:SangYang/learngit.git
關聯後,使用命令git push -u origin master第一次推送master分支的全部內容;
此後,每次本地提交後,只要有必要,就可使用命令git push origin master推送最新修改;
分佈式版本系統的最大好處之一是在本地工做徹底不須要考慮遠程庫的存在,也就是有沒有聯網均可以正常工做,而SVN在沒有聯網的時候是拒絕幹活的!當有網絡的時候,再把本地提交推送一下就完成了同步,真是太方便了!
你也許還注意到,GitHub給出的地址不止一個,還能夠用https://github.com/SangYang/learngit.git這樣的地址。實際上,Git支持多種協議,默認的git://使用ssh,但也可使用https等其餘協議。
使用https除了速度慢之外,還有個最大的麻煩是每次推送都必須輸入口令,可是在某些只開放http端口的公司內部就沒法使用ssh協議而只能用https。
要克隆一個倉庫,首先必須知道倉庫的地址,而後使用git clone命令克隆。
Git支持多種協議,包括https,但經過ssh支持的原生git協議速度最快。
Git鼓勵大量使用分支:
查看分支:git branch
建立分支:git branch <name>
切換分支:git checkout <name>
建立+切換分支:git checkout -b <name>
合併某分支到當前分支:git merge <name>
刪除分支:git branch -d <name>
當Git沒法自動合併分支時,就必須首先解決衝突。解決衝突後,再提交,合併完成。
用git log --graph命令能夠看到分支合併圖。
用git log --graph --pretty=oneline --abbrev-commit也能夠看到分支的合併狀況.
在實際開發中,咱們應該按照幾個基本原則進行分支管理:
首先,master分支應該是很是穩定的,也就是僅用來發布新版本,平時不能在上面幹活;
那在哪幹活呢?幹活都在dev分支上,也就是說,dev分支是不穩定的,到某個時候,好比1.0版本發佈時,再把dev分支合併到master上,在master分支發佈1.0版本;
你和你的小夥伴們每一個人都在dev分支上幹活,每一個人都有本身的分支,時不時地往dev分支上合併就能夠了。
Git分支十分強大,在團隊開發中應該充分應用。
合併分支時,加上--no-ff參數就能夠用普通模式合併,合併後的歷史有分支,能看出來曾經作過合併,而fast forward合併就看不出來曾經作過合併。
修復bug時,咱們會經過建立新的bug分支進行修復,而後合併,最後刪除;
當手頭工做沒有完成時,先把工做現場git stash一下,而後去修復bug,修復後,再git stash pop,回到工做現場。
開發一個新feature,最好新建一個分支;
若是要丟棄一個沒有被合併過的分支,能夠經過git branch -D <name>強行刪除。
查看遠程庫信息,使用git remote -v;
本地新建的分支若是不推送到遠程,對其餘人就是不可見的;
從本地推送分支,使用git push origin branch-name,若是推送失敗,先用git pull抓取遠程的新提交;
在本地建立和遠程分支對應的分支,使用git checkout -b branch-name origin/branch-name,本地和遠程分支的名稱最好一致;
創建本地分支和遠程分支的關聯,使用git branch --set-upstream branch-name origin/branch-name;
從遠程抓取分支,使用git pull,若是有衝突,要先處理衝突。
命令git tag <name>用於新建一個標籤,默認爲HEAD,也能夠指定一個commit id;
git tag -a <tagname> -m "blablabla..."能夠指定標籤信息;
git tag -s <tagname> -m "blablabla..."能夠用PGP簽名標籤;
命令git tag能夠查看全部標籤。
命令git push origin <tagname>能夠推送一個本地標籤;
命令git push origin --tags能夠推送所有未推送過的本地標籤;
命令git tag -d <tagname>能夠刪除一個本地標籤;
命令git push origin :refs/tags/<tagname>能夠刪除一個遠程標籤。
在GitHub上,能夠任意Fork開源倉庫;
本身擁有Fork後的倉庫的讀寫權限;
能夠推送pull request給官方倉庫來貢獻代碼。
忽略某些文件時,須要編寫.gitignore;
.gitignore文件自己要放到版本庫裏,而且能夠對.gitignore作版本管理!
(使用Windows的童鞋注意了,若是你在資源管理器裏新建一個.gitignore文件,它會很是弱智地提示你必須輸入文件名,可是在文本編輯器裏「保存」或者「另存爲」就能夠把文件保存爲.gitignore了。)
若是敲git st就表示git status那就簡單多了,固然這種偷懶的辦法咱們是極力同意的。
咱們只須要敲一行命令,告訴Git,之後st就表示status:
$ git config --global alias.st status
好了,如今敲git st看看效果。
固然還有別的命令能夠簡寫,不少人都用co表示checkout,ci表示commit,br表示branch:
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
配置Git的時候,加上--global是針對當前用戶起做用的,若是不加,那隻針對當前的倉庫起做用。
配置文件放哪了?每一個倉庫的Git配置文件都放在.git/config文件中:
$ cat .git/config
[core]
repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true ignorecase = true precomposeunicode = true
[remote "origin"]
url = git@github.com:michaelliao/learngit.git fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin merge = refs/heads/master
[alias]
last = log -1
別名就在[alias]後面,要刪除別名,直接把對應的行刪掉便可。
而當前用戶的Git配置文件放在用戶主目錄下的一個隱藏文件.gitconfig中:
$ cat .gitconfig
[alias]
co = checkout ci = commit br = branch st = status
[user]
name = Your Name email = your@email.com
配置別名也能夠直接修改這個文件,若是改錯了,能夠刪掉文件從新經過命令配置。