Git基礎
===============================================================================
概述:
===============================================================================
版本控制工具
1.版本控制工具分類
★本地版本控制系統
★集中式版本控制系統
CVS--->SVN
★分佈式版本控制系統
Git
2.Git介紹
Git 是一個開源的分佈式版本控制系統,用於敏捷高效地處理任何或小或大的項目;
Git 是 Linus Torvalds 爲了幫助管理 Linux 內核開發而開發的一個開放源碼的版本控制軟件;
Git 與常用的版本控制工具 CVS, Subversion 等不同,它採用了分佈式版本庫的方式,不必服務器端軟件支持。
3.Git與SVN的區別
Git 不僅僅是個版本控制系統,它也是個內容管理系統(CMS),工作管理系統等
Git 是分佈式的,SVN 不是:這是 Git 和其它非分佈式的版本控制系統,例如 SVN,CVS 等,最核心的區別;
Git 把內容按元數據方式存儲,而 SVN 是按文件:所有的資源控制系統都是把文件的元信息隱藏在一個類似 .svn、.cvs 等的文件夾裏;
Git 分支和 SVN 的分支不同:分支在 SVN 中一點都不特別,其實它就是版本庫中的另外一個目錄;
Git 沒有一個全局的版本號,而 SVN 有:目前爲止這是跟 SVN 相比 Git 缺少的最大的一個特徵;
Git 的內容完整性要優於 SVN:Git 的內容存儲使用的是 SHA-1 哈希算法。這能確保代碼內容的完整性,確保在遇到磁盤故障和網絡問題時降低對版本庫的破壞。
Git工作原理及安裝
1.工作流程
一般工作流程如下:
克隆Git資源作爲工作目錄;
在克隆的資源上添加或修改文件;
如果其他人修改了,你可以更新資源;
在提交前查看修改;
提交修改;
在修改完成後如果發現錯誤,可以撤回提交併再次修改提交;
如圖:
1.工作原理
git跟傳統的代碼管理器(如:svn)不同, 主要區別在於git多了個本地倉庫以及緩存區,所以即使無法聯網也一樣能提交代碼
★工作區:Workking Directory
即我們創建的工程文件, 在編輯器可直觀顯示;
就是在你電腦裏能看到的目錄;
★暫存區:Staging Area
只能通過git GUI或git shell 窗口顯示,提交代碼、解決衝突的中轉站;
英文叫stage, 或index。一般存放在 ".git目錄下" 下的index文件(.git/index)中,所以我們把暫存區有時也叫作索引(index);
★版本庫:Repository
工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。
☉本地版本庫
只能在git shell 窗口顯示,連接本地代碼跟遠程代碼的樞紐,不能聯網時本地代碼可先提交至該處;
☉遠程版本庫
即保存我們代碼的服務器
如圖
圖中左側爲工作區,右側爲版本庫。在版本庫中標記爲 "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 分支中的全部或者部分文件替換暫存區和以及工作區中的文件。這個命令也是極具危險性的,因爲不但會清除工作區中未提交的改動,也會清除暫存區中未提交的改動。
如圖:
2.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 目錄)。
建庫
初始化後,會在 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