Git基礎

常見版本管理工具

  • SVN

集中式的版本控制系統,只有一箇中央數據庫,如果中央數據庫掛了或者不可訪問,所有的使用者都無法使用SVN,無法進行提交或備份文件。

  • Git

分佈式的版本控制系統,在每個使用者電腦上就有一個完整的數據倉庫,沒有網絡依然可以使用GIt。爲了習慣團隊協作,會將本地數據同步到Git服務器或GitHub等代碼倉庫。

Git與SVN優缺點

Git

  • 優點
    1.分佈式開發時,可以選擇git clone克隆一個本地版本,然後再本地進行操作提交,本地可以完成一個完整的版本控制。在發佈的時候,使用git push來推送到遠程即可。
    2.git分支的本質是一個指向提交快照的指針,速度快、靈活,分支之間可以任意切換。都可以在本地進行操作可以不同步到遠程。
    3.衝突解決,多人開發就會很容易出現衝突,可以先pull遠程到本地,然後在本地合併一下分支,解決好衝突,再push到遠程即可。
    4.離線工作,如果git服務器出現問題,也可以在本地進行切換分支的操作,等聯網後在提交、合併等操作。

  • 缺點
    1.git沒有嚴格的權限控制,一般是通過系統設置文件的讀寫權限來做權限控制。
    2.工作目錄只能是整個目錄,而SVN可以單獨checkout某個有權限的目錄。
    3.git上手可能沒有SVN順手,需要經過學習。

SVN

  • 優點
    1.集中式管理 ,管理方式在服務端配置好,客戶端只需要同步提交即可,使用方便、操作簡單,很容易就可以上手。
    2.在服務端同一控制好權限,利用代碼的安全管理。
    3.所有的代碼以服務端的爲準,代碼一致性高。

  • 缺點
    1.所有操作都需要通過服務端進行同步,這會導致服務器性能要求比較高。如果服務器宕機了,就無法提交代碼了。
    2.分支管理不靈活,svn分支是一個完整的目錄,且這個目錄擁有完整的實際文件,這些操作都是在服務端進行同步的,不是本地化操作,如果要刪除分支,也是需要將遠程的分支刪除,這會導致大家都得同步。
    3.需要聯網,如果無法連接到SVN服務器,就無法提交自己的代碼,更別說還原、對比等操作了。如果在內網還好,網速比較穩定,同步相對比較快,如果通過外網同步,有可能就需要同步很久。

安裝Git

安裝Git環境準備

[root@root ~]# cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core) 
[root@root ~]# uname -r
3.10.0-327.el7.x86_64
[root@root ~]# getenforce 
Disabled
[root@root ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since 三 2019-07-17 03:01:12 CST; 1s ago
  Process: 1246 ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS (code=exited, status=0/SUCCESS)
 Main PID: 1246 (code=exited, status=0/SUCCESS)

7月 17 02:58:13 root firewalld[1246]: 2019-07-17 02:58:13 ERROR: COMMAND_FAILED: '/sbin/iptables -w2 -t filter -C DOCKE...ain?).
7月 17 02:58:13 root firewalld[1246]: 2019-07-17 02:58:13 ERROR: COMMAND_FAILED: '/sbin/iptables -w2 -t nat -C POSTROUT... name.
7月 17 02:59:13 root firewalld[1246]: 2019-07-17 02:59:13 ERROR: COMMAND_FAILED: '/sbin/iptables -w2 -t nat -C DOCKER -... name.
7月 17 02:59:13 root firewalld[1246]: 2019-07-17 02:59:13 ERROR: COMMAND_FAILED: '/sbin/iptables -w2 -t filter -C DOCKE...ain?).
7月 17 02:59:13 root firewalld[1246]: 2019-07-17 02:59:13 ERROR: COMMAND_FAILED: '/sbin/iptables -w2 -t nat -C POSTROUT... name.
7月 17 03:00:14 root firewalld[1246]: 2019-07-17 03:00:14 ERROR: COMMAND_FAILED: '/sbin/iptables -w2 -t nat -C DOCKER -... name.
7月 17 03:00:14 root firewalld[1246]: 2019-07-17 03:00:14 ERROR: COMMAND_FAILED: '/sbin/iptables -w2 -t filter -C DOCKE...ain?).
7月 17 03:00:14 root firewalld[1246]: 2019-07-17 03:00:14 ERROR: COMMAND_FAILED: '/sbin/iptables -w2 -t nat -C POSTROUT... name.
7月 17 03:01:12 root systemd[1]: Stopping firewalld - dynamic firewall daemon...
7月 17 03:01:12 root systemd[1]: Stopped firewalld - dynamic firewall daemon.
Hint: Some lines were ellipsized, use -l to show in full.

Git安裝與配置

  • 安裝Git
yum install git -y
  • Git全局配置
[root@root ~]# git config  --global user.name "git"   #<< 設置git用戶
[root@root ~]# git config --global user.email "郵箱賬號"  #<< 配置git使用郵箱
[root@root ~]# git config --global color.ui true  #<< 語法高亮

初始化Git工作目錄

[root@root ~]# mkdir /git_data    #<< 創建Git工作目錄
[root@root ~]# cd /git_data/
[root@root git_data]# git init       #<< 初始化工作目錄
初始化空的 Git 版本庫於 /git_data/.git/
[root@root git_data]# git status  #<< 查看工作去狀態
# 位於分支 master
#
# 初始提交
#
無文件要提交(創建/拷貝文件並使用 "git add" 建立跟蹤)
[root@root git_data]#

Git基本操作

創建提交文件操作

  • 創建一個工作文件
[root@root git_data]# touch test
[root@root git_data]# git status
# 位於分支 master
#
# 初始提交
#
# 未跟蹤的文件:
#   (使用 "git add <file>..." 以包含要提交的內容)
#
#       test
提交爲空,但是存在尚未跟蹤的文件(使用 "git add" 建立跟蹤)
  • 將文件提交到暫存區
[root@root git_data]# git add test 
[root@root git_data]# git status   
# 位於分支 master
#
# 初始提交
#
# 要提交的變更:
#   (使用 "git rm --cached <file>..." 撤出暫存區)
#
#       新文件:    test
#
[root@root git_data]#
  • 將暫存區文件提交至Git倉庫
[root@root git_data]# git commit -m 'first test'
[master(根提交) 2d78410] first test
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 test
[root@root git_data]# git status
# 位於分支 master
無文件要提交,乾淨的工作區

"-m"的作用是對提交文件進行描述

Git的刪除操作

  • 刪除本地未提交文件
[root@root git_data]# ll
總用量 0
-rw-r--r-- 1 root root 0 7月  21 17:13 test
[root@root git_data]# 
[root@root git_data]# rm -f test 
[root@root git_data]# ls

直接刪除即可

  • 刪除以提交到暫存區的文件
[root@root git_data]# echo "hello" > test
[root@root git_data]# cat test 
hello
[root@root git_data]# git add test 
[root@root git_data]# git status
# 位於分支 master
# 要提交的變更:
#   (使用 "git reset HEAD <file>..." 撤出暫存區)
#
#       修改:      test
#
[root@root git_data]# git rm --cached test   #<<< 將保存在暫存區的文件進行刪除(不包括本地的文件)
rm 'test'
[root@root git_data]# git status
# 位於分支 master
# 要提交的變更:
#   (使用 "git reset HEAD <file>..." 撤出暫存區)
#
#       刪除:      test
#
# 未跟蹤的文件:
#   (使用 "git add <file>..." 以包含要提交的內容)
#
#       test
[root@root git_data]# cat test 
hello
[root@root git_data]# ls 
test
  • 刪除暫存區文件與本地文件
[root@root git_data]# echo 'hello world' > test
[root@root git_data]# git add test 
[root@root git_data]# git status
# 位於分支 master
# 要提交的變更:
#   (使用 "git reset HEAD <file>..." 撤出暫存區)
#
#       修改:      test
#
[root@root git_data]# ls
test
[root@root git_data]# git rm -f test  #<<< 將本地和暫存區的文件同時刪除
rm 'test'
[root@root git_data]# git status
# 位於分支 master
# 要提交的變更:
#   (使用 "git reset HEAD <file>..." 撤出暫存區)
#
#       刪除:      test
#
[root@root git_data]# ls

重命名暫存區數據

[root@root git_data]# git add test 
[root@root git_data]# git status
# 位於分支 master
無文件要提交,乾淨的工作區
[root@root git_data]# git mv test TEST #<<< 本地的也將會被修改
[root@root git_data]# git status
# 位於分支 master
# 要提交的變更:
#   (使用 "git reset HEAD <file>..." 撤出暫存區)
#
#       重命名:    test -> TEST
#
[root@root git_data]# ll
總用量 0
-rw-r--r-- 1 root root 0 7月  21 17:29 TEST
[root@root git_data]#

Git版本回滾

[root@root git_data]# echo 'first test' >> TESN 
[root@root git_data]# cat TESN 
first test
[root@root git_data]# git add TESN 
[root@root git_data]# git commit -a -m 'my first test'
[master 4e7a71b] my first test
 2 files changed, 1 insertion(+)
 create mode 100644 TESN
 delete mode 100644 test
[root@root git_data]# git log 
commit 4e7a71bf5e0fc02e8563ecc97345ed29c57b227e
Author: git <郵箱賬號>
Date:   Tue Jul 23 17:52:43 2019 +0800

    my first test

commit 2d78410d16394a898a79d51b0b436564cb8bd849
Author: git <郵箱賬號>
Date:   Wed Jul 17 22:47:55 2019 +0800

    first test
[root@root git_data]#
## <<<進行第二次提交
[root@root git_data]# echo 'second test' >> TESN 
[root@root git_data]# cat TESN 
first test
second test
[root@root git_data]# git add TESN 
[root@root git_data]# git commit  -m 'my second test'  
[master 7ece838] my second test
 1 file changed, 1 insertion(+)
[root@root git_data]#
### <<<進行代碼回滾
[root@root git_data]# git log 
<font color='red'>commit 7ece8385cc59339c1a8fc8d7a3c8c1b97a631715</font>
Author: git <@163.com>
Date:   Tue Jul 23 18:00:53 2019 +0800

    my second test

commit 4e7a71bf5e0fc02e8563ecc97345ed29c57b227e
Author: git <@163.com>
Date:   Tue Jul 23 17:52:43 2019 +0800

    my first test
[root@root git_data]#
[root@root git_data]# cat TESN 
first test
second test
[root@root git_data]# git reset --hard 4e7a7
HEAD 現在位於 4e7a71b my first test
[root@root git_data]# cat TESN 
first test

通過commit提交過後生成的加密字符創進行回滾

將回滾後的版本恢復到原先版本

  • 當發現回滾錯誤需要將代碼更新到回滾之前的版本,需要通過git reflog命令完成
[root@root git_data]# cat TESN 
first test
[root@root git_data]# git log         #<<<<此時通過git log命令查不到second test 提交的記錄
commit 4e7a71bf5e0fc02e8563ecc97345ed29c57b227e
Author: git <@163.com>
Date:   Tue Jul 23 17:52:43 2019 +0800

    my first test

commit 2d78410d16394a898a79d51b0b436564cb8bd849
Author: git <[email protected]>
Date:   Wed Jul 17 22:47:55 2019 +0800

    first test
[root@root git_data]# git reflog    #<<<  通過git reflog 命令找到對應的HEAD恢復即可
4e7a71b HEAD@{0}: reset: moving to 4e7a71
7ece838 HEAD@{1}: reset: moving to 7ece838
4e7a71b HEAD@{2}: reset: moving to 4e7a7
7ece838 HEAD@{3}: reset: moving to 7ece838
2d78410 HEAD@{4}: reset: moving to HEAD^
4e7a71b HEAD@{5}: reset: moving to 4e7a7
7ece838 HEAD@{6}: commit: my second test
4e7a71b HEAD@{7}: commit: my first test
2d78410 HEAD@{8}: reset: moving to 2d784
74010b2 HEAD@{9}: commit: first commit
2d78410 HEAD@{10}: commit (initial): first test
[root@root git_data]# git reset --hard 7ece838
HEAD 現在位於 7ece838 my second test
[root@root git_data]# cat TESN 
first test
second test
[root@root git_data]# 

git 標籤的使用

  • git的標籤與’git commit -m’的’-m’類似,只不過標籤可以用於git reset,代替那串"神祕數字"
[root@root git_data]# git tag V1.0
[root@root git_data]# git show V1.0   #<<<<<查看標籤信息
commit 7ece8385cc59339c1a8fc8d7a3c8c1b97a631715
Author: git <@163.com>
Date:   Tue Jul 23 18:00:53 2019 +0800

    my second test

diff --git a/TESN b/TESN
index d9de15a..e37f4be 100644
--- a/TESN
+++ b/TESN
@@ -1 +1,2 @@
 first test
+second test
[root@root git_data]# cat TESN 
first test
second test
[root@root git_data]# git reset --hard 4e7a71
HEAD 現在位於 4e7a71b my first test
[root@root git_data]# cat TESN 
first test
[root@root git_data]# git reset --hard V1.0  #<<<<<通過標籤回滾
HEAD 現在位於 7ece838 my second test
[root@root git_data]# cat TESN 
first test
second test
[root@root git_data]#

git tag 只對當前版本有效,所以需要在做git commit之前打好標記,同時git tag 也可以加"-m"參數與 "git commit -m"一樣作用

git對比文件

[root@root git_data]# cat TESN 
first test
second test
[root@root git_data]# echo "thread test" >> TESN 
[root@root git_data]# cat TESN 
first test
second test
thread test
[root@root git_data]# git diff TESN 
diff --git a/TESN b/TESN
index e37f4be..5887f16 100644
--- a/TESN
+++ b/TESN
@@ -1,2 +1,3 @@
 first test
 second test
+thread test
[root@root git_data]#

git diff的作用就是對比當前文件與修改後的文件,在提交之前使用可查看更改的是否正確

Git分支管理

  • 創建分支
[root@root git_data]# git branch linux   #<<<<創建分支
[root@root git_data]# git branch           #<<<<查看分支
  linux
* master
[root@root git_data]# git checkout linux  #<<<<<切換分支
M       TESN
切換到分支 'linux'
[root@root git_data]# ll
總用量 4
-rw-r--r-- 1 root root 35 7月  26 18:44 TESN
[root@root git_data]# git branch        
* linux
  master
[root@root git_data]#
  • 在分支進行文件修改
[root@root git_data]# git checkout linux
切換到分支 'linux'
[root@root git_data]# ll
總用量 4
-rw-r--r-- 1 root root 23 7月  27 02:19 TESN
[root@root git_data]# cat TESN 
first test
second test
[root@root git_data]# echo 'branch test' >> TESN  #<<<<<對分支文件進行修改
[root@root git_data]# cat TESN 
first test
second test
branch test
[root@root git_data]# git status
# 位於分支 linux
# 尚未暫存以備提交的變更:
#   (使用 "git add <file>..." 更新要提交的內容)
#   (使用 "git checkout -- <file>..." 丟棄工作區的改動)
#
#       修改:      TESN
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@root git_data]# git commit -a -m 'git branch commit'  #<<<<<對分支文件進行提交
[linux ff9fef4] git branch commit
 1 file changed, 1 insertion(+)
[root@root git_data]# git status
# 位於分支 linux
無文件要提交,乾淨的工作區
[root@root git_data]# git checkout master #<<<<<切換到主分支
切換到分支 'master'
[root@root git_data]# cat TESN  #<<<<<查看主分支文件,修改分支文件對主分支的文件並無影響
first test
second test
[root@root git_data]#
  • 合併分支
[root@root git_data]# git checkout master
[root@root git_data]# git merge linux  #<<<<<合併分支
更新 7ece838..ff9fef4
Fast-forward
 TESN | 1 +
 1 file changed, 1 insertion(+)
 [root@root git_data]# git log -1
commit ff9fef4eb3c001677d7ebbe37b610fb73dfe12a0
Author: git <@163.com>
Date:   Sun Jul 28 01:04:20 2019 +0800

    git branch commit
[root@root git_data]# cat TESN   #<<<<<查看主分支文件
first test
second test
branch test
[root@root git_data]#
  • 刪除分支
[root@root git_data]# git branch -d linux
已刪除分支 linux(曾爲 ff9fef4)。
[root@root git_data]# git branch
* master
[root@root git_data]# 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章