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