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