Git基础(一)

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),工做管理系统等

  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 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

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 <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

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
相关文章
相关标签/搜索