http://git-scm.com/
集中式版本控制系統與分佈式版本控制系統的區別html
集中式git
版本庫是集中存放在中央服務器,用戶客戶端只有文件的某個版本.分佈式正則表達式
遠程服務器保存全部版本,用戶客戶端也能夠保存全部版本
分佈式版本控制系統中每一個人的電腦上都有一個完整的版本庫.須要的時候,能夠不須要聯網,由於版本庫就在你本身的電腦上。
多人協同工做的時候,一個用戶在本身電腦上改了文件A,另外一我的在他的電腦上改了文件B,工做結束只需把各自的修改推送給對方,就能夠互相看到對方的修改了。shell
git config --global user.name 'your_name' git config --global user.email 'your_email'
git config的三個做用域vim
缺省等同於local緩存
git config --local # 只對某個git倉庫有效 git config --global # global對當前用戶全部倉庫有效 git config --system # system對系統全部登陸的用戶有效
顯示config的配置,加--list服務器
git config --list --local git config --list --global git config --list --system
1.把已有的項目代碼歸入git管理網絡
cd 項目代碼全部文件夾 git init
2.新建的項目直接用git管理app
cd 某個文件夾 git init your_project # 會有當前路徑下建立和項目名稱同名的文件夾 cd your_project
git add files # 添加文件 git add . # 把工做區全部文件移動在暫存區 git commit # 提交信息,加上 -a 選項能夠把暫存區裏的全部文件都進行提交
git mv old_file_name new_file_name git rm file_name
查看版本演變歷史的命令編輯器
git log 可添加的選項: --oneline # 以每一行的方式查看當前分支的全部提交日誌 --pretty=online # 用commit id(版本號)顯示修改記錄,減小log文件的輸出,使每條記錄只輸出一行 -n4 # 以每一行的方式查看當前分支最近的4條提交日誌 --all # 查看全部分支的提交日誌 --graph # 以圖形化方式查看提交日誌
能夠經過
gitk
圖形界面工具來查看版本歷史
git status 查看當前git倉庫的狀態 git diff * 檢查上一次對文件所作的修改內容 git log 查看版本庫的修改歷史記錄 git reflog 用來記錄每一次命令(查詢某次修改的版本號)
****工做區:****
工做區(word directory)就是在電腦上能看到的目錄 當前開發程序所在的目錄爲工做區,該區域的文件會有狀態變化且狀態由git自動檢測 目錄中的文件的任何變化(增,刪,改),git都會檢測到,可使用git status命令查看
****版本庫:****
版本庫(repository)工做區有一個隱藏目錄.git,保存的就是git的版本庫 工做區檢測到有文件發生變化,那麼意味着文件狀態被改變,這時就能夠當作一個版本進行提交
工做區的代碼經過git add
來加入到暫存區,使用git commit
命令把暫存區的文件加入到當前分支的(通常爲git自動建立master的分區)
git的版本庫中一個區域,稱之爲stage(或者叫index)的暫存區. 在工做區的文件被修改,使用`git status`查看狀態時,顯示文件的顏色爲紅色 使用`git add`把文件從工做區移到暫存區,再使用`git status`查看狀態時,顯示文件的顏色爲綠色
git checkout --filename 撤銷工做區的修改,把工做區的文件恢復到暫存區的狀態 若是文件修改後還未放到暫存區,撤消修改就回到未修改以前的狀態 若是文件修改後已添加到暫存區,撤消修改就回到添加進暫存區時的狀態 git reset HEAD filename 把暫存區的修改撤消掉,從新放回到工做區,這條命令是在把修改後的文件提交到暫存區以後又後悔了,使文件恢復到版本庫的狀態 git reset HEAD 取消暫存區全部文件 git reset HEAD -- index.html 把暫存區中的index.html恢復成跟工做區同樣,能夠添加多個文件 git checkout -- index.html 把工做區恢復成和暫存區同樣 git stash 儲存當前工做現場 git stash list 查看stash區域的全部信息 git stash apply 取出stash區域中的文件放到當前工做區,可是文件還保存在stash區域中,能夠反覆使用 git stash drop 刪除最近一次儲存的stash git stash pop 取出stash區域中的文件放到當前工做區中,文件不會繼續保存到stash區域中 git stash stash@{num} 恢復指定stash
注意
若文件已經被推送到遠程,則沒法撤消
須要注意的是,git是對文件更改的管理,不是基於文件的管理
git branch # 查看當前分支而且看到在哪一個分支下工做 git branch -v # 查看本地git分支 git branch -av # 查看全部分支及其詳細信息,若是添加遠程倉庫,會顯示遠程倉庫上的分支 git branch dev # 建立一個dev分支 git checkout -b dev # 建立dev分支並切換到dev分支上工做 git checkout -b temp 5ccb4b3 # 基於5ccb4b3這個版本建立一個temp的分支 git checkout -b branch2 branch1 # 基於branch1分支建立並切換到branch2分支 git checkout dev # 切換到dev分支 git checkout master # 切換回master分支 git branch -d dev # 刪除dev分支,刪除分支時,分支相關的信息也會被刪除 git branch -D branch_name # 刪除指定分支,刪除分支時,分支相關的信息也會被刪除 git checkout --* # 把文件返回到修改以前的狀態 git merge dev # 把dev分支合併到當前分支 git merge --no-ff -m "commit_message" dev # 不使用fast forward模式合併dev分支到當前分支
須要注意的是:
git log
或者git log --graph
指令來查看分支與分支合併狀況git reset --hard HEAD^ 回退到上一個版本 git reset --hard HEAD^^ 回退到上兩個版本 git reset --hard 123456 回退到版本號爲123456的版本 git reset --hard commit_id^ 回退到指定commit_id的版本
注意
有的時候,提交推送的時候不想提交某些文件,此時能夠在這個項目根目錄下新建一個名爲.gitignore
的文件,
在這個文件裏能夠進行配置提交的時候忽略哪些文件,配置使用正則表達式的形式.
好比:
*.py 忽略全部的以py結尾的文件 test/a.* 忽略test目錄下全部的以a開頭的文件 test/[abc].py 忽略test目錄下a.py或b.py或c.py這三個文件 [abc] 忽略根目錄下a或b或c這三個文件 test/* 忽略test目錄下的全部文件 !test/a.py 忽略test目錄下不是a.py之外的全部文件,即只提交a.py這個文件
配置完成後,須要清除本地緩存,而後再次提交.
清除本地緩存的命令:
git rm -f --cached .
git diff # 比較工做區和暫存區全部文件的差別 git diff 3c6fab966158f9 72ec71f3c2aa # 比較兩次提交的差別 git diff HEAD HEAD~1 # git上一次提交與上上一次提交的差別 git diff HEAD HEAD^1^1 # git上一次提交與前兩次提交的差別 git diff HEAD HEAD~2 # git上一次提交與前兩次提交的差別 git diff HEAD HEAD^1 # git上一次提交與上上一次提交的差別 git diff HEAD HEAD^1 -- index.html # git上一次提交與上上一次提交中index.html文件的不一樣 git diff -- index.html # 比較工做區和暫存區中的index.html文件的差別 git diff --cached # 修改文件後,把修改的文件添加到暫存區中,查看暫存區和HEAD文件的差別 git diff master dev # 比較master分支和dev分支的差別 git diff master dev -- index.html # 比較index.html文件在master分支和dev分支的差別
兩個分支的位置不一樣,顯示文件的加減是不一樣的
git commit --amend # 修改最新提交的commit信息
1.列出全部的提交日誌
git log --oneline # 每行顯示一條提交記錄 git log --pretty=oneline gitk # 圖形化顯示全部提交記錄
2.進入修改交互模式
git rebase -i 版本號
這裏的版本號爲:要修改提交信息的版本號的上一個版本號。例如:按提交順序從1到6,若是想修改版本4的提交信息,則此處的版本號應該爲第3個版本號
3.進入交互模式後,會有以下提示:
# p, pick <commit> = use commit # r, reword <commit> = use commit, but edit the commit message # e, edit <commit> = use commit, but stop for amending # s, squash <commit> = use commit, but meld into previous commit # f, fixup <commit> = like "squash", but discard this commit's log message # x, exec <command> = run command (the rest of the line) using shell # d, drop <commit> = remove commit # l, label <label> = label current HEAD with a name # t, reset <label> = reset HEAD to a label # m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
並列出在進入交互式模式時輸入的版本號後的全部提交信息,把想修改的信息以前的pick修改成 r 或者 reword,而後:wq保存並退出
此時會打開想修改的commit的message信息,按vim編輯器的用法修改保存就能夠
4.查看修改以後的commit message
git log --oneline
前提是
必需要配置全局用戶名和用戶郵箱
1.查看全部提交記錄
git log --oneline
2.進入git交互式模式
git rebase -i 版本號
這裏的版本號爲:要修改提交信息的版本號的上一個版本號。例如:按提交順序從1到6,若是想合併版本4和版本5的提交信息,則此處的版本號應該爲第3個版本號
3.進入交互模式後,會有以下提示:
# p, pick <commit> = use commit # r, reword <commit> = use commit, but edit the commit message # e, edit <commit> = use commit, but stop for amending # s, squash <commit> = use commit, but meld into previous commit # f, fixup <commit> = like "squash", but discard this commit's log message # x, exec <command> = run command (the rest of the line) using shell # d, drop <commit> = remove commit # l, label <label> = label current HEAD with a name # t, reset <label> = reset HEAD to a label # m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
並列出在進入交互式模式時輸入的版本號後的全部提交信息,把被合併的版本號的commit信息前的pick換成 s 或 squash,而後保存並退出
此時會打開合併後的commit提交信息窗口,按vim編輯器的用法修改保存就能夠
4.查看修改以後的commit message
git log
能夠看到把多個commit合併成一個commit後,全部提交的版本號都改變了
例子:如今有屢次提交的版本號v1,版本號v2,版本號v3,版本號v4,版本號v5,版本號v6,想把v2和v3,v4這三次提交合併成一個新的提交,操做步驟:
git rebase -i v1 在打開的文件中,把v2和v3前面的pick修改爲s,而後保存並退出 在新打開的窗口中,把未註釋的行的內容修改成合併後想要的新內容,而後保存並退出 使用git log命令查看,就能夠看到合併後的提交信息了