Git

2018-05-15 14:04 更新

X分鐘速成Y

其中 Y=git

Git是一個(gè)分布式版本控制及源代碼管理工具

Git可以為你的項(xiàng)目保存若干快照,以此來(lái)對(duì)整個(gè)項(xiàng)目進(jìn)行版本管理

版本

什么是版本控制

版本控制系統(tǒng)就是根據(jù)時(shí)間來(lái)記錄一個(gè)或多個(gè)文件的更改情況的系統(tǒng)。

集中式版本控制 VS 分布式版本控制

  • 集中式版本控制的主要功能為同步,跟蹤以及備份文件
  • 分布式版本控制則更注重共享更改。每一次更改都有唯一的標(biāo)識(shí)
  • 分布式系統(tǒng)沒(méi)有預(yù)定的結(jié)構(gòu)。你也可以用git很輕松的實(shí)現(xiàn)SVN風(fēng)格的集中式系統(tǒng)控制

更多信息

為什么要使用Git

  • 可以離線工作
  • 和他人協(xié)同工作變得簡(jiǎn)單
  • 分支很輕松
  • 合并很容易
  • Git系統(tǒng)速度快,也很靈活

Git 架構(gòu)

版本庫(kù)

一系列文件,目錄,歷史記錄,提交記錄和頭指針。 可以把它視作每個(gè)源代碼文件都帶有歷史記錄屬性數(shù)據(jù)結(jié)構(gòu)

一個(gè)Git版本庫(kù)包括一個(gè) .git 目錄和其工作目錄

.git 目錄(版本庫(kù)的一部分)

.git 目錄包含所有的配置、日志、分支信息、頭指針等 詳細(xì)列表

工作目錄 (版本庫(kù)的一部分)

版本庫(kù)中的目錄和文件,可以看做就是你工作時(shí)的目錄

索引(.git 目錄)

索引就是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)指向最新的提交

頭指針 與 頭(.git 文件夾的作用)

頭指針是一個(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"

關(guān)于git的更多設(shè)置

幫助

git內(nèi)置了對(duì)命令非常詳細(xì)的解釋,可以供我們快速查閱

# 查找可用命令
$ git help

# 查找所有可用命令
$ git help -a

# 在文檔當(dāng)中查找特定的命令
# git help <命令>
$ git help add
$ git help commit
$ git help init

狀態(tài)

顯示索引文件(也就是當(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

clone

這個(gè)命令就是將一個(gè)版本庫(kù)拷貝到另一個(gè)目錄中,同時(shí)也將 分支都拷貝到新的版本庫(kù)中。這樣就可以在新的版本庫(kù)中提交到遠(yuǎn)程分支

# clone learnxinyminutes-docs
$ git clone https://github.com/adambard/learnxinyminutes-docs.git

commit

將當(dāng)前索引的更改保存為一個(gè)新的提交,這個(gè)提交包括用戶做出的更改與信息

# 提交時(shí)附帶提交信息
$ git commit -m "Added multiplyNumbers() function to HelloWorld.c"

diff

顯示當(dāng)前工作空間和提交的不同

# 顯示工作目錄和索引的不同
$ git diff

# 顯示索引和最近一次提交的不同
$ git diff --cached

# 顯示工作目錄和最近一次提交的不同
$ git diff HEAD

grep

可以在版本庫(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

log

顯示這個(gè)版本庫(kù)的所有提交

# 顯示所有提交
$ git log

# 顯示某幾條提交信息
$ git log -n 10

# 僅顯示合并提交
$ git log --merges

merge

合并就是將外部的提交合并到自己的分支中

# 將其他分支合并到當(dāng)前分支
$ git merge branchName

# 在合并時(shí)創(chuàng)建一個(gè)新的合并后的提交
$ git merge --no-ff branchName

mv

重命名或移動(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

pull

從遠(yuǎn)端版本庫(kù)合并到當(dāng)前分支

# 從遠(yuǎn)端origin的master分支更新版本庫(kù)
# git pull <遠(yuǎn)端> <分支>
$ git pull origin master

push

把遠(yuǎn)端的版本庫(kù)更新

# 把本地的分支更新到遠(yuǎn)端origin的master分支上
# git push <遠(yuǎn)端> <分支>
# git push 相當(dāng)于 git push origin master
$ git push origin master

rebase (謹(jǐn)慎使用)

將一個(gè)分支上所有的提交歷史都應(yīng)用到另一個(gè)分支上 不要在一個(gè)已經(jīng)公開(kāi)的遠(yuǎn)端分支上使用rebase.

# 將experimentBranch應(yīng)用到master上面
# git rebase <basebranch> <topicbranch>
$ git rebase master experimentBranch

更多閱讀

reset (謹(jǐn)慎使用)

將當(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

rm

和add相反,從工作空間中去掉某個(gè)文件

# 移除 HelloWorld.c
$ git rm HelloWorld.c

# 移除子目錄中的文件
$ git rm /pather/to/the/file/HelloWorld.c

更多閱讀

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)