(1)Git是一個開源(Linus Torvalds 爲了幫助管理 Linux 內核開發而開發)的分佈式版本控制系統,用於敏捷高效地處理任何或小或大的項目,與經常使用的版本控制工具 CVS, SVN等不一樣,它採用了分佈式版本庫的方式,沒必要服務器端軟件支持。javascript
(2)Git 的工做區、暫存區和版本庫:html
Git 目前支持 Linux/Unix、Solaris、Mac和 Windows 平臺上運行。java
在 Windows 平臺上安裝 Git 很容易,有個叫作 msysGit 的項目提供了安裝包,能夠到 GitHub 的頁面上下載 exe 安裝文件並運行(安裝包下載地址:https://gitforwindows.org/)git
安裝成功後,就可使用命令行的 git 工具(已經自帶了 ssh 客戶端,右擊->"Git Bash")進行Git操做,另外還有一個圖形界面的 Git 項目管理工具web
(2)其餘安裝 參見菜鳥教程: http://www.runoob.com/git/git-install-setup.htmlwindows
git init //在目錄中建立新的 Git 倉庫,缺省狀況下 Git 就會爲你建立"master"分支
建立完後會在項目中生成「 .git 」這個子目錄。 這就是你的 Git 倉庫了,全部有關你的此項目的快照數據都存放在這裏,eg:緩存
git clone [url] //默認,Git 會用此 URL 最後一個「/」以後的名稱做爲本地項目名稱,你也能夠在該命令後加上你想要的名稱: git clone [url] <project name>
eg.:bash
首先,去coding(較流行的一個Git服務器)隨便找個項目,複製Git倉庫地址:服務器
而後,到本地計算機右擊選擇「git clone」:app
新項目可使用 「git add . 」 命令遞歸地添加當前工做目錄中的全部文件。
git status -s //查看狀態, -s表示short,若是不加會詳細輸出內容 /** git status -s 狀態碼解析***************** A: 你本地新增的文件(服務器上沒有). C: 文件的一個新拷貝. D: 你本地刪除的文件(服務器上還在). M: 文件的內容或者mode被修改了. R: 文件名被修改了。 T: 文件的類型被修改了。 U: 文件沒有被合併(你須要完成合並才能進行提交)。 X: 未知狀態(極可能是遇到git的bug了,你能夠向git提交bug report) ?:未被git進行管理,可使用git add file1把file1添加進git能被git所進行管理 這些狀態也會組合出現,eg: "AM" :意思是,這個文件在咱們將它添加到緩存以後又有改動,改動後咱們再執行 git add 命令將其添加到緩存中 "UU" : **/
git diff 比較工做目錄中當前文件和暫存區域快照之間的差別,也就是修改以後尚未暫存起來的變化內容。git status 顯示你上次提交更新後的更改或者寫入緩存的改動, 而 git diff 則一行一行地顯示這些改動具體是啥:
git add 將想要快照的內容寫入緩存區, git commit 則將緩存區內容添加到倉庫中。
git commit git commit -m "<message>" //使用 -m 選項以在命令行中提供提交註釋 git commit -a //把unstaged的文件變成staged(不包括新建(untracked)的文件)而後commit,通常仍是推薦先git add再git commit git commit -am "<message>"//或 git commit –a –m "<message>",至關於git add . + git commit –m "<message>"合併使用 git commit --amend //增補提交,會使用與當前提交節點相同的父節點進行一次新的提交,舊的提交將會被取消.
Git 爲你的每個提交都記錄你的名字與電子郵箱地址,因此第一步須要配置用戶名和郵箱地址
HEAD關鍵字指的是當前分支最末梢最新的一個提交,也就是版本庫中該分支上的最新版本.
git reset HEAD //把add進去的文件從staged狀態取出來,能夠單獨針對某一個文件操做: git reset HEAD <filename> git reset --mixed HEAD//--mixed是缺省參數,是將git的HEAD變了(也就是提交記錄變了),但文件目錄並無改變, 取消了commit和add的內容. git reset --soft HEAD// 實際上,是git reset –mixed id 後,又作了一次git add.即取消了commit的內容. git reset --hard HEAD//是將git的HEAD變了,文件也變了. 按改動範圍排序以下: soft (commit) < mixed (commit + add) < hard (commit + add + local working)
git revert會建立一個反向的新提交,能夠經過參數-n來告訴Git先不要提交.
若是隻是簡單地從工做目錄中手工刪除文件,運行 git status 時就會在 Changes not staged for commit 的提示。要從 Git 中移除某個文件,就必需要從已跟蹤文件清單中移除,而後提交:
git rm <file> git rm -f <file> //若是刪除以前修改過而且已經放到暫存區域的話,則必需要用強制刪除選項 -f git rm --cached <file>//僅從跟蹤清單中刪除,把文件從暫存區域移除但仍保留在當前工做目錄中使用 git rm –r * //遞歸刪除,即若是後面跟的是一個目錄作爲參數,則會遞歸刪除整個目錄中的全部子目錄和文件
git mv <file> <new file>
git clean -d// -d表示同時移除目錄 git clean -f// -f表示force,由於在git的配置文件中, clean.requireForce=true,若是不加-f,clean將會拒絕執行.
git stash將會把當前目錄和index中的全部改動(但不包括未track的文件)壓入一個棧,而後留給你一個clean的工做狀態,即處於上一次最新提交處
git stash list//顯示這個棧的list. git stash apply//取出stash中的上一個項目(stash@{0}),而且應用於當前的工做目錄.也能夠指定別的項目,如:git stash apply stash@{1} git stash pop//在應用stash中項目的同時想要刪除它 git stash drop// 刪除上一個,也可指定參數刪除指定的一個項目 git stash clear// 刪除全部項目
reflog是git用來記錄引用變化的一種機制,好比記錄分支的變化或者是HEAD引用的變化,git會將變化記錄到HEAD對應的reflog文件中,其路徑爲 .git/logs/HEAD, 分支的reflog文件都放在 .git/logs/refs 目錄下的子目錄中
git reflog//不指定引用的時候,默認列出HEAD的reflog。HEAD@{0}表明HEAD當前的值,HEAD@{3}表明HEAD在3次變化以前的值.
幾乎全部版本控制系統都支持分支。使用分支能夠從開發主線上分離開來,在不影響主線的同時繼續工做。
git branch (branchname) //沒有參數時,git branch 會列出你在本地的分支。
當你切換分支的時候,Git 會用該分支的最後提交的快照替換你的工做目錄的內容, 因此多個分支不須要多個目錄。
git checkout (branchname) //該分支存在則切換到分之下不然建立新分支並當即切換到該分支下
Git 合併,不只僅是簡單的文件添加、移除的操做, 也會合並修改。你能夠屢次合併到統一分支, 也能夠選擇在合併以後直接刪除被併入的分支。
git merge (branchname) //將此分支合併到主分支去 git checkout -b (branchname) //建立並切換到新的分支,至關於git branch newbranch + git checkout newbranch 合併使用 git checkout <filename>//此命令會使用HEAD中的最新內容替換掉你的工做目錄中的文件,已添加到暫存區的改動以及新文件都不會受到影響。會刪除該文件中全部沒有暫存和提交的改動,這個操做是不可逆的
合併出現衝突須要手動去修改它,而後:
git add // 解決了衝突要告訴 Git 文件衝突已經解決 git merge --abort//或者你也能夠取消merge
git branch -d (branchname)
git branch -v
Git 最爲出色的是它的合併跟蹤(merge tracing)能力。使用 git log 命令查看提交歷史:
git log git log --oneline //查看歷史記錄的簡潔的版本 git log --reverse --oneline //逆向顯示全部日誌 git log --oneline --number //顯示number條,每條log只顯示一行 git log --oneline --graph //圖形化顯示分支合併歷史 git log branchname// 顯示特定分支的log git log --oneline branch1 ^branch2//查看在分支1不在分支2中的log,^表示排除這個分支 git log --decorate//會顯示出tag信息 git log --grep //根據commit信息過濾log: git log --grep=keywords 默認狀況下, git log --grep --author是OR的關係,即知足一條即被返回,若是你想讓它們是AND的關係,能夠加上--all-match的option git log -S: filter by introduced diff ,如: git log -SmethodName (注意S和後面的詞之間沒有等號分隔). git log -p//每個提交都是一個快照(snapshot),Git會把每次提交的diff計算出來,做爲一個patch顯示給你看,另外一種方法是git show [SHA]. git log --stat//一樣是用來看改動的相對信息的,--stat比-p的輸出更簡單一些. //--no-merges能夠將merge的commits排除在外.
用 --graph 選項,開啓了拓撲圖選項,能夠更清楚明瞭地查看歷史中何時出現了分支、合併,eg.:
$ git log --oneline --graph * 88afe0e Merge branch 'change_site' |\ | * d7e7346 changed the site * | 14b4dca 新增長一行 |/ * 556f0a0 removed test2.txt * 2e082b7 add test2.txt * 048598f add test.txt * 85fc7e7 test comment from runoob.com
若是隻想查找指定用戶的提交日誌可使用命令:git log --author ,eg.:
$ git log --author=Linus --oneline -5 //找 Git 源碼中 Linus 提交的部分 81b50f3 Move 'builtin-*' into a 'builtin/' subdirectory 3bb7256 make "index-pack" a built-in 377d027 make "git pack-redundant" a built-in b532581 make "git unpack-file" a built-in 112dd51 make "mktag" a built-in
若是你要指定日期,能夠執行幾個選項:--since 和 --before, --until 和 --after,eg.:
$ git log --oneline --before={3.weeks.ago} --after={2010-04-18} --no-merges //看 Git 項目中三週前且在四月十八日以後的全部提交,我能夠執行這個, --no-merges 選項以隱藏合併提交 5469e2d Git 1.7.1-rc2 d43427d Documentation/remote-helpers: Fix typos and improve language 272a36b Fixup: Second argument may be any arbitrary string b6c8d2d Documentation/remote-helpers: Add invocation section 5ce4f4e Documentation/urls: Rewrite to accomodate transport::address 00b84e9 Documentation/remote-helpers: Rewrite description 03aa87e Documentation: Describe other situations where -z affects git diff 77bc694 rebase-interactive: silence warning when no commits rewritten 636db2c t3301: add tests to use --format="%N"
git tag -a v1.0 //給最新一次提交打上(HEAD)"v1.0"的標籤,-a 選項意爲"建立一個帶註解的標籤",不用 -a 選項也能夠執行的,但它不會記錄這標籤是啥時候打的,誰打的,也不會讓你添加個標籤的註解。推薦建立帶註解的標籤
$ git tag//查看全部標籤 v0.9 v1.0
$ git tag -a v0.9 85fc7e7 //給發佈提交的 85fc7e7 追加標籤 $ git log --oneline --decorate --graph * 88afe0e (HEAD, tag: v1.0, master) Merge branch 'change_site' |\ | * d7e7346 (change_site) changed the site * | 14b4dca 新增長一行 |/ * 556f0a0 removed test2.txt * 2e082b7 add test2.txt * 048598f add test.txt * 85fc7e7 (tag: v0.9) test comment from runoob.com
git tag -a <tagname> -m "<message>"
git tag -s <tagname> -m "<message>"
git tag -d <tagname>
git show <tagname>
Git 並不像 SVN 那樣有個中心服務器。 Git 命令都是在本地執行,若是你想經過 Git 分享你的代碼或者與其餘開發人員合做。 你就須要將數據放到一臺其餘開發人員可以鏈接的服務器上。
要添加一個新的遠程倉庫,能夠指定一個簡單的名字,以便未來引用,命令格式以下:
git remote add [shortname] [url]
目前流行的Git倉庫有不少,使用最多的有:GitHub、Coding(兼具SVN、Git)。具體的使用如同普通的軟件同樣很簡單,能夠直接上手
由於不須要每次都用完整的url,因此Git爲每個remote repo的url都創建一個別名,而後用git remote來管理這個list,若是你clone一個project,Git會自動將原來的url添加進來,別名就叫作:origin
git remote// 列出remote aliases. git remote -v//查看每個別名對應的實際url. git remote add [alias] [url]// 添加一個新的remote repo. git remote rm [alias]// 刪除一個存在的remote alias. git remote rename [old-alias] [new-alias]//重命名 git remote set-url [alias] [url]//更新url, 能夠加上—push和-fetch參數,爲同一個別名set不一樣的存取地址.
git fetch //取全部你本地沒有的數據,取下來的分支(remote branches)和本地分支同樣(能夠看diff、log、merge),可是Git不容許你checkout到它們 git fetch [alias]//取某一個遠程repo git fetch --all//取到所有repo
若是有多我的向同一個remote repo push代碼, Git會首先在你試圖push的分支上運行git log,檢查它的歷史中是否能看到server上的branch如今的tip,若是本地歷史中不能看到server的tip,說明本地的代碼不是最新的,Git會拒絕你的push,讓你先fetch,merge,以後再push,這樣就保證了全部人的改動都會被考慮進來
git push [alias] [branch] // 把當前分支merge到alias上的[branch]分支,若是分支已經存在,將會更新,若是不存在,將會添加這個分支. git push (remote-name) (branch-name) //(local-branch)缺省就意味着刪除remote-branch
git merge [alias]/[branch]
//rebase的過程當中,也許會出現衝突,Git會中止rebase並讓你解決衝突,在解決完衝突以後,用git add去更新這些內容,而後無需執行commit,只須要: git rebase --continue//就會繼續打餘下的補丁 git rebase --abort//終止rebase,當前分支將會回到rebase以前的狀態
git remote rm [別名]
git pull//== git pull --merge,先執行git fetch,而後執行git merge把取來的分支的head merge到當前分支產生一個新的commit git pull --rebase//先執行git fetch,而後執行git rebase
你也能夠搭建屬於本身的Git服務器,參見:http://www.runoob.com/git/git-server.html
$ yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel $ yum install git
建立一個git用戶組和用戶,用來運行git服務:
$ groupadd git $ useradd git -g git
收集全部須要登陸的用戶的公鑰,公鑰位於id_rsa.pub文件中,把咱們的公鑰導入到/home/git/.ssh/authorized_keys文件裏,一行一個。若是沒有該文件建立它:
$ cd /home/git/ $ mkdir .ssh $ chmod 755 .ssh $ touch .ssh/authorized_keys $ chmod 644 .ssh/authorized_keys
選定一個目錄做爲Git倉庫:
$ cd /home $ mkdir gitrepo $ chown git:git gitrepo/ $ cd gitrepo $ git init --bare runoob.git Initialized empty Git repository in /home/gitrepo/runoob.git/
以上命令Git建立一個空倉庫,服務器上的Git倉庫一般都以.git結尾。而後,把倉庫所屬用戶改成git:
$ chown -R git:git runoob.git
$ git clone git@192.168.45.4:/home/gitrepo/runoob.git Cloning into 'runoob'... warning: You appear to have cloned an empty repository. Checking connectivity... done.
以webstorm爲例,安裝了git後就可使用:
分別是:拉取、提交
branch(分支)管理
右擊項目名,就能看到git選項
ps:webstorm自身的local history能夠看到編譯日誌(項目運行後存放在webstorm生成的「.idea文件夾」)。右擊項目名,就能看到local history選項
打開後能夠看到每次修改的記錄,你還能夠revert還原代碼,以下: