首頁 > 軟體

Git 單機版安裝使用

2020-06-16 17:44:25

簡介:

Git 是一款開源的分散式版本控制系統,是當今最流行、先進的版本控制軟體,沒有之一。
Git 是一個分散式的版本控制系統,相反 SVN 就是一個集中式的版本控制系統了。SVN 每修改完一個檔案要提交到伺服器端進行儲存,而 Git 在本地有一個完整的版本庫。

一、安裝 Git

1、Linux( CentOS

shell > yum -y install git

## 沒錯,已經安裝完成了

2、Windows( WIN7 )
下載地址:https://github-windows.s3.amazonaws.com/GitHubSetup.exe

> 雙擊圖示,選擇 install( 會自動下載程式包 )
> 選擇 skip ,如果你有 github 使用者,也可以登陸哦
> 點選左上角的 "+" ,新增自己的版本庫,輸入版本庫名、選擇版本庫路徑,最後點選建立
> 然後就可以新增檔案到版本庫了,可以使用 Git Shell 命令列操作喲

二、Git( CentOS )

1、建立版本庫

shell > git config --global user.name "linuxidc"
shell > git config --global user.email "linux@linuxidc.com"
shell > git config --global color.ui true

## 第一、二條是設定自己的使用者名稱、郵件地址,分散式版本控制系統嘛,用來證明你是你。由於是全域性設定,本地所有的版本庫都是這個名,也可以單獨為某個版本庫設定( 這是必須設定的 )
## 第三條是智慧顏色顯示,輸出的結果有顏色區分,看著方便、顯著高大上,對就是這個意思

shell > mkdir -p /git/gitdb ; cd /git/gitdb
shell > git init
Initialized empty Git repository in /git/gitdb/.git/
shell > ls .git/
branches config description HEAD hooks info objects refs

## 使用 git init 初始化版本庫( 在哪個目錄下執行,哪個目錄就是版本庫目錄 )
## 這樣就建立好了一個 gitdb 的版本庫了,版本庫的相關檔案全儲存在隱藏目錄 .git 下,一般不要手動去修改裡面的東西,否則會把版本庫玩壞

2、向版本庫中新增檔案

## 關於 Git 的操作,沒有特殊說明情況下,操作目錄都是 /git/gitdb/ 這裡

shell > head -5 /etc/passwd | tee passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

## 把 /etc/passwd 檔案中的前 5 行資料重定向到了 /git/gitdb/passwd 檔案中,內容如上

 

shell > git status
# On branch master
#
# Initial commit
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# passwd
nothing added to commit but untracked files present (use "git add" to track)

 

## 這時通過 git status 指令可以看到,工作區有一個名為 passwd 的檔案,還沒有提交( 提交前要使用 git add <file> 指令將檔案新增到暫存區 )
## 工作區:版本庫目錄即為工作區( 在版本庫目錄中建立一個檔案,就是在工作區建立一個檔案 )
## 暫存區:使用 git add 指令時,實際上就是把檔案從工作區新增到暫存區的過程
## 分支:建立版本庫時,git 會自動建立一個 master 分支,使用 git commit 指令時,實際上就是把暫存區的所有檔案提交到 master 分支
## 所以這三者之間的關係是:工作區-->暫存區-->分支
## git add 可以多次新增、也可以一次新增多個檔案到暫存區,git commit 會一次性把暫存區的所有修改提交到分支

 

shell > git add passwd
shell > git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: passwd
#

 

## 新增完成後,發現暫存區有一個名為 passwd 的檔案還沒有提交( 可以使用 git rm --cached <file> 指令將暫存區的檔案刪除,注意:不是工作區的檔案 )

shell > git rm --cached passwd
rm 'passwd'

## 刪除後,你會發現:工作區的 passwd 檔案還在,當使用 git status 指令時,狀態又變回了沒有 git add 時的狀態

shell > git add passwd
shell > git commit passwd -m "one"
git commit -m "one"
[master (root-commit) 7af25e2] one
1 files changed, 5 insertions(+), 0 deletions(-)
create mode 100644 passwd

## 提交時,-m 引數用來做個標記,你可以標註一些有意思的東西,例如你做了什麼修改之類的...

shell > git status
# On branch master
nothing to commit (working directory clean)

## 這時使用 git status 指令發現工作區已經沒有東西了( 提交完成 )

3、恢復到上個版本或某個版本

 

shell > sed -i 's/nologin/login/g' passwd
shell > git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: passwd
#
no changes added to commit (use "git add" and/or "git commit -a")

 

## 由於把檔案中 nologin 欄位修改成了 login ,git status 發現 passwd 檔案被修改了,但是還沒有更新( git checkout -- <file> 待會說 )

 

shell > git diff HEAD -- passwd
diff --git a/passwd b/passwd
index 03dab68..96635c1 100644
--- a/passwd
+++ b/passwd
@@ -1,5 +1,5 @@
root:x:0:0:root:/root:/bin/bash
-bin:x:1:1:bin:/bin:/sbin/nologin
-daemon:x:2:2:daemon:/sbin:/sbin/nologin
-adm:x:3:4:adm:/var/adm:/sbin/nologin
-lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
+bin:x:1:1:bin:/bin:/sbin/login
+daemon:x:2:2:daemon:/sbin:/sbin/login
+adm:x:3:4:adm:/var/adm:/sbin/login
+lp:x:4:7:lp:/var/spool/lpd:/sbin/login

 

## 可以使用 git diff 指令檢視工作區跟版本庫( 分支 )的檔案( 改動 )差異( HEAD 代表分支中( 版本庫 )當前版本,即最新版本 )

 

shell > git add passwd
shell > git commit -m "two"
[master 6fd5803] two
1 files changed, 4 insertions(+), 4 deletions(-)
shell > git status
# On branch master
nothing to commit (working directory clean)

 

## 將修改後的檔案提交到了版本庫中,搞了個標記叫 two ,呃,代表第二次提交
## 提交完成後,工作區就沒有東西了

 

shell > sed -i 's/bash/Python/' passwd
shell > git add passwd
shell > git commit -m "three"
[master 4cba143] three
1 files changed, 1 insertions(+), 1 deletions(-)
shell > git status
# On branch master
nothing to commit (working directory clean)
shell > git diff HEAD -- passwd

 

## 第三次提交完成,使用 git diff 指令發現版本庫中最新版本跟工作區檔案完全相同

 

shell > git log
git log
commit 4cba14306c482080f442043b33f1dd640352a3f9
Author: linuxidc <linux@linuxidc.com>
Date: Tue Jul 21 19:51:30 2015 +0200

three

commit 6fd5803a3fc2d3039ceaf6fc0b9c4fb8f0dfc67a
Author: linuxidc <linux@linuxidc.com>
Date: Tue Jul 21 19:43:17 2015 +0200

two

commit 7af25e23a89ba16e5ff14a8da305542bc9cc6062
Author: linuxidc <linux@linuxidc.com>
Date: Tue Jul 21 18:54:41 2015 +0200

one

 

## 通過 git log 指令可以清楚的看到總共有三次提交,標記為 one 、two 、three ,現在想回到上次版本( two )怎麼辦 ?

 

shell > git reset --hard HEAD^
HEAD is now at 6fd5803 two
shell > cat passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/login
daemon:x:2:2:daemon:/sbin:/sbin/login
adm:x:3:4:adm:/var/adm:/sbin/login
lp:x:4:7:lp:/var/spool/lpd:/sbin/login

 

## 使用 git reset 指令,HEAD^ 代表上個版本,HEAD^^ 代表上兩個版本,現在已經回到了 two 版本了( three 版本的 bash 變為 python 已經又恢復成 bash 了 )

 

shell > git log
commit 6fd5803a3fc2d3039ceaf6fc0b9c4fb8f0dfc67a
Author: linuxidc <linux@linuxidc.com>
Date: Tue Jul 21 19:43:17 2015 +0200

two

commit 7af25e23a89ba16e5ff14a8da305542bc9cc6062
Author: linuxidc <linux@linuxidc.com>
Date: Tue Jul 21 18:54:41 2015 +0200

one

 

## 現在就剩兩個版本了,最上面 two 為最新版本,即當前版本
## 恢復到某個版本,假設有好多好多個版本,使用 HEAD^^^^ 或 HEAD~[number] 的方式就很不方便了( 都要數 )
## 既然 HEAD 代表版本號,那麼恢復時直接輸入版本號不就可以了?非常方便,git log 指令輸出的 commit 欄位( 7af25e23a89ba16e5ff14a8da305542bc9cc6062 )就是版本號

 

shell > git reset --hard 7af25e2
HEAD is now at 7af25e2 one
shell > cat passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

 

## 使用 git reset 指令時,只需輸出版本號的前幾位即可,可以看到已經恢復到了第一版,檔案內容也變回了最初的狀態

shell > git log
commit 7af25e23a89ba16e5ff14a8da305542bc9cc6062
Author: linuxidc <linux@linuxidc.com>
Date: Tue Jul 21 18:54:41 2015 +0200

one

## 這時使用 git log 指令發現只有第一次提交的版本了,那麼現在想回到 two 或 three 版本該怎麼辦?( 版本號沒有了 )

 

shell > git reflog
7af25e2 HEAD@{0}: 7af25e2: updating HEAD
6fd5803 HEAD@{1}: HEAD^: updating HEAD
4cba143 HEAD@{2}: commit: three
6fd5803 HEAD@{3}: commit: two
shell > git reset --hard 4cba143
HEAD is now at 4cba143 three

 

## 使用 git reflog 指令可以看到操作記錄,第一列就是我們想要的版本號,再次使用 git reset 指令恢復即可

 

shell > cat passwd
root:x:0:0:root:/root:/bin/python
bin:x:1:1:bin:/bin:/sbin/login
daemon:x:2:2:daemon:/sbin:/sbin/login
adm:x:3:4:adm:/var/adm:/sbin/login
lp:x:4:7:lp:/var/spool/lpd:/sbin/login
shell > git log
commit 4cba14306c482080f442043b33f1dd640352a3f9
Author: linuxidc <linux@linuxidc.com>
Date: Tue Jul 21 19:51:30 2015 +0200

three

commit 6fd5803a3fc2d3039ceaf6fc0b9c4fb8f0dfc67a
Author: linuxidc <linux@linuxidc.com>
Date: Tue Jul 21 19:43:17 2015 +0200

two

commit 7af25e23a89ba16e5ff14a8da305542bc9cc6062
Author: linuxidc <linux@linuxidc.com>
Date: Tue Jul 21 18:54:41 2015 +0200

one

 

## 檔案內容、版本資訊都回來了,現在的版本恢復到了 three 狀態

4、git checkout -- <file> :還記得這個不 ?

 

shell > sed -i '1d' passwd
shell > git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: passwd
#
no changes added to commit (use "git add" and/or "git commit -a")

 

## 當修改了工作區檔案內容後,使用 git status 指令可以看到這樣的提示( git checkout -- <file> 可以復原工作區檔案的修改 )

 

shell > cat passwd
bin:x:1:1:bin:/bin:/sbin/login
daemon:x:2:2:daemon:/sbin:/sbin/login
adm:x:3:4:adm:/var/adm:/sbin/login
lp:x:4:7:lp:/var/spool/lpd:/sbin/login

shell > git checkout -- passwd

 

## 使用 git checkout 指令復原工作區檔案的改動( 恢復到跟版本庫一樣的狀態,就是剛才所有的修改全部被撤回 )

 

shell > sed -i '1d' passwd
shell > git add passwd
shell > sed -i '1d' passwd
shell > git status
shell > git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: passwd
#
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: passwd
#

 

## 現在是一個什麼情況呢 ?首先刪除了檔案第一行,執行了 git add 指令( 檔案的修改被新增到了暫存區 ),接著又刪除了一次,那麼現在執行 git checkout 指令檔案被恢復成什麼樣 ?

shell > git checkout -- passwd

## 實踐證明:檔案被恢復到了暫存區的狀態,也就是刪除一次的狀態

 

shell > git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: passwd
#

 

## 這是暫存區的狀態,怎麼恢復暫存區的狀態,也就是把第一次的刪除也復原( 注意:這已經 git add 了 )

shell > git reset HEAD passwd
Unstaged changes after reset:
M passwd

## 還記得 git reset 這個指令不,沒錯用來恢復檔案到上個版本的,也可以用來將暫存區的改動回退到工作區

 

shell > git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: passwd
#
no changes added to commit (use "git add" and/or "git commit -a")

 

## 再次檢視狀態,提示工作區有改動,可以使用 git checkout -- <file> 將工作區的改動也復原

## git reset 將檔案回退到上一次版本 / 將暫存區的改動回退到工作區
## git checkout 將工作區的改動復原 / 將工作區的改動回退到暫存區

5、刪除檔案

shell > git rm passwd
rm 'passwd'
shell > git commit -m "delete passwd"
[master 3be8d7a] delete passwd
1 files changed, 0 insertions(+), 5 deletions(-)
delete mode 100644 passwd

## 使用 git rm 指令將版本庫中的檔案刪除,然後提交刪除( 檔案就被刪除了,版本庫目錄下也沒有了 )

 

shell > git log
commit 3be8d7a3ade6f8947135843832bb6cfa075638a4
Author: linuxidc <linux@linuxidc.com>
Date: Wed Jul 22 13:18:23 2015 +0200

delete passwd

commit 4cba14306c482080f442043b33f1dd640352a3f9
Author: linuxidc <linux@linuxidc.com>
Date: Tue Jul 21 19:51:30 2015 +0200

three

commit 6fd5803a3fc2d3039ceaf6fc0b9c4fb8f0dfc67a
Author: linuxidc <linux@linuxidc.com>
Date: Tue Jul 21 19:43:17 2015 +0200

two

commit 7af25e23a89ba16e5ff14a8da305542bc9cc6062
Author: linuxidc <linux@linuxidc.com>
Date: Tue Jul 21 18:54:41 2015 +0200

one

shell > git reset --hard 4cba14
HEAD is now at 4cba143 three

 

## ... 好不容易刪除了,結果又給恢復了 ^_^ ,不要高興太早,如果修改完檔案,沒有提交就刪除了檔案,那麼剛才的修改就真的丟失了..

shell > rm -rf passwd
shell > git reset --hard 4cba14
HEAD is now at 4cba143 three

## 是不是再也不用擔心誤刪除檔案了 ^_^ ( 單機情況下你別物理磁碟爆炸了,那就真的啥也沒有了 )

Git 教學系列文章: 

GitHub 使用教學圖文詳解  http://www.linuxidc.com/Linux/2014-09/106230.htm 

Git 標籤管理詳解 http://www.linuxidc.com/Linux/2014-09/106231.htm 

Git 分支管理詳解 http://www.linuxidc.com/Linux/2014-09/106232.htm 

Git 遠端倉庫詳解 http://www.linuxidc.com/Linux/2014-09/106233.htm 

Git 本地倉庫(Repository)詳解 http://www.linuxidc.com/Linux/2014-09/106234.htm 

Git 伺服器搭建與用戶端安裝  http://www.linuxidc.com/Linux/2014-05/101830.htm 

Git 概述 http://www.linuxidc.com/Linux/2014-05/101829.htm 

分享實用的GitHub 使用教學 http://www.linuxidc.com/Linux/2014-04/100556.htm 

Ubuntu下Git伺服器的搭建與使用指南  http://www.linuxidc.com/Linux/2015-07/120617.htm


IT145.com E-mail:sddin#qq.com