git 基本:(Git 保存的不是文件的变化或者差异,而是一系列不同时刻的文件快照.)
环境配置:
yum install git -y
# 环境配置文件目录
# 1、/etc/gitconfig // --system
# 2、~/.gitconfig或~/.gitconfig // --global
# 3、git仓库目录下.git/config
git config --global user.name neo
git config --global user.email neo@test.com
git config --global core.ui true
git config --global core.editor vim
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'
git config --global pull.rebase true
git config --list
配置存放在.git/config配置文件中,也可以直接修改此文件
git仓库有两类:
裸仓库:不存在工作区,主要用于服务器进行数据交换
本地仓库:代码文件工作的区域
[root@elk-node2 project]# git init --bare test1 //裸仓库
Initialized empty Git repository in /data/project/test1/
[root@elk-node2 project]# ls -al test1
drwxr-xr-x 2 root root 6 Mar 7 03:11 branches
-rw-r--r-- 1 root root 66 Mar 7 03:11 config
-rw-r--r-- 1 root root 73 Mar 7 03:11 description
-rw-r--r-- 1 root root 23 Mar 7 03:11 HEAD
drwxr-xr-x 2 root root 4096 Mar 7 03:11 hooks
drwxr-xr-x 2 root root 20 Mar 7 03:11 info
drwxr-xr-x 4 root root 28 Mar 7 03:11 objects
drwxr-xr-x 4 root root 29 Mar 7 03:11 refs
[root@elk-node2 project]# git init test2 //本地仓库(俗话)
Initialized empty Git repository in /data/project/test2/.git/
[root@elk-node2 project]# ls -al test2
drwxr-xr-x 7 root root 111 Mar 7 03:12 .git
文件状态:已跟踪和未跟踪(在仓库有没有此文件的记录,有表示已跟踪)
git命令:
Getting and Creating Projects
init //初始化仓库
# git init //将当前目录初始化成为项目仓库目录,会生成.git的目录,存放数据库和配置等信息
clone //克隆远程仓库,
# git clone [urls] [NEWNAME] //先初始.git文件目录,在从远程服务器取下所有数据放入到.git,然后读取最新版本的文件的拷贝,[newname] 本地取和新名字
# urls支持多种协议:git ,ssh ,https ,path ,ftp ,rsync等
# 会自动设置本地 master 分支跟踪克隆的远程仓库的 master 分支
Basic Snapshotting
add //添加跟踪已修改或者未跟踪文件到暂存区。
status //检查工作区文件状态
# git status --short(git status -s) //状态简览
[root@elk-node2 test2]# git status -s //M有两个位置
M file1 //文件修改了,并且添加到了暂存区
M file2 //文件修改了,还未添加到暂存区
A file3 //新添加到暂存区
?? file4 //??表示新添加,未被跟踪
MM file5 //文件修改了,放到暂存区之后,接着又修改了
# =====忽略文件=====
# 总有些文件不想被git一直跟踪,因为不需要提交到git仓库.gitignore 配置文件定义
# https://github.com/github/gitignore
# .gitignore格式规范
# • 所有空行或者以 # 开头的行都会被 Git 忽略。
# • 可以使用标准的 glob 模式匹配。
# • 匹配模式可以以(/)开头防止递归。
# • 匹配模式可以以(/)结尾指定目录。
# • 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
# cat .gitignore
# *.[oa] //忽略所有以.a或.o文件
# !lib.a //除了lib.a文件,其他文件都忽略跟踪
# /TUDO //忽略当前目录下的TUDO文件,/表示防止递归其他目录下的TUDO文件也被忽略
# build/ //忽略build目录下所有文件,/表示指目录
# doc/*.txt //忽略doc目录下所有以.txt结尾的文件,无递归
# doc/**/*.pdf //忽略doc目录所有以.pdf结尾的文件,包含递归
# =====
diff //比较文件前后的区别(针对暂存区来说,比如说一个文件修改,并添加到暂存区这个时候需要用diff staged关键字,此时在去修改文件,用diff staged查看不到内容,可以用diff)
# git diff // 比较工作区与仓库提交区的文件区别
# git diff (--staged | --cached) //比较当前文件与暂存区快照的区别
# git difftool //图形界面。
commit //将暂存区快照信息提交的到仓库
# git commit // 调用你设置的editor编写注释,然后并提交
# git commit -m "STRING" //直接添加注释并提价
# git commit -a // 把已跟踪的文件暂存起来一并提交,(未被跟踪的不会)
# git commit --amend //将此次提交与上次提交合并,只显示一次提交(log中只看到一次提交,在reflog中显示全部提交并且有amend字样显示)
reset //撤销添加到暂存区的文件
# git reset HARD <file>
rm //删除文件
# git rm // 删除本地文件与暂存区的快照记录,接着提交,就把仓库的跟踪记录一并删除
# git rm -f //当文件修改提交到暂存区,需要-f强制删除
# git rm --cached //删除仓库当作的文件与跟踪记录,本地保留
# git rm log/\*.log //glob模式
mv //更改文件名字
# git mv oldnam newname
# //相当于工作区重命名文件,接着删除文件,接着添加到新名字的文件到暂存区
stash //保存进度
Branching and Merging
变基与合并使用:总的原则是,只对尚未推送或分享给别人的本地修改执行变基操作清理历史,从不对已推送至别处的提交执行变
基操作,这样,你才能享受到两种方式带来的便利。
branch // 创建分支
# git branch dev //创建名为dev的分支
# git branch -d test //删除名为test的分支 ,没有合并的分支不能删除,但可以是用-D强制删除
# git branch --merged //显示已经合并的分支
# git branch --no-merged //显示未合并的分支
checkout
# git checkout -- <file>
# git checkout <branch> //切换分支
merge //合并分支
# git merge dev //合并dev分支到当前分支
log
tag //特定版本打标签
# git tag //版本名称顺序不重要
# git tag -a 标签 -m "注释"
# git show 标签 查看标签信息
# git tag -a 标签 ID //对过去ID这个提交版本大标签
# git push [remote-name] [tagname] //推送标签到远程服务器
# git push [remote-name] tags //推送服务器没有的所有标签
rebase 变基,命令将提交到某一分支上的所有修改都移至另一分支上,就好像“重新播放”一样。
# git checkout dev //切换到dev分支
# git rebase master //将目前所处在的分支(dev)修改的内容变基到master分支
# First, rewinding head to replay your work on top of it...
# Applying: add ts5
# Sharing and Updating Projects
# 例子:
# git rebase --onto master server client
# “取出 client 分支,找出处于 client 分支和 server 分支的共同祖先之后的修改,然后把它们在 master 分支上重演一遍”
remote //查看远程仓库
# git remote -v //列出远程仓库简息
# git remote add <shortname> <url> //添加远程仓库
# git remote show [remote-name]
# git remote rename oldname newname //重命名远程仓库
fetch //从远程仓库拉取数据
# git fetch [remote-name] //从远程仓库拉取本地没有的数据,并不会自动合并
pull //远程仓库拉取数据
# git pull //通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支
push //上传数据到远程仓库
# git push [remote-name] [branchname] //推送数据时,先拉取,否则线上版本高,会导致推送不成功
Inspection and Comparison
log //查看提交日志
-p 按补丁格式显示每个更新之间的差异。
--stat 显示每次更新的文件修改统计信息。
--shortstat 只显示 --stat 中最后的行数修改添加移除统计。
--name-only 仅在提交信息后显示已修改的文件清单。
--name-status 显示新增、修改、删除的文件清单。
--abbrev-commit 仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。
--relative-date 使用较短的相对时间显示(比如,“2 weeks ago”)。
--graph 显示 ASCII 图形表示的分支合并历史。
--pretty 使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和
format(后跟指定格式)。
# git log -p //查看每次提交的内容差异
# git log -p -2 //查看最近两次提交的内容差异
# git log -p -2 --stat //粗略统计信息
# git log --pretty=oneline ,short , full ,fuller, //简略一行显示
# git log --pretty=oneline --graph //图形显示分支合并历史
# git log --pretty=format:"%h - %an , %ar : %s"
# format格式输出:
%H 提交对象(commit)的完整哈希字串
%h 提交对象的简短哈希字串
%T 树对象(tree)的完整哈希字串
%t 树对象的简短哈希字串
%P 父对象(parent)的完整哈希字串
%p 父对象的简短哈希字串
%an 作者(author)的名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 --date= 选项定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者(committer)的名字
%ce 提交者的电子邮件地址
%cd 提交日期
%cr 提交日期,按多久以前的方式显示
%s 提交说明
# git log 输出选项
-(n) 仅显示最近的 n 条提交
--since, --after 仅显示指定时间之后的提交。
--until, --before 仅显示指定时间之前的提交。
--author 仅显示指定作者相关的提交。
--committer 仅显示指定提交者相关的提交。
--grep 仅显示含指定关键字的提交
-S 仅显示添加或移除了某个关键字的提交
# 例子,如果要查看 Git 仓库中,2008 年 10 月期间,Junio Hamano 提交的但未合并的测试文
件,可以用下面的查询命令:
# git log --pretty="%h - %s" --author=gitster --since="2008-10-01" --before="2008-11-01" --no-merges -- t/
# git log --oneline --decorate //查看各个分支当前所指的对象
diff
git 开发部署,自动化部署
http://blog.csdn.net/richard_jason/article/details/53188200
setfacl -R -m u:test:rwx /xxx/
setfacl -R -d --set u:test:rwx /xxx/ #