前言
這是我第一次寫博客,而且是第一篇有關(guān)于技術(shù)的博客。自己學(xué)習(xí)編程,接觸計(jì)算機(jī)的時(shí)間也不長(zhǎng),但是很喜歡,所以也一直在努力(群里大佬太多了,不努力不行呀)。所以寫的不好或者說不清楚的地方就請(qǐng)忽略吧。
正題
GIT的安裝和下載我就不在這兒多廢話了,百度上有一大堆,隨便找找就能裝了,我就直接說說我對(duì)GIT的見解好了。(中間用的圖基本都是從網(wǎng)上盜的,沒有別的意思,我只是覺得這些圖很有助于對(duì)于知識(shí)的理解,請(qǐng)見諒,也謝謝理解)
GIT的工作流程
我覺得在學(xué)習(xí)如何敲代碼之前,應(yīng)該了解一下GIT的工作流程,畢竟它是一個(gè)版本控制系統(tǒng),既然起到控制的作用,那么我們應(yīng)該知道它的工作原理,這樣也有助于后面對(duì)于代碼的理解。
我在網(wǎng)上有找到圖片進(jìn)行說明:

圖上的步驟很復(fù)雜,我說說我自己的理解:
- 首先,克隆出來別人的資源(用GIT進(jìn)行代碼命令,這個(gè)后面會(huì)說,現(xiàn)在先看懂就行)
- 你抄了比如人的東西肯定不能全用呀,所以要進(jìn)行修改和添加
- 人家的代碼更新了,我們也要與時(shí)俱進(jìn)呀,所以也可以更新克隆來的代碼
- 改完了準(zhǔn)備提交,提交前要查看一下自己的修改
- 提交
- 在修改完成后,如果發(fā)現(xiàn)錯(cuò)誤,可以撤回提交并再次修改并提交。
以上就是我在學(xué)習(xí)過后自己總結(jié)的工作流程。
Git 工作區(qū)、暫存區(qū)和版本庫(kù)
GIT的工作是分階段進(jìn)行的,網(wǎng)上的教程和博客有些寫的很晦澀難懂,比較復(fù)雜,所以我先說說自己的理解,然后再上更加專業(yè)的定義。
我覺得這個(gè)過程其實(shí)比較有利于維護(hù)和管理,更能體現(xiàn)GIT的“控制”功能。當(dāng)我們想要提交一些東西的時(shí)候,用GIT我們需要先建立一個(gè)倉(cāng)庫(kù)(git init),也可以手動(dòng)建立(新建一個(gè)文件夾,然后右鍵鼠標(biāo)點(diǎn)擊“GIT BUSH HERE”)。然后就要添加文件了(git add),這樣做之后就會(huì)將你的文件添加到暫存區(qū),相當(dāng)于文件是商品,暫存區(qū)則是發(fā)貨前的商品存放倉(cāng)庫(kù),方便文件的修改、確定和最終的提交。再確認(rèn)好了文件的修改后,就可以提交了(git commit),這就會(huì)將暫存區(qū)里的東西都寫到版本區(qū)里。
這些就是我對(duì)他們的基本理解,其中還有很多細(xì)節(jié)上的修改和操作,如"git reset HEAD" 時(shí),暫存區(qū)的目錄樹被版本區(qū)的目錄樹替代;"git rm --cached <file>" 刪除暫存區(qū)的文件; "git checkout ." 或者 "git checkout -- <file>" 用暫存區(qū)的文件替代工作區(qū)的文件; "git checkout HEAD ." 或者 "git checkout HEAD <file>" 等的操作還很多,我自己還沒有理解的太深入,因此也就不在這里做說明了,下面就直接上圖和定義了。
- 工作區(qū):就是你在電腦里能看到的目錄。
- 暫存區(qū):英文叫stage, 或index。一般存放在 ".git目錄下" 下的index文件(.git/index)中,所以我們把暫存區(qū)有時(shí)也叫作索引(index)。
- 版本庫(kù):工作區(qū)有一個(gè)隱藏目錄.git,這個(gè)不算工作區(qū),而是Git的版本庫(kù)。

Git 基本操作
因?yàn)镚IT的操作命令比較多,這里就列舉出來幾個(gè)比較典型而且常用的命令,其余的命令在需要使用的時(shí)候可以上網(wǎng)查找。
git init
這個(gè)命令我們上面有提到過,是創(chuàng)建庫(kù)的售后使用的,在任何的目錄下都可以使用。輸入:
git init
就可以創(chuàng)建一個(gè)GIT庫(kù)了。
git clone
用git clone可以將GIT庫(kù)拷貝到本地,然后自己進(jìn)行修改和查看。輸入:
git clone[url]
[url]為你想要復(fù)制的項(xiàng)目(可以是網(wǎng)址),就可以克隆了。
例如:
$ git clone http://github.com/jquery/jquery.git
git add
這個(gè)在前面也有提到過,可以將文件添加到緩存。
git add
add后面可以加文件名,也可以加 “.” 代表添加所有文件。
git status
它可以查看你的你的修改,可以和 “git add” 配合使用,同時(shí)在status后面添加 “-s”可以查看簡(jiǎn)短的信息,否則輸出詳細(xì)信息。
如:
$ git status -s
A README
A hello.php
$ git status
On branch masterInitial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: README
new file: hello.php
git diff
這個(gè)用來查看寫入緩存前后的區(qū)別,可以分為以下幾類:
- 尚未緩存的改動(dòng):git diff
- 查看已緩存的改動(dòng): git diff --cached
- 查看已緩存的與未緩存的所有改動(dòng):git diff HEAD
- 顯示摘要而非整個(gè) diff:git diff --stat
在first.php下輸入內(nèi)容為:
<?php
echo 'hello';
?>
$ git status -s
A README
AM hello.php
$ git diff
diff --git a/hello.php b/hello.php
index e69de29..69b5711 100644
--- a/hello.php
+++ b/hello.php
@@ -0,0 +1,3 @@
+<?php
+echo 'hello';
+?>
git commit
這個(gè)命令我們前面也提到過,他可以將暫存區(qū)的文件提交到版本庫(kù)中去。在進(jìn)行要求配置用戶名和郵箱。
$ git config --global user.name 'github'
$ git config --global user.email git@qq.com
如圖為上傳成功的代碼:
“first commit”為第一次提交
git reset HEAD
用于取消已緩存的內(nèi)容。
$ git status -s
M README
M hello.php$ git add .
$ git status -s
M README
M hello.pp
$ git reset HEAD hello.phpUnstaged changes after reset:
M hello.php
$ git status -s
M README
M hello.php
Git 分支管理
意味著從主線分開一個(gè)支路,同時(shí)工作。
創(chuàng)建分支:
git branch (branchname)
切換分支:
git checkout (branchname)
合并分支,將多個(gè)分支合并在一起:
git merge
列出分支
列出分支的命令:
git branch
沒有參數(shù)時(shí),會(huì)列出本地分支:
手動(dòng)創(chuàng)建分支后如下:
切換分支
$ ls
README
$ echo 'test' > test.txt$ git add .
$ git commit -m 'add test.txt'
[master 048598f] add test.txt
2 files changed, 1 insertion(+), 3 deletions(-)
delete mode 100644 hello.php
create mode 100644 test.txt
$ lsREADME test.txt
$ git checkout first
Switched to branch 'first'
$ ls
README hello.php
當(dāng)我們切換到"first"分支的時(shí)候,我們添加的新文件test.txt被移除了, 原來被刪除的文件hello.php文件又出現(xiàn)了。切換回"master"分支的時(shí)候,它們有重新出現(xiàn)了。
$ git checkout master
Switched to branch 'master'
$ ls
README test.txt
刪除分支
刪除分支命令為:
git branch -d (branchname)
刪除first分支:
$ git branch
* master
first$ git branch -d first
Deleted branch first (was 85fc7e7).
$ git branch* master
分支合并
$ git branch
* master
newtest
$ ls
README test.txt test2.txt$ git merge newtest
Updating 2e082b7..556f0a0
Fast-forward
test2.txt | 1 -
1 file changed, 1 deletion(-)
delete mode 100644 test2.txt
$ ls
README test.txt
以上將newtest合并到主分支上去,test2.txt被刪除。
合并沖突
首先,我們創(chuàng)建一個(gè)叫做"change_site"的分支,切換過去,我們將內(nèi)容改為 hello。
$ git checkout -b change_site
Switched to a new branch 'change_site'
$ vim test.txt$ head -1 test.txt
hello
$ git commit -am 'changed the site'
[change_site d7e7346] changed the site
1 file changed, 1 insertion(+), 1 deletion(-)
將修改的內(nèi)容提交到 "change_site" 分支中。 現(xiàn)在,假如切換回 "master" 分支我們可以看內(nèi)容恢復(fù)到我們修改前的,我們?cè)俅涡薷膖est.txt文件。
$ git checkout master
Switched to branch 'master'
$ head -1 test.txthi hello
$ vim test.txt$ cat test.txt
runoob.com
新增加一行
$ git diffdiff --git a/test.txt b/test.txt
index 704cce7..f84c2a4 100644
--- a/test.txt
+++ b/test.txt
@@ -1 +1,2 @@
hi hello
+新增加一行
$ git commit -am '新增加一行'
[master 14b4dca] 新增加一行
1 file changed, 1 insertion(+)
現(xiàn)在這些改變已經(jīng)記錄到我的 "master" 分支了。接下來我們將 "change_site" 分支合并過來。
$ git merge change_site
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.
$ cat test.txt
<<<<<<< HEAD
hi hello
新增加一行
=======
hello
>>>>>>> change_site
我們將前一個(gè)分支合并到 "master" 分支,一個(gè)合并沖突就出現(xiàn)了,接下來我們需要手動(dòng)去修改它。
$ vim test.txt
$ cat test.txt
hello
新增加一行
$ git diff
diff --cc test.txt
index f84c2a4,bccb7c2..0000000
--- a/test.txt
+++ b/test.txt
@@@ -1,2 -1,1 +1,2 @@@
- hi hello
- hello
+新增加一行
在 Git 中,我們可以用 git add 要告訴 Git 文件沖突已經(jīng)解決
$ git status -s
UU test.txt
$ git add test.txt$ git status -s
M test.txt
$ git commit
[master 88afe0e] Merge branch 'change_site'
現(xiàn)在我們成功解決了合并中的沖突,并提交了結(jié)果。