Git是一個(gè)分布式版本控制及源代碼管理工具
Git可以為你的項(xiàng)目保存若干快照,以此來(lái)對(duì)整個(gè)項(xiàng)目進(jìn)行版本管理
版本控制系統(tǒng)就是根據(jù)時(shí)間來(lái)記錄一個(gè)或多個(gè)文件的更改情況的系統(tǒng)。
一系列文件,目錄,歷史記錄,提交記錄和頭指針。 可以把它視作每個(gè)源代碼文件都帶有歷史記錄屬性數(shù)據(jù)結(jié)構(gòu)
一個(gè)Git版本庫(kù)包括一個(gè) .git 目錄和其工作目錄
.git 目錄包含所有的配置、日志、分支信息、頭指針等 詳細(xì)列表
版本庫(kù)中的目錄和文件,可以看做就是你工作時(shí)的目錄
索引就是git中的 staging 區(qū). 可以算作是把你的工作目錄與Git版本庫(kù)分割開(kāi)的一層 這使得開(kāi)發(fā)者能夠更靈活的決定要將要在版本庫(kù)中添加什么內(nèi)容
一個(gè) git 提交就是一組更改或者對(duì)工作目錄操作的快照 比如你添加了5個(gè)文件,刪除了2個(gè)文件,那么這些變化就會(huì)被寫入一個(gè)提交比如你添加了5個(gè)文件,刪除了2個(gè)文件,那么這些變化就會(huì)被寫入一個(gè)提交中 而這個(gè)提交之后也可以被決定是否推送到另一個(gè)版本庫(kù)中
分支其實(shí)就是一個(gè)指向你最后一次的提交的指針 當(dāng)你提交時(shí),這個(gè)指針就會(huì)自動(dòng)指向最新的提交
頭指針是一個(gè)指向當(dāng)前分支的指針,一個(gè)版本庫(kù)只有一個(gè)當(dāng)前活動(dòng)的頭指針 而頭則可以指向版本庫(kù)中任意一個(gè)提交,每個(gè)版本庫(kù)也可以有多個(gè)頭
創(chuàng)建一個(gè)新的git版本庫(kù)。這個(gè)版本庫(kù)的配置、存儲(chǔ)等信息會(huì)被保存到.git文件夾中
$ git init
更改設(shè)置??梢允前姹編?kù)的設(shè)置,也可以是系統(tǒng)的或全局的
# 輸出、設(shè)置基本的全局變量
$ git config --global user.email
$ git config --global user.name
$ git config --global user.email "MyEmail@Zoho.com"
$ git config --global user.name "My Name"
git內(nèi)置了對(duì)命令非常詳細(xì)的解釋,可以供我們快速查閱
# 查找可用命令
$ git help
# 查找所有可用命令
$ git help -a
# 在文檔當(dāng)中查找特定的命令
# git help <命令>
$ git help add
$ git help commit
$ git help init
顯示索引文件(也就是當(dāng)前工作空間)和當(dāng)前的頭指針指向的提交的不同
# 顯示分支,為跟蹤文件,更改和其他不同
$ git status
# 查看其他的git status的用法
$ git help status
添加文件到當(dāng)前工作空間中。如果你不使用 git add
將文件添加進(jìn)去, 那么這些文件也不會(huì)添加到之后的提交之中
# 添加一個(gè)文件
$ git add HelloWorld.java
# 添加一個(gè)子目錄中的文件
$ git add /path/to/file/HelloWorld.c
# 支持正則表達(dá)式
$ git add ./*.java
管理分支,可以通過(guò)下列命令對(duì)分支進(jìn)行增刪改查
# 查看所有的分支和遠(yuǎn)程分支
$ git branch -a
# 創(chuàng)建一個(gè)新的分支
$ git branch myNewBranch
# 刪除一個(gè)分支
$ git branch -d myBranch
# 重命名分支
# git branch -m <舊名稱> <新名稱>
$ git branch -m myBranchName myNewBranchName
# 編輯分支的介紹
$ git branch myBranchName --edit-description
將當(dāng)前工作空間更新到索引所標(biāo)識(shí)的或者某一特定的工作空間
# 檢出一個(gè)版本庫(kù),默認(rèn)將更新到master分支
$ git checkout
# 檢出到一個(gè)特定的分支
$ git checkout branchName
# 新建一個(gè)分支,并且切換過(guò)去,相當(dāng)于"git branch <名字>; git checkout <名字>"
$ git checkout -b newBranch
這個(gè)命令就是將一個(gè)版本庫(kù)拷貝到另一個(gè)目錄中,同時(shí)也將 分支都拷貝到新的版本庫(kù)中。這樣就可以在新的版本庫(kù)中提交到遠(yuǎn)程分支
# clone learnxinyminutes-docs
$ git clone https://github.com/adambard/learnxinyminutes-docs.git
將當(dāng)前索引的更改保存為一個(gè)新的提交,這個(gè)提交包括用戶做出的更改與信息
# 提交時(shí)附帶提交信息
$ git commit -m "Added multiplyNumbers() function to HelloWorld.c"
顯示當(dāng)前工作空間和提交的不同
# 顯示工作目錄和索引的不同
$ git diff
# 顯示索引和最近一次提交的不同
$ git diff --cached
# 顯示工作目錄和最近一次提交的不同
$ git diff HEAD
可以在版本庫(kù)中快速查找
可選配置:
# 感謝Travis Jeffery提供的以下用法:
# 在搜索結(jié)果中顯示行號(hào)
$ git config --global grep.lineNumber true
# 是搜索結(jié)果可讀性更好
$ git config --global alias.g "grep --break --heading --line-number"
# 在所有的java中查找variableName
$ git grep 'variableName' -- '*.java'
# 搜索包含 "arrayListName" 和, "add" 或 "remove" 的所有行
$ git grep -e 'arrayListName' --and \( -e add -e remove \)
更多的例子可以查看: Git Grep Ninja
顯示這個(gè)版本庫(kù)的所有提交
# 顯示所有提交
$ git log
# 顯示某幾條提交信息
$ git log -n 10
# 僅顯示合并提交
$ git log --merges
合并就是將外部的提交合并到自己的分支中
# 將其他分支合并到當(dāng)前分支
$ git merge branchName
# 在合并時(shí)創(chuàng)建一個(gè)新的合并后的提交
$ git merge --no-ff branchName
重命名或移動(dòng)一個(gè)文件
# 重命名
$ git mv HelloWorld.c HelloNewWorld.c
# 移動(dòng)
$ git mv HelloWorld.c ./new/path/HelloWorld.c
# 強(qiáng)制重命名或移動(dòng)
# 這個(gè)文件已經(jīng)存在,將要覆蓋掉
$ git mv -f myFile existingFile
從遠(yuǎn)端版本庫(kù)合并到當(dāng)前分支
# 從遠(yuǎn)端origin的master分支更新版本庫(kù)
# git pull <遠(yuǎn)端> <分支>
$ git pull origin master
把遠(yuǎn)端的版本庫(kù)更新
# 把本地的分支更新到遠(yuǎn)端origin的master分支上
# git push <遠(yuǎn)端> <分支>
# git push 相當(dāng)于 git push origin master
$ git push origin master
將一個(gè)分支上所有的提交歷史都應(yīng)用到另一個(gè)分支上 不要在一個(gè)已經(jīng)公開(kāi)的遠(yuǎn)端分支上使用rebase.
# 將experimentBranch應(yīng)用到master上面
# git rebase <basebranch> <topicbranch>
$ git rebase master experimentBranch
將當(dāng)前的頭指針復(fù)位到一個(gè)特定的狀態(tài)。這樣可以使你撤銷merge、pull、commits、add等 這是個(gè)很強(qiáng)大的命令,但是在使用時(shí)一定要清楚其所產(chǎn)生的后果
# 使 staging 區(qū)域恢復(fù)到上次提交時(shí)的狀態(tài),不改變現(xiàn)在的工作目錄
$ git reset
# 使 staging 區(qū)域恢復(fù)到上次提交時(shí)的狀態(tài),覆蓋現(xiàn)在的工作目錄
$ git reset --hard
# 將當(dāng)前分支恢復(fù)到某次提交,不改變現(xiàn)在的工作目錄
# 在工作目錄中所有的改變?nèi)匀淮嬖?$ git reset 31f2bb1
# 將當(dāng)前分支恢復(fù)到某次提交,覆蓋現(xiàn)在的工作目錄
# 并且刪除所有未提交的改變和指定提交之后的所有提交
$ git reset --hard 31f2bb1
和add相反,從工作空間中去掉某個(gè)文件
# 移除 HelloWorld.c
$ git rm HelloWorld.c
# 移除子目錄中的文件
$ git rm /pather/to/the/file/HelloWorld.c
更多建議: