Git基礎node
===============================================================================c++
概述:git
===============================================================================github
1.版本控制工具分類
算法
★本地版本控制系統shell
★集中式版本控制系統vim
CVS--->SVN
centos★分佈式版本控制系統緩存
Git
bash
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 哈希算法。這能確保代碼內容的完整性,確保在遇到磁盤故障和網絡問題時下降對版本庫的破壞。
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 https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.22.0.tar.gz ~]# 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 "wangzhangtao@pachiratech.com" [root@centos7 myobject]# git config -l user.name=wztao user.email=wangzhangtao@pachiratech.com [root@centos7 myobject]# cat ~/.gitconfig [user] name = wztao email = wangzhangtao@pachiratech.com
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 <wangzhangtao@pachiratech.com> 1563290798 +0800 committer watao <wangzhangtao@pachiratech.com> 1563290798 +0800 v0.0.1 [root@node1 test]# git cat-file -p e63e ###Installation## [root@node1 test]# git hash-object INSTALL e63e2e8981c3079ef877ad34225762588e279a0e
1.3種文件類型
★已追蹤的(tracked)
已經在版本庫中,或者已經使用git add 命令添加至索引文件中的文件;
★被忽略的(Ignore)
在版本庫中經過"忽略文件列表"明確代表爲被忽略的文件;
★未追蹤的(untracked)
在上述兩類以外的其餘文件
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