Git使用
Git
Git是一個分布式版本控制工具,用來管理多人寫作的代碼。同時也是一個內容管理系統。
Git與SVN的區別:
- Git是分布式的,svn不是。這是最核心的區別
- Git把內容按元數據方式存儲,而SVN是按文件:所有的資源控制系統都是把文件的原信息隱藏在一個類似.svn .cvs等的文件夾里
- Git分支和SVN分支的不同:分支在SVN中一點都不特別,其實他就是版本庫中的另外一個目錄
- Git沒有一個全局的版本號,而SVN有
- Git的內容完整性要優于SVN:Git的內容存儲使用的是SHA-1哈希算法,這能確保代碼內容的完整性,確保在遇到磁盤故障和網絡問題時降低對版本庫的破壞
1、Git安裝
Windows平臺上的安裝,到官網https://gitforwindows.org/,下載安裝包,一路確認,完成安裝。
安裝完成后,右鍵git bash here,可以使用命令行的git工具(自帶SSH客戶端)。
Git配置
Git提供了一個叫做git config的工具,專門用來配置或讀取相應的工作變量。
這些環境變量,決定了Git在各個環節的具體工作方式和行為。這些變量可以存放在三個不同的地方:
- /etc/gitconfig 文件:系統中對所有用戶都普遍使用的配置。若使用
git config --system選項,讀寫的就是這個文件D:\smy_software\git\Git\etc\gitconfig。 - ~/.gitconfig:用戶目錄下的配置文件只適用于該永固。若使用
git config --global選項,讀寫的就是這個文件。C:\Users\10170\.gitconfig - 當前項目的Git目錄中的配置文件(也就是工作目錄中的
/.git/config文件):這里的配置僅僅針對當前項目有效。每一個級別的配置都會覆蓋上層的相同配置,所以.git/config里的配置會覆蓋/etc/gitconfig中的同名變量。
項目路徑/.git/config文件配置如下:
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
[remote "origin"]
url = http://項目地址.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
因為我使用過git config --global 命令配置過用戶信息,所以這里使用的是2中的用戶信息,這個文件里只記錄了倉庫的配置信息。
用戶目錄/.gitconfig配置信息
[user]
email = 郵箱
name = 用戶名
[core]
autocrlf = false
在 Windows 系統上,Git 會找尋用戶主目錄下的 .gitconfig 文件。主目錄即 $HOME 變量指定的目錄,一般都是 C:\Documents and Settings\$USER。
此外,Git 還會嘗試找尋 /etc/gitconfig 文件,只不過看當初 Git 裝在什么目錄,就以此作為根目錄來定位。
配置用戶信息
# 配置個人的用戶名稱和電子郵件地址
git config --global user.name "xxx"
git config --global user.email xxx@yy.com
如果使用了 --global選項,那么更改的配置文件就是位于用戶主目錄下的./gitconfig文件,以后所有的項目都會默認使用這里配置的用戶信息。
如果要在某個特定的項目中使用其他名字或者電郵,只要去掉--global選項重新配置即可,新的設定保存在當前項目的 .git/config 文件里。
適用于工作項目和個人項目分開的場景。例如,在xxx/A目錄我使用github賬號遠程我的github倉庫,在xxx/B目錄使用gitLab賬號遠程公司的gitLab倉庫。
差異分析工具
經常用在解決合并沖突時使用差異分析工具。可以使用如下命令配置
# 改用vimdiff
git config --global merge.tool vimdiff
Git 可以理解 kdiff3,tkdiff,meld,xxdiff,emerge,vimdiff,gvimdiff,ecmerge,和 opendiff 等合并工具的輸出信息。
查看配置信息
檢查已有的配置信息,可以使用如下命令
git config --list
注意:在idea中的終端中運行這個命令輸出的信息是不完全的,需要在git bash中運行這個才可以看到完整的配置信息。
2、Git工作流程
一般工作流程如下:
- 克隆 Git 資源作為工作目錄。
- 在克隆的資源上添加或修改文件。
- 如果其他人修改了,你可以更新資源。
- 在提交前查看修改。
- 提交修改。
- 在修改完成后,如果發現錯誤,可以撤回提交并再次修改并提交。
如圖所示

3、Git原理
基本概念
我們先來理解下 Git 工作區、暫存區和版本庫概念:
- 工作區:就是你在電腦里能看到的目錄。
- 暫存區:英文叫 stage 或 index。一般存放在 .git 目錄下的 index 文件(.git/index)中,所以我們把暫存區有時也叫作索引(index)。
- 版本庫:工作區有一個隱藏目錄 .git,這個不算工作區,而是 Git 的版本庫。

- 圖中左側為工作區,右側為版本庫。在版本庫中標記為 "index" 的區域是暫存區(stage/index),標記為 "master" 的是 master 分支所代表的目錄樹。
- 圖中我們可以看出此時 "HEAD" 實際是指向 master 分支的一個"游標"。所以圖示的命令中出現 HEAD 的地方可以用 master 來替換。
- 圖中的 objects 標識的區域為 Git 的對象庫,實際位于 ".git/objects" 目錄下,里面包含了創建的各種對象及內容。
- 當對工作區修改(或新增)的文件執行 git add 命令時,暫存區的目錄樹被更新,同時工作區修改(或新增)的文件內容被寫入到對象庫中的一個新的對象中,而該對象的ID被記錄在暫存區的文件索引中。
- 當執行提交操作(git commit)時,暫存區的目錄樹寫到版本庫(對象庫)中,master 分支會做相應的更新。即 master 指向的目錄樹就是提交時暫存區的目錄樹。
- 當執行 git reset HEAD 命令時,暫存區的目錄樹會被重寫,被 master 分支指向的目錄樹所替換,但是工作區不受影響。
- 當執行 git rm --cached
命令時,會直接從暫存區刪除文件,工作區則不做出改變。 - 當執行 git checkout . 或者 git checkout --
命令時,會用暫存區全部或指定的文件替換工作區的文件。這個操作很危險,會清除工作區中未添加到暫存區中的改動。 - 當執行 git checkout HEAD . 或者 git checkout HEAD
命令時,會用 HEAD 指向的 master 分支中的全部或者部分文件替換暫存區和以及工作區中的文件。這個命令也是極具危險性的,因為不但會清除工作區中未提交的改動,也會清除暫存區中未提交的改動。
4、Git基本操作

Git的工作就是創建和保存用戶項目的快照及與之后的快照進行對比。
說明:
- workspace:工作區
- staging area:暫存區/緩存區
- local repository:版本庫或本地倉庫
- remote repository:遠程倉庫
創建倉庫命令
| 命令 | 說明 |
|---|---|
git init |
初始化倉庫。 |
git clone |
拷貝一份遠程倉庫,也就是下載一個項目。 |
一個文件夾成為一個git倉庫的標志是,這個文件夾下有一個.git的隱藏文件夾。這個就是版本庫,里面還有暫存區。這個文件夾下的其他文件作為被git管理的文件。
提交與修改
Git 的工作就是創建和保存你的項目的快照及與之后的快照進行對比。
下表列出了有關創建與提交你的項目的快照的命令:
| 命令 | 說明 |
|---|---|
git add |
添加文件到暫存區 |
git status |
查看倉庫當前的狀態,顯示有變更的文件。 |
git diff |
比較文件的不同,即暫存區和工作區的差異。 |
git commit |
提交暫存區到本地倉庫。 |
git reset |
回退版本。 |
git rm |
將文件從暫存區和工作區中刪除。 |
git mv |
移動或重命名工作區文件。 |
提交日志
| 命令 | 說明 |
|---|---|
git log |
查看歷史提交記錄 |
git blame <file> |
以列表形式查看指定文件的歷史修改記錄 |
遠程操作
| 命令 | 說明 |
|---|---|
git remote |
遠程倉庫操作 |
git fetch |
從遠程獲取代碼庫 |
git pull |
下載遠程代碼并合并 |
git push |
上傳遠程代碼并合并 |
5、Git分支管理
Git分支實際上是指向更改快照的指針。
當切換到一個分支的時候,Git會用此分支最后一次提交(commit)的快照替換掉工作區的內容。所以多個分支不需要多個目錄。
| 命令 | 說明 |
|---|---|
git branch |
查看所有的分支,并且高亮顯示當前所在分支 |
git branch branchname |
創建新分支,不切換到新分支。此時新分支指向工作區中的文件 |
git checkout branchname |
切換到branchname分支。 |
git checkout -b branchname |
創建并切換到branchname分支,相當于前兩條命令的組合。此時新分支指向工作區中的文件 |
git merge source |
合并分支,將source分支合并到當前所在的分支。在git bash中默認不會刪除原分支;在GitLab中默認勾選了Delete Source branch,會自動刪除合并的source分支。 |
git branch -d dev |
刪除dev分支,注意當前所在分支不能為dev分支,會報錯。必須切換到其他分支再執行這個命令 |
git status |
可以用來查看那些因包含合并沖突而處于未合并(unmerged)狀態的文件 |
git diff |
顯示合并沖突的地方 |
git merge的三種情況
- 快進(無沖突)
- 描述:dev從master分支上創建,dev分支commit了多次后,并且master分支沒有執行commit操作。
- 此時,沒有發生沖突,可以進行自動merge
- 不會自動commit
- 非快進,修改不同文件(無沖突)
- 描述:dev從master分支上創建,dev分支commit了多次后,master分支也提交了多次。并且兩個分支修改的不是一個文件。
- 此時,沒有發生沖突,可以進行自動merge
- 合并后的版本,會自動commit一次
- 非快進,修改相同文件(有沖突)
- 描述:dev從master分支上創建,dev分支commit了多次后,master分支也提交了多次。并且兩個分支修改的是一個文件。
- 此時,會發生沖突,自動合并失敗,需要手動解決沖突。
- 使用命令
git status可以查看是哪些文件發生了沖突 - 使用命令
git diff可以查看哪些文件的哪個地方發生沖突。 - 手動打開這些文件,修改文件內容。vim
- 手動提交
git add .git commit -m "xxx"
6、Git查看提交歷史
Git 提交歷史一般常用兩個命令:
- git log - 查看歷史提交記錄。
- git blame <file> - 以列表形式查看指定文件的歷史修改記錄。
| 命令 | 說明 |
|---|---|
git log |
查看提交記錄,第一條是最新的 |
git log --oneline |
查看歷史記錄的簡潔版本 |
git log --graph |
查看歷史中什么時候出現了分支、合并。 |
git log --reverse --oneline |
逆向顯示所有日志 |
git log --author |
查看指定用戶提交的部分,如git log --author=Linus --oneline -5 |
7、Git標簽
| 命令 | 說明 |
|---|---|
git tag -a v1.0 |
為最新一次的commit打上標簽,-a表示創建一個帶注解的標簽。不用-a也可以創建標簽,但是它不會記錄標簽是什么時候打的,誰打的,也不會添加標簽的注解。 |
git tag |
查看所有的標簽 |
git tag -a v0.9 85fc7e7 |
為某個commit追加標簽。與上面的區別是一個是為最新的commit打標簽,這個是為指定的(可以不是最新的)commit打標簽。 |
8、使用遠程倉庫
通過第三方的(github)或者自建的服務器,實現與其他人共同開發,版本控制。

| 命令 | 說明 |
|---|---|
git remote add [shortname] [url] |
添加一個新的遠程庫,shortname一般為origin,url是遠程倉庫的地址。連接完成之后,可以將本地的commit push到遠程倉庫中。 |
git remote |
查看當前配置有哪些遠程倉庫 |
git remote -v |
查看當前配置有哪些遠程倉庫,顯示url和方式 |
git fetch |
從遠程倉庫下載最新分支與數據。該命令執行完后需要手動執行 git merge 遠程分支到你所在的分支。 |
git pull <遠程主機名> <遠程分支名>:<本地分支名> |
相當于git fetch 和 git merge的組合 |
git push origin <source>:<destination> |
推送當前分支到遠程分支 |
git remote rm [別名] |
刪除遠程倉庫 |
參考
本文來自博客園,作者:永恒&,轉載請注明原文鏈接:http://www.rzrgm.cn/Sun-yuan/p/17155179.html

浙公網安備 33010602011771號