Git基礎(一)

Git基礎

===============================================================================

概述:


===============================================================================

版本控制工具


1.版本控制工具分類

本地版本控制系統

集中式版本控制系統

  • CVS--->SVN

分佈式版本控制系統

  • Git

2.Git介紹

  • Git 是一個開源的分佈式版本控制系統,用於敏捷高效地處理任何或小或大的項目;

  • Git 是 Linus Torvalds 爲了幫助管理 Linux 內核開發而開發的一個開放源碼的版本控制軟件;

  • Git 與常用的版本控制工具 CVS, Subversion 等不同,它採用了分佈式版本庫的方式,不必服務器端軟件支持。

3.Git與SVN的區別

Git 不僅僅是個版本控制系統,它也是個內容管理系統(CMS),工作管理系統等

  1. Git 是分佈式的,SVN 不是:這是 Git 和其它非分佈式的版本控制系統,例如 SVN,CVS 等,最核心的區別;

  2. Git 把內容按元數據方式存儲,而 SVN 是按文件:所有的資源控制系統都是把文件的元信息隱藏在一個類似 .svn、.cvs 等的文件夾裏;

  3. Git 分支和 SVN 的分支不同:分支在 SVN 中一點都不特別,其實它就是版本庫中的另外一個目錄;

  4. Git 沒有一個全局的版本號,而 SVN 有:目前爲止這是跟 SVN 相比 Git 缺少的最大的一個特徵;

  5. Git 的內容完整性要優於 SVN:Git 的內容存儲使用的是 SHA-1 哈希算法。這能確保代碼內容的完整性,確保在遇到磁盤故障和網絡問題時降低對版本庫的破壞。

0D32F290-80B0-4EA4-9836-CA58E22569B3 (1).jpg

Git工作原理及安裝

1.工作流程

一般工作流程如下:

  • 克隆Git資源作爲工作目錄;

  • 在克隆的資源上添加或修改文件;

  • 如果其他人修改了,你可以更新資源;

  • 在提交前查看修改;

  • 提交修改;

  • 在修改完成後如果發現錯誤,可以撤回提交併再次修改提交;

如圖:

git-process.png

1.工作原理

git跟傳統的代碼管理器(如:svn)不同, 主要區別在於git多了個本地倉庫以及緩存區,所以即使無法聯網也一樣能提交代碼

工作區:Workking Directory

  • 即我們創建的工程文件, 在編輯器可直觀顯示;

  • 就是在你電腦裏能看到的目錄;

暫存區:Staging Area

  • 只能通過git GUI或git shell 窗口顯示,提交代碼、解決衝突的中轉站;

  • 英文叫stage, 或index。一般存放在 ".git目錄下" 下的index文件(.git/index)中,所以我們把暫存區有時也叫作索引(index);

版本庫:Repository

工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。

本地版本庫

  • 只能在git shell 窗口顯示,連接本地代碼跟遠程代碼的樞紐,不能聯網時本地代碼可先提交至該處;

遠程版本庫

  • 即保存我們代碼的服務器

如圖

1352126739_7909.jpg

圖中左側爲工作區,右側爲版本庫。在版本庫中標記爲 "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 <file>" 命令時,會直接從暫存區刪除文件,工作區則不做出改變。

當執行 "git checkout ." 或者 "git checkout -- <file>" 命令時,會用暫存區全部或指定的文件替換工作區的文件。這個操作很危險,會清除工作區中未添加到暫存區的改動。

當執行 "git checkout HEAD ." 或者 "git checkout HEAD <file>" 命令時,會用 HEAD 指向的 master 分支中的全部或者部分文件替換暫存區和以及工作區中的文件。這個命令也是極具危險性的,因爲不但會清除工作區中未提交的改動,也會清除暫存區中未提交的改動。

如圖:

211915189723300.jpg

2.Git安裝

Git官方站點

下載地址

Git安裝

  • yum 安裝

  • 源碼編譯安裝

1.yum 安裝

yum安裝比較簡單,但版本相對較老

#安裝
~]# yum install git -y
#查看版本
~]# git --version
git version 1.8.3.1

#卸載
~]#yum remove git

2.源碼編譯安裝

1)依賴關係解決

Git 的工作需要調用 curl,zlib,openssl,expat,libiconv 等庫的代碼,所以需要先安裝這些依賴工具

~]# yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel 
~]# yum install gcc-c++ perl-ExtUtils-MakeMaker

2)下載git源碼並解壓,我這裏下載的爲最新版本2.22.0

~]# wget 
~]# tar xvf git-2.22.0.tar.gz

3)配置編譯安裝

~]#cd git-2.22.0
~]#make prefix=/usr/local/git all
~]#make prefix=/usr/local/git install

4) 配置環境變量

~]#vim /etc/profile
  GITHOME=/usr/local/git
  export PATH=$GITHOME/bin:$PATH
~]#source /etc/profile

5)版本查看

[root@centos7 git-2.22.0]# git --version
git version 2.22.0

3.Git配置

Git 提供了一個叫做 git config 的工具,專門用來配置或讀取相應的工作環境變量。

這些環境變量,決定了 Git 在各個環節的具體工作方式和行爲。這些變量可以存放在以下三個不同的地方:

/etc/gitconfig 文件:(系統)

  • 系統中對所有用戶都普遍適用的配置。若使用 git config 時用 --system 選項,讀寫的就是這個文件。

~/.gitconfig 文件:(全局)

  • 用戶目錄下的配置文件只適用於該用戶。若使用 git config 時用 --global 選項,讀寫的就是這個文件。

當前項目的 Git 目錄中的配置文件(也就是工作目錄中的 REPO/.git/config 文件):

  • 這裏的配置僅僅針對當前項目有效。每一個級別的配置都會覆蓋上層的相同配置,所以 .git/config 裏的配置會覆蓋 /etc/gitconfig 中的同名變量。

注意:

在倉庫提交前至少要給出兩個配置

  • user.name

  • user.email

1)用戶信息

  • 如果用了 --global 選項,那麼更改的配置文件就是位於你用戶主目錄下的那個,以後你所有的項目都會默認使用這裏配置的用戶信息。

  • 如果要在某個特定的項目中使用其他名字或者電郵,只要去掉 --global 選項重新配置即可,新的設定保存在當前項目的 .git/config 文件裏。

[root@centos7 myobject]# git config --global user.name "wztao"
[root@centos7 myobject]# git config --global user.email "[email protected]"

[root@centos7 myobject]# git config -l
user.name=wztao
[email protected]

[root@centos7 myobject]# cat ~/.gitconfig 
[user]
	name = wztao
	email = [email protected]

Git倉庫及對象類型

1.Git倉庫

Git倉庫

  • 索引:暫存

  • 對象庫:版本庫

2.Git創建倉庫

git init

  • Git 使用 git init 命令來初始化一個 Git 倉庫,Git 的很多命令都需要在 Git 的倉庫中運行,所以 git init 是使用 Git 的第一個命令。

  • 在執行完成 git init 命令後,Git 倉庫會生成一個 .git 目錄,該目錄包含了資源的所有元數據,其他的項目目錄保持不變(不像 SVN 會在每個子目錄生成 .svn 目錄,Git 只在倉庫的根目錄生成 .git 目錄)。

  1. 建庫

  • 初始化後,會在 myproject 目錄下會出現一個名爲 .git 的目錄,所有 Git 需要的數據和資源都存放在這個目錄中。

  • 如果當前目錄下有幾個文件想要納入版本控制,需要先用 git add 命令告訴 Git 開始對這些文件進行跟蹤,然後提交:

[root@node1 myproject]# git init
Initialized empty Git repository in /root/myproject/.git/
[root@node1 myproject]# ls -a
.  ..  .git
[root@node1 myproject]# tree .git
.git
├── branches
├── config
├── description
├── HEAD
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── fsmonitor-watchman.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   ├── pre-receive.sample
│   └── update.sample
├── info
│   └── exclude
├── objects
│   ├── info
│   └── pack
└── refs
    ├── heads
    └── tags

9 directories, 15 files

[root@node1 myproject]# cat README
### README ###
[root@node1 myproject]# git add .

#查看狀態
[root@node1 myobject]# git status  
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

	new file:   README
	
[root@node1 myproject]# tree .git
.git
├── branches
├── config
├── description
├── HEAD
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── fsmonitor-watchman.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   ├── pre-receive.sample
│   └── update.sample
├── index
├── info
│   └── exclude
├── objects
│   ├── 49
│   │   └── 6b4a6e48e5c81188a0cf9072097fc0d83da1a1
│   ├── info
│   └── pack
└── refs
    ├── heads
    └── tags

10 directories, 17 files

[root@node1 myproject]# file .git/index 
.git/index: Git index, version 2, 1 entries

2.提交

  • git commit -m "初始化項目版本"

[root@node1 myproject]# git commit -m "v0.0.1"
[master (root-commit) 04231d3] v0.0.1  # master (root-commit)根提交,沒有父提交的提交
 1 file changed, 1 insertion(+)
 create mode 100644 README
 
[root@node1 myproject]# cd .git/objects/
# 分級存放,管理衆多文件
[root@node1 objects]# ll
total 0
drwxr-xr-x 2 root root 51 Jul  9 22:14 04
drwxr-xr-x 2 root root 51 Jul  9 22:04 49
drwxr-xr-x 2 root root 51 Jul  9 22:14 c9
drwxr-xr-x 2 root root  6 Jul  9 21:56 info
drwxr-xr-x 2 root root  6 Jul  9 21:56 pack

[root@node1 objects]# tree
.
├── 04
│   └── 231d3cedeff012a5c35d3886aa50abef3d1b34  #文件名是用哈希碼保留的
├── 49
│   └── 6b4a6e48e5c81188a0cf9072097fc0d83da1a1
├── c9
│   └── 8f8ca72a6d44f934b8bbf59170bae5fe332f5d
├── info
└── pack

3.git克隆,支持網絡方式克隆和本地克隆

  • git clone <repo>   克隆倉庫

  • git clone <repo>  <directory>  克隆倉庫到指定的目錄

參數說明:

  • repo:Git 倉庫。

  • directory:本地目錄。

比如,要克隆 Ruby 語言的 Git 代碼倉庫 Grit,可以用下面的命令:

$ git clone git://github.com/schacon/grit.git

執行該命令後,會在當前目錄下創建一個名爲grit的目錄,其中包含一個 .git 的目錄,用於保存下載下來的所有版本記錄。

如果要自己定義要新建的項目目錄名稱,可以在上面的命令末尾指定新的名字:

$ git clone git://github.com/schacon/grit.git mygrit
[root@node1 ~]# git clone myproject/ New
Cloning into 'New'...
done.
[root@node1 ~]# tree New/
New/
└── README

0 directories, 1 file

[root@node1 New]# cat README 
### README ###

幾種等價的git clone 寫法

git clone http://github.com/CosmosHua/locate new
git clone http://github.com/CosmosHua/locate.git new
git clone git://github.com/CosmosHua/locate new
git clone git://github.com/CosmosHua/locate.git new

3.Git對象類型

塊(blob)對象:

  • 文件的每個版本代表一個塊(blob);

樹(tree)對象:

  • 一個目錄代表一層目錄信息;

提交(commit)對象:

  • 用於保存版本庫一次變化的元數據,包括作者,郵箱,提交日期,日誌;每個提交對象都指定一個目錄樹對象;

標籤(tag)對象:

  • 用於給一個特定對象一個易讀的名字;

對象庫:內容尋址系統

相關命令

  • git ls-files :列出文件;

  • git cat-file :查看文件;

  • git hash-object:計算文件的hash碼

  • git write-tree:根據當前索引中的內容創建數對象;

注意:這些命令使用高級命令(git commit)都可以自動完成

演示:

[root@node1 ~]# mkdir test

[root@node1 test]# git init
Initialized empty Git repository in /root/test/.git/

[root@node1 test]# echo "###Installation##" > INSTALL
[root@node1 test]# mkdir subdir
[root@node1 test]# cd subdir/
[root@node1 subdir]# echo "###SUBDIR##" > 1.txt

[root@node1 subdir]# cd ..
[root@node1 test]# ls
INSTALL  subdir
[root@node1 test]# git add .
[root@node1 test]# 
[root@node1 test]# git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

	new file:   INSTALL
	new file:   subdir/1.txt
	
[root@node1 test]# git ls-files INSTALL
INSTALL
[root@node1 test]# 
[root@node1 test]# git ls-files subdir
subdir/1.txt

[root@node1 test]# tree .git
.git
├── branches
├── config
├── description
├── HEAD
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── fsmonitor-watchman.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   ├── pre-receive.sample
│   └── update.sample
├── index
├── info
│   └── exclude
├── objects
│   ├── a4
│   │   └── ec1ecd97368714ba8b5c8d002b1a24647bb7ec
│   ├── e6
│   │   └── 3e2e8981c3079ef877ad34225762588e279a0e
│   ├── info
│   └── pack
└── refs
    ├── heads
    └── tags

11 directories, 18 files

#指定其文件的唯一標識即可查看文件
[root@node1 test]# git cat-file -p a4ec
###SUBDIR##
[root@node1 test]# git cat-file -p e63e
###Installation##

[root@node1 test]# git ls-files -s
100644 e63e2e8981c3079ef877ad34225762588e279a0e 0	INSTALL
100644 a4ec1ecd97368714ba8b5c8d002b1a24647bb7ec 0	subdir/1.txt

[root@node1 test]# git commit -m "v0.0.1"
[master (root-commit) b0e9cc4] v0.0.1
 2 files changed, 2 insertions(+)
 create mode 100644 INSTALL
 create mode 100644 subdir/1.txt

[root@node1 test]# tree .git/
.git/
├── branches
├── COMMIT_EDITMSG
├── config
├── description
├── HEAD
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── fsmonitor-watchman.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   ├── pre-receive.sample
│   └── update.sample
├── index
├── info
│   └── exclude
├── logs
│   ├── HEAD
│   └── refs
│       └── heads
│           └── master
├── objects
│   ├── 13
│   │   └── d9f149fba80b2ca203e4844fe213af8a832025
│   ├── 51
│   │   └── d0239afa87422de493313aade8c15dae180bed
│   ├── a4
│   │   └── ec1ecd97368714ba8b5c8d002b1a24647bb7ec
│   ├── b0
│   │   └── e9cc432d3adb683963686a2eec197129ef48b8
│   ├── e6
│   │   └── 3e2e8981c3079ef877ad34225762588e279a0e
│   ├── info
│   └── pack
└── refs
    ├── heads
    │   └── master
    └── tags

17 directories, 25 files

[root@node1 test]# git cat-file -t 13d9
tree
[root@node1 test]# git cat-file -t 51d0
tree
[root@node1 test]# git cat-file -t a4ec
blob
[root@node1 test]# git cat-file -t b0e9
commit
[root@node1 test]# git cat-file -t e63e
blob
####################################################################
[root@node1 test]# git cat-file -p 13d9
100644 blob a4ec1ecd97368714ba8b5c8d002b1a24647bb7ec	1.txt
[root@node1 test]# git cat-file -p 51d0
100644 blob e63e2e8981c3079ef877ad34225762588e279a0e	INSTALL
040000 tree 13d9f149fba80b2ca203e4844fe213af8a832025	subdir
[root@node1 test]# git cat-file -p a4ec
###SUBDIR##
[root@node1 test]# git cat-file -p b0e9
tree 51d0239afa87422de493313aade8c15dae180bed
author watao <[email protected]> 1563290798 +0800
committer watao <[email protected]> 1563290798 +0800

v0.0.1
[root@node1 test]# git cat-file -p e63e
###Installation##

[root@node1 test]# git hash-object INSTALL
e63e2e8981c3079ef877ad34225762588e279a0e

Git文件類型

1.3種文件類型

已追蹤的(tracked)

  • 已經在版本庫中,或者已經使用git add  命令添加至索引文件中的文件;

被忽略的(Ignore)

  • 在版本庫中通過"忽略文件列表"明確表明爲被忽略的文件;

未追蹤的(untracked)

  • 在上述兩類之外的其他文件

Git基本操作

Git 的工作就是創建和保存你項目的快照及與之後的快照進行對比。

1.獲取與創建項目命令

git init

  • 用 git init 在目錄中創建新的 Git 倉庫。 你可以在任何時候、任何目錄中這麼做,完全是本地化的。在目錄中執行 git init,就可以創建一個 Git 倉庫了。

git clone

  • git clone [url]    // [url] 爲你想要複製的項目

  • 使用git clone 拷貝一個 Git 倉庫到本地,讓自己能夠查看該項目,或者進行修改。

  • 如果你需要與他人合作一個項目,或者想要複製一個項目,看看代碼,你就可以克隆那個項目。

  • 默認情況下,Git 會按照你提供的 URL 所指示的項目的名稱創建你的本地項目目錄。 通常就是該 URL 最後一個 / 之後的項目名稱。如果你想要一個不一樣的名字, 你可以在該命令後加上你想要的名稱。

2.add/rm/mv命令

git add:暫存文件

  • git add 命令可將該文件添加到緩存(索引);

git ls-files:默認顯示索引中的文件列表的原始文件名;

  • -s : 顯示暫存的文件信息:權限,對象名,暫存號及原始文件名;

  • -o : 顯示未被追蹤的文件;

.gitignore : 添加忽略文件

  • 精確文件名匹配

  • ;空白行會被忽略;

  • "!"可以取反;

  • 可以使用通配符;"/"代表目錄

git rm

git rm : 刪除工作目錄中的文件,及索引中的映射;

git rm --cache : 只刪除索引中的映射

git mv

  • 改變工作目錄中的文件名,及索引中的映射;

演示:

1. git add 和 .gitignore

[root@node1 ~]# mkdir test1
[root@node1 ~]# cd test1
[root@node1 test1]# git init
Initialized empty Git repository in /root/test1/.git/
[root@node1 test1]# ls -a
.  ..  .git
[root@node1 test1]# cp /etc/fstab ./
[root@node1 test1]# cp -r /etc/pam.d/ ./
[root@node1 test1]# ls
fstab  pam.d
[root@node1 test1]# git ls-files -o
fstab
pam.d/atd
pam.d/chfn
pam.d/chsh
pam.d/config-util
pam.d/crond
pam.d/cups
pam.d/fingerprint-auth
pam.d/fingerprint-auth-ac
pam.d/gdm-autologin
pam.d/gdm-fingerprint
pam.d/gdm-launch-environment
pam.d/gdm-password
pam.d/gdm-pin
pam.d/gdm-smartcard
pam.d/kcheckpass
pam.d/kscreensaver
pam.d/liveinst
pam.d/login
pam.d/other
pam.d/passwd
pam.d/password-auth
pam.d/password-auth-ac
pam.d/polkit-1
pam.d/postlogin
pam.d/postlogin-ac
pam.d/ppp
pam.d/remote
pam.d/runuser
pam.d/runuser-l
pam.d/screen
pam.d/setup
pam.d/smartcard-auth
pam.d/smartcard-auth-ac
pam.d/smtp
pam.d/smtp.postfix
pam.d/sshd
pam.d/su
pam.d/su-l
pam.d/sudo
pam.d/sudo-i
pam.d/system-auth
pam.d/system-auth-ac
pam.d/systemd-user
pam.d/vlock
pam.d/xserver
[root@node1 test1]# git ls-files -s
[root@node1 test1]# git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	fstab
	pam.d/

nothing added to commit but untracked files present (use "git add" to track)
[root@node1 test1]# git add .
[root@node1 test1]# 
[root@node1 test1]# 
[root@node1 test1]# git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

	new file:   fstab
	new file:   pam.d/atd
	new file:   pam.d/chfn
	new file:   pam.d/chsh
	new file:   pam.d/config-util
	new file:   pam.d/crond
	new file:   pam.d/cups
	new file:   pam.d/fingerprint-auth
	new file:   pam.d/fingerprint-auth-ac
	new file:   pam.d/gdm-autologin
	new file:   pam.d/gdm-fingerprint
	new file:   pam.d/gdm-launch-environment
	new file:   pam.d/gdm-password
	new file:   pam.d/gdm-pin
	new file:   pam.d/gdm-smartcard
	new file:   pam.d/kcheckpass
	new file:   pam.d/kscreensaver
	new file:   pam.d/liveinst
	new file:   pam.d/login
	new file:   pam.d/other
	new file:   pam.d/passwd
	new file:   pam.d/password-auth
	new file:   pam.d/password-auth-ac
	new file:   pam.d/polkit-1
	new file:   pam.d/postlogin
	new file:   pam.d/postlogin-ac
	new file:   pam.d/ppp
	new file:   pam.d/remote
	new file:   pam.d/runuser
	new file:   pam.d/runuser-l
	new file:   pam.d/screen
	new file:   pam.d/setup
	new file:   pam.d/smartcard-auth
	new file:   pam.d/smartcard-auth-ac
	new file:   pam.d/smtp
	new file:   pam.d/smtp.postfix
	new file:   pam.d/sshd
	new file:   pam.d/su
	new file:   pam.d/su-l
	new file:   pam.d/sudo
	new file:   pam.d/sudo-i
	new file:   pam.d/system-auth
	new file:   pam.d/system-auth-ac
	new file:   pam.d/systemd-user
	new file:   pam.d/vlock
	new file:   pam.d/xserver

[root@node1 test1]# git ls-files -s
100644 bb88662f9df0cd87cfc03f120ac169e2e64269f4 0	fstab
100644 1fd529e8e0fa0819cca0e75b076b73b18e38cc17 0	pam.d/atd
100644 2dbc0aafd083872c9643fbb12e650809bc63e8b6 0	pam.d/chfn
100644 2dbc0aafd083872c9643fbb12e650809bc63e8b6 0	pam.d/chsh
100644 8e70d9aba1dafe593e08f673aac6d03f63d0a428 0	pam.d/config-util
100644 37a69068d3b0525e801cd1c6dae2d48132bfe7ab 0	pam.d/crond
100644 9943b0d4521b8bb0b7b03c405f2486a9a12ed5dc 0	pam.d/cups
120000 d2591789481dcfa49bf0e641736650493b1036da 0	pam.d/fingerprint-auth
100644 162f0bb8b9a3f93ff9f33a27b2a4aec1bc74159c 0	pam.d/fingerprint-auth-ac
100644 0616e66f608b4837ce640f7edb27e61f84108379 0	pam.d/gdm-autologin
100644 c5a35985724c091628ce7916ac119df9485d1fa4 0	pam.d/gdm-fingerprint
100644 a5130ea68741dbc809834d831a65850882b52049 0	pam.d/gdm-launch-environment
100644 3006d0ca59b4e792dc722f8dca6b4ee157072dd0 0	pam.d/gdm-password
100644 7594653252e0257392e9ab01713dd81a5bd1b582 0	pam.d/gdm-pin
100644 c91cf0d155f3f73e0984e9aab1a0099882eba973 0	pam.d/gdm-smartcard
100644 0a37e6e13454b077aa266e2fbe474a9a420ecf5a 0	pam.d/kcheckpass
100644 0a37e6e13454b077aa266e2fbe474a9a420ecf5a 0	pam.d/kscreensaver
100644 c7d67e3321c017444f90acf81cb2601c1a594a15 0	pam.d/liveinst
100644 3c039276ab95ec7efd6c90a806f910e9411a229a 0	pam.d/login
100644 c286c823c3f3f8d53f08d26d14e9b8a367b67067 0	pam.d/other
100644 59c566137dbf39b41d4665e1ec854e99c60f6781 0	pam.d/passwd
120000 30fb53ba3ede3dfc7a42b0e511d80f0ff4445005 0	pam.d/password-auth
100644 0628711e7834fcda66398fcff7536770f30d8848 0	pam.d/password-auth-ac
100644 5728249348b07c5fb1dd39e5c192009e8f12be38 0	pam.d/polkit-1
120000 5b6521cea8e37b3646f58ee81248e3e54f94c800 0	pam.d/postlogin
100644 ef0b053b47f30be032b7af46f822901eae8b9a34 0	pam.d/postlogin-ac
100644 968e252f0b6420a89ed051799864cab4ef7e9e37 0	pam.d/ppp
100644 2f22cc24ca4ae14526a910ae63a00877409f5bb8 0	pam.d/remote
100644 37f0e84e771e30ac5e798dd765561937fd073b81 0	pam.d/runuser
100644 7a9a48c32b372888281f9b5f73e7af410666c02e 0	pam.d/runuser-l
100644 143c3729023dfc366fd8a5ebb7750c405801c528 0	pam.d/screen
100644 5de0bc572ea6f0afdd1f7f0e7aa611fee2d94469 0	pam.d/setup
120000 363f98c1ee0e13e19e3efecc450265ae3e22134d 0	pam.d/smartcard-auth
100644 83b3c901f92d222bab46fa3d59905e90bdf1ffcf 0	pam.d/smartcard-auth-ac
120000 a9efafa111c3886c551ab6339d94d7a71835e701 0	pam.d/smtp
100644 73e5348115f745bd5932974ac6e48c48c2607d21 0	pam.d/smtp.postfix
100644 0f5c0612b373f014a1c3815bde5d3a639ff6c850 0	pam.d/sshd
100644 030657feb99790217696973db7fb81c5610f095b 0	pam.d/su
100644 656a139a8b504fcbf54ecbb2cc5656876ac25831 0	pam.d/su-l
100644 030bb2646328468c7545f5279d15b40332d2a583 0	pam.d/sudo
100644 573b68a22429ac2cdf250866a7494412120fb9dc 0	pam.d/sudo-i
120000 6ce8cd35bec205b9977efb0f920826885b723641 0	pam.d/system-auth
100644 0628711e7834fcda66398fcff7536770f30d8848 0	pam.d/system-auth-ac
100644 8112d746404d8569f5c162276a58aefc89d8285b 0	pam.d/systemd-user
100644 d2d47e5b242329fe94cd0bd49f6af9c90586f470 0	pam.d/vlock
100644 bf799304b6c401e1e92e389c3b95ecc10ed007e2 0	pam.d/xserver
[root@node1 test1]# 
[root@node1 test1]# 
[root@node1 test1]# echo "Hello" > INSTALL
[root@node1 test1]# ls
fstab  INSTALL  pam.d
[root@node1 test1]# git ls-files -o   #顯示未被追蹤的文件
INSTALL

[root@node1 test1]# cat .gitignore   # 添加忽略文件,精確文件名匹配,空白行會被忽略,"!"可以取反;可以使用通配符;"/"代表目錄
1.txt
dir/2.txt
*.jpg

[root@node1 test1]# echo "taotao" > 1.txt
[root@node1 test1]# mkdir dir
[root@node1 test1]# echo "Hi taotao" > dir/2.txt
[root@node1 test1]# ls
1.txt  dir  fstab  INSTALL  pam.d

[root@node1 test1]# git ls-files -o
.gitignore
1.txt
INSTALL
dir/2.txt
[root@node1 test1]# git add .
[root@node1 test1]# git ls-files -o
1.txt
dir/2.txt
[root@node1 test1]# git ls-files
.gitignore
INSTALL
fstab
pam.d/atd
pam.d/chfn
pam.d/chsh
pam.d/config-util
pam.d/crond
pam.d/cups
pam.d/fingerprint-auth
pam.d/fingerprint-auth-ac
pam.d/gdm-autologin
pam.d/gdm-fingerprint
pam.d/gdm-launch-environment
pam.d/gdm-password
pam.d/gdm-pin
pam.d/gdm-smartcard
pam.d/kcheckpass
pam.d/kscreensaver
pam.d/liveinst
pam.d/login
pam.d/other
pam.d/passwd
pam.d/password-auth
pam.d/password-auth-ac
pam.d/polkit-1
pam.d/postlogin
pam.d/postlogin-ac
pam.d/ppp
pam.d/remote
pam.d/runuser
pam.d/runuser-l
pam.d/screen
pam.d/setup
pam.d/smartcard-auth
pam.d/smartcard-auth-ac
pam.d/smtp
pam.d/smtp.postfix
pam.d/sshd
pam.d/su
pam.d/su-l
pam.d/sudo
pam.d/sudo-i
pam.d/system-auth
pam.d/system-auth-ac
pam.d/systemd-user
pam.d/vlock
pam.d/xserver

2. git rm

[root@node1 test1]# git commit -m "v0.0.1"
[master (root-commit) 84ee5b1] v0.0.1
 48 files changed, 413 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 INSTALL
 create mode 100644 fstab
 create mode 100644 pam.d/atd
 create mode 100644 pam.d/chfn
 create mode 100644 pam.d/chsh
 create mode 100644 pam.d/config-util
 create mode 100644 pam.d/crond
 create mode 100644 pam.d/cups
 create mode 120000 pam.d/fingerprint-auth
 create mode 100644 pam.d/fingerprint-auth-ac
 create mode 100644 pam.d/gdm-autologin
 create mode 100644 pam.d/gdm-fingerprint
 create mode 100644 pam.d/gdm-launch-environment
 create mode 100644 pam.d/gdm-password
 create mode 100644 pam.d/gdm-pin
 create mode 100644 pam.d/gdm-smartcard
 create mode 100644 pam.d/kcheckpass
 create mode 100644 pam.d/kscreensaver
 create mode 100644 pam.d/liveinst
 create mode 100644 pam.d/login
 create mode 100644 pam.d/other
 create mode 100644 pam.d/passwd
 create mode 120000 pam.d/password-auth
 create mode 100644 pam.d/password-auth-ac
 create mode 100644 pam.d/polkit-1
 create mode 120000 pam.d/postlogin
 create mode 100644 pam.d/postlogin-ac
 create mode 100644 pam.d/ppp
 create mode 100644 pam.d/remote
 create mode 100644 pam.d/runuser
 create mode 100644 pam.d/runuser-l
 create mode 100644 pam.d/screen
 create mode 100644 pam.d/setup
 create mode 120000 pam.d/smartcard-auth
 create mode 100644 pam.d/smartcard-auth-ac
 create mode 120000 pam.d/smtp
 create mode 100644 pam.d/smtp.postfix
 create mode 100644 pam.d/sshd
 create mode 100644 pam.d/su
 create mode 100644 pam.d/su-l
 create mode 100644 pam.d/sudo
 create mode 100644 pam.d/sudo-i
 create mode 120000 pam.d/system-auth
 create mode 100644 pam.d/system-auth-ac
 create mode 100644 pam.d/systemd-user
 create mode 100644 pam.d/vlock
 create mode 100644 pam.d/xserver
[root@node1 test1]# 
[root@node1 test1]# git status
On branch master
nothing to commit, working tree clean
[root@node1 test1]# 
[root@node1 test1]# git rm pam.d/login
rm 'pam.d/login'

# 可以看到本地和緩存中映射的文件都被刪除
[root@node1 test1]# git ls-files |grep login
pam.d/gdm-autologin
pam.d/postlogin
pam.d/postlogin-ac

[root@node1 test1]# ls pam.d/ |grep login
gdm-autologin
postlogin
postlogin-ac

#只從暫存區域中刪除
[root@node1 test1]# git rm --cache pam.d/setup
rm 'pam.d/setup'
[root@node1 test1]# 
[root@node1 test1]# ls pam.d/ |grep setup  # 工作目錄中還在
setup
[root@node1 test1]# git ls-files |grep setup # 索引映射中被刪除

[root@node1 test1]# git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	deleted:    pam.d/login
	deleted:    pam.d/setup

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	pam.d/setup
	
[root@node1 test1]# git rm pam.d/su
rm 'pam.d/su'

[root@node1 test1]# git cat-file -p 030657feb99790217696973db7fb81c5610f095b
#%PAM-1.0
auth		sufficient	pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth		sufficient	pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
#auth		required	pam_wheel.so use_uid
auth		substack	system-auth
auth		include		postlogin
account		sufficient	pam_succeed_if.so uid = 0 use_uid quiet
account		include		system-auth
password	include		system-auth
session		include		system-auth
session		include		postlogin
session		optional	pam_xauth.so

2. git mv

[root@node1 test1]# ls pam.d/
atd          cups                 gdm-launch-environment  kscreensaver   password-auth-ac  remote     smartcard-auth     sudo            systemd-user
chfn         fingerprint-auth     gdm-password            liveinst       polkit-1          runuser    smartcard-auth-ac  sudo-i          vlock
chsh         fingerprint-auth-ac  gdm-pin                 other          postlogin         runuser-l  smtp               su-l            xserver
config-util  gdm-autologin        gdm-smartcard           passwd         postlogin-ac      screen     smtp.postfix       system-auth
crond        gdm-fingerprint      kcheckpass              password-auth  ppp               setup      sshd               system-auth-ac

[root@node1 test1]# mv pam.d/{chfn,chfn.new}
[root@node1 test1]# ls pam.d/
atd          cups                 gdm-launch-environment  kscreensaver   password-auth-ac  remote     smartcard-auth     sudo            systemd-user
chfn.new     fingerprint-auth     gdm-password            liveinst       polkit-1          runuser    smartcard-auth-ac  sudo-i          vlock
chsh         fingerprint-auth-ac  gdm-pin                 other          postlogin         runuser-l  smtp               su-l            xserver
config-util  gdm-autologin        gdm-smartcard           passwd         postlogin-ac      screen     smtp.postfix       system-auth
crond        gdm-fingerprint      kcheckpass              password-auth  ppp               setup      sshd               system-auth-ac

[root@node1 test1]# git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	deleted:    pam.d/login
	deleted:    pam.d/setup
	deleted:    pam.d/su

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	deleted:    pam.d/chfn

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	pam.d/chfn.new
	pam.d/setup

[root@node1 test1]# git ls-files |grep chfn
pam.d/chfn
[root@node1 test1]# git add .
[root@node1 test1]# git ls-files |grep chfn
pam.d/chfn.new

# 上面的步驟可以直接用 git mv 命令實現
[root@node1 test1]# git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	renamed:    pam.d/chfn -> pam.d/chfn.new
	deleted:    pam.d/login
	deleted:    pam.d/su

[root@node1 test1]# git mv pam.d/cups pam.d/cups.new
[root@node1 test1]# ls pam.d/|grep cups
cups.new
[root@node1 test1]# git ls-files |grep cups
pam.d/cups.new










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章