git(二):git安装和简单使用
git(二):git安装和简单使用
1 安装和使用
https://blog.csdn.net/w252064/article/details/82691343
1.1 安装
yum 源仓库里的 Git 版本更新不及时,最新版本的 Git 是 1.8.3.1,但是官方最新版本已经到了 2.9.2。想要安装最新版本的的 Git,只能下载源码进行安装。
#依赖库安装 sudo yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel -y sudo yum install gcc perl-ExtUtils-MakeMaker –y #下载 mkdir /home/admin/soft/git cd /home/admin/soft/git wget https://github.com/git/git/archive/v2.9.2.tar.gz tar -xzvf v2.9.2.tar.gz cd git-2.9.2 sudo make prefix=/usr/local/git all sudo make prefix=/usr/local/git install sudo rm -f /usr/bin/git sudo ln -s /usr/local/git/bin/git /usr/bin/git echo export PATH='/usr/local/git/bin:$PATH' | sudo tee -a /etc/profile source /etc/profile git --version
1.2 初始化
git init git config --global user.name "wangxu01" git config --global user.emal "wangxu01@aliyun.com" git config --list #查看初始化配置信息
1.3 git目录
[admin@pe-jira .git]$ ll 总用量 16 drwxrwxr-x 2 admin admin 6 6月 17 15:29 branches -rw-rw-r-- 1 admin admin 92 6月 17 15:29 config -rw-rw-r-- 1 admin admin 73 6月 17 15:29 description -rw-rw-r-- 1 admin admin 23 6月 17 15:29 HEAD drwxrwxr-x 2 admin admin 4096 6月 17 15:29 hooks drwxrwxr-x 2 admin admin 20 6月 17 15:29 info drwxrwxr-x 4 admin admin 28 6月 17 15:29 objects drwxrwxr-x 4 admin admin 29 6月 17 15:29 refs [admin@pe-jira .git]$
branches/ # 新版的Git已经不再使用这个目录,所以大家看到它 #一般会是空的
COMMIT_EDITMSG # 保存着上一次提交时的注释信息
config # 项目的配置信息
description # 项目的描述信息
HEAD # 项目当前在哪个分支的信息
hooks/ # 默认的“hooks” 脚本文件
index # 索引文件,git add 后把要添加的项暂存到这里
info/ # 里面有一个exclude文件,指定本项目要忽略的文件 #,看一下这里
logs/ # 各个refs的历史信息
objects/ # 这个目录非常重要,里面存储都是Git的数据对象
# 包括:提交(commits), 树对象(trees),二进制对象 #(blobs),标签对象(tags)。
#不明白没有关系,后面会讲的。
refs/ # 标识着你的每个分支指向哪个提交(commit)。
1.4 git 文件夹中文件的四种状态
https://www.jianshu.com/p/96beaf505865
- Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过
git add
状态变为Staged
. - Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为
Modified
. 如果使用git rm
移出版本库, 则成为Untracked
文件 - Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过
git add
可进入暂存staged
状态, 使用git checkout
则丢弃修改过, 返回到unmodify
状态, 这个git checkout
即从库中取出文件, 覆盖当前修改 - Staged: 暂存状态. 执行
git commit
则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify
状态. 执行git reset HEAD filename
取消暂存, 文件状态为Modified
1.5 常用命令
git add #添加文件内容至暂存区(索引区) git status #显示状态 git status -s #状态一览 git diff #显示提交之间、提交和工作区之间等的差异 git log #显示提交日志 git reset #回滚,重置当前HEAD到指定状态 git rm #从工作区和索引中删除文件 git rm --cache #从暂存区删除 git mv #移动或重命名一个文件、目录或符号链接,相当于mv git rm git add三个命令 git bisect #通过二分查找定位引入 bug 的变更 git branch #列出、创建或删除分支 git checkout #检出一个分支或路径到工作区 git clone #克隆一个版本库到一个新目录 git commit #记录变更到版本库 git merge #合并两个或更多开发历史 git pull #获取并合并另外的版本库或一个本地分支 git push #更新远程引用和相关的对象 git fetch #从另外一个版本库下载对象和引用 git grep #输出和模式匹配的行 git init #创建一个空的 Git 版本库或重新初始化一个已存在的版本库 git rebase #本地提交转移至更新后的上游分支中 git show #显示各种类型的对象 git tag #创建、列出、删除或校验一个GPG签名的 tag 对象
1.6 基本操作
1.6.1 git add提交文件
[admin@pe-jira git-test]$ git status 位于分支 master 初始提交 未跟踪的文件: (使用 "git add <文件>..." 以包含要提交的内容) index.html 提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪) [admin@pe-jira git-test]$ git add index.html [admin@pe-jira git-test]$ git status 位于分支 master 初始提交 要提交的变更: (使用 "git rm --cached <文件>..." 以取消暂存) 新文件: index.html [admin@pe-jira git-test]$
1.6.2 git rm –cache 暂存区删除
#例如说,我提交到暂存区发现文件有问题,从暂存区删除 [admin@pe-jira git-test]$ git status 位于分支 master 初始提交 要提交的变更: (使用 "git rm --cached <文件>..." 以取消暂存) 新文件: index.html [admin@pe-jira git-test]$ git rm --cached index.html rm 'index.html' [admin@pe-jira git-test]$ git status 位于分支 master 初始提交 未跟踪的文件: (使用 "git add <文件>..." 以包含要提交的内容) index.html 提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪) [admin@pe-jira git-test]$ [admin@pe-jira git-test]$ git add * [admin@pe-jira git-test]$ git status 位于分支 master 要提交的变更: (使用 "git reset HEAD <文件>..." 以取消暂存) 新文件: 123 新文件: pay.html [admin@pe-jira git-test]$ git rm --cache pay.html rm 'pay.html' [admin@pe-jira git-test]$ git status 位于分支 master 要提交的变更: (使用 "git reset HEAD <文件>..." 以取消暂存) 新文件: 123 未跟踪的文件: (使用 "git add <文件>..." 以包含要提交的内容) pay.html [admin@pe-jira git-test]$
1.6.3 git commit提交数据
[admin@pe-jira git-test]$ git add index.html [admin@pe-jira git-test]$ git status 位于分支 master 初始提交 要提交的变更: (使用 "git rm --cached <文件>..." 以取消暂存) 新文件: index.html [admin@pe-jira git-test]$ git commit -m "1111" [master(根提交) a28c2d6] 1111 1 file changed, 1 insertion(+) create mode 100644 index.html [admin@pe-jira git-test]$ git status 位于分支 master nothing to commit, working tree clean [admin@pe-jira git-test]$
1.6.4 git log查看日志
[admin@pe-jira git-test]$ git log commit a28c2d6a77895a9359fb8be4c205981a79b3f068 Author: wangxu01 <wangxu01@aliyun.com> Date: Mon Jun 17 16:32:15 2019 +0800 1111 [admin@pe-jira git-test]$
git 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(后跟指定格式)。
选项 说明
%H 提交对象(commit)的完整哈希字串
%h 提交对象的简短哈希字串
%T 树对象(tree)的完整哈希字串
%t 树对象的简短哈希字串
%P 父对象(parent)的完整哈希字串
%p 父对象的简短哈希字串
%an 作者(author)的名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 -date= 选项定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者(committer)的名字
%ce 提交者的电子邮件地址
%cd 提交日期
%cr 提交日期,按多久以前的方式显示
%s 提交说明
[admin@pe-jira git-test]$ git log --pretty=oneline #将每个提交 放在一行显示 a39f4b365bca6892079f9bf5692fd74a43a3394b pay a28c2d6a77895a9359fb8be4c205981a79b3f068 1111 [admin@pe-jira git-test]$ [admin@pe-jira git-test]$ git log --pretty=full #相当于git log commit a39f4b365bca6892079f9bf5692fd74a43a3394b Author: wangxu01 <wangxu01@aliyun.com> Commit: wangxu01 <wangxu01@aliyun.com> pay commit a28c2d6a77895a9359fb8be4c205981a79b3f068 Author: wangxu01 <wangxu01@aliyun.com> Commit: wangxu01 <wangxu01@aliyun.com> 1111 [admin@pe-jira git-test]$ git log --pretty=fuller #详细信息 commit a39f4b365bca6892079f9bf5692fd74a43a3394b Author: wangxu01 <wangxu01@aliyun.com> AuthorDate: Mon Jun 17 16:40:55 2019 +0800 Commit: wangxu01 <wangxu01@aliyun.com> CommitDate: Mon Jun 17 16:40:55 2019 +0800 pay commit a28c2d6a77895a9359fb8be4c205981a79b3f068 Author: wangxu01 <wangxu01@aliyun.com> AuthorDate: Mon Jun 17 16:32:15 2019 +0800 Commit: wangxu01 <wangxu01@aliyun.com> CommitDate: Mon Jun 17 16:32:15 2019 +0800 1111 [admin@pe-jira git-test]$ [admin@pe-jira git-test]$ git log --pretty=format:"%h - %an, %ar : %s" #时间形式简要输出 a39f4b3 - wangxu01, 7 分钟前 : pay a28c2d6 - wangxu01, 15 分钟前 : 1111 [admin@pe-jira git-test]$ [admin@pe-jira git-test]$ git log --stat -2 #简要显示增减行数,能够看到提交中修改过的内容,对文件增加或移动的行数,并在最后列出所以增减行的敢要信息。 commit a39f4b365bca6892079f9bf5692fd74a43a3394b Author: wangxu01 <wangxu01@aliyun.com> Date: Mon Jun 17 16:40:55 2019 +0800 pay 123 | 0 1 file changed, 0 insertions(+), 0 deletions(-) commit a28c2d6a77895a9359fb8be4c205981a79b3f068 Author: wangxu01 <wangxu01@aliyun.com> Date: Mon Jun 17 16:32:15 2019 +0800 1111 index.html | 1 + 1 file changed, 1 insertion(+) [admin@pe-jira git-test]$
1.6.5 还原数据
1.6.5.1 撤销本地修改 git checkout file
#未提交git的 [admin@pe-jira git-test]$ echo '123' >> 123 [admin@pe-jira git-test]$ ls 123 index.html pay.html [admin@pe-jira git-test]$ git status 位于分支 master 尚未暂存以备提交的变更: (使用 "git add <文件>..." 更新要提交的内容) (使用 "git checkout -- <文件>..." 丢弃工作区的改动) 修改: 123 修改尚未加入提交(使用 "git add" 和/或 "git commit -a") [admin@pe-jira git-test]$ git checkout -- 123 [admin@pe-jira git-test]$ git status 位于分支 master nothing to commit, working tree clean [admin@pe-jira git-test]$
1.6.5.2 撤销提交修改git reset
https://www.cnblogs.com/ldq2016/p/5752123.html
git服务程序中有一个叫做HEAD的版本指针,当用户申请还原数据时,其实就是将HEAD指针指向到某个特定的提交版本,但是因为Git是分布式版本控制系统,为了避免历史记录冲突,故使用了SHA-1计算出十六进制的哈希字串来区分每个提交版本,另外默认的HEAD版本指针会指向到最近的一次提交版本记录,而上一个提交版本会叫HEAD^,上上一个版本则会叫做HEAD^^,当然一般会用HEAD~5来表示往上数第五个提交版本。也可以根据commit ID来回退到指定版本
reset命令有3种方式:
1:git reset –mixed:此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息
2:git reset –soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可
3:git reset –hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容
#回退所有内容到上一个版本 git reset HEAD^ #回退a.py这个文件的版本到上一个版本 git reset HEAD^ a.py #向前回退到第3个版本 git reset –soft HEAD~3 #将本地的状态回退到和远程的一样 git reset –hard origin/master #回退到某个版本 git reset 057d #回退到上一次提交的状态,按照某一次的commit完全反向的进行一次commit
#例如我把文件回滚到上上个版本 [admin@pe-jira git-test]$ echo '123' >> 123 [admin@pe-jira git-test]$ git commit -m '修改123文件' 位于分支 master 尚未暂存以备提交的变更: (使用 "git add <文件>..." 更新要提交的内容) (使用 "git checkout -- <文件>..." 丢弃工作区的改动) 修改: 123 修改尚未加入提交(使用 "git add" 和/或 "git commit -a") [admin@pe-jira git-test]$ git add 123 [admin@pe-jira git-test]$ git commit -m '修改123文件' [master ad14308] 修改123文件 1 file changed, 1 insertion(+) [admin@pe-jira git-test]$ git log --pretty=oneline ad14308b0030ab9b5a28b5629abd0bb1bdaea537 修改123文件 097f85f3af602919b8cc526387d8b2e9e4cd5781 pay.html a39f4b365bca6892079f9bf5692fd74a43a3394b pay a28c2d6a77895a9359fb8be4c205981a79b3f068 1111 [admin@pe-jira git-test]$ echo "456" >> 123 [admin@pe-jira git-test]$ git add 123 [admin@pe-jira git-test]$ git commit -m '修改123文件添加456' [master 8c0da95] 修改123文件添加456 1 file changed, 1 insertion(+) [admin@pe-jira git-test]$ git log --pretty=oneline | grep 123 8c0da95e7230b61a0cdb74c1d56d9e034025ae56 修改123文件添加456 ad14308b0030ab9b5a28b5629abd0bb1bdaea537 修改123文件 [admin@pe-jira git-test]$ cat 123 123 456 [admin@pe-jira git-test]$ git reset --hard HEAD^^ HEAD 现在位于 097f85f pay.html [admin@pe-jira git-test]$ git status 位于分支 master nothing to commit, working tree clean [admin@pe-jira git-test]$ cat 123 [admin@pe-jira git-test]$ git log --pretty=oneline 097f85f3af602919b8cc526387d8b2e9e4cd5781 pay.html a39f4b365bca6892079f9bf5692fd74a43a3394b pay a28c2d6a77895a9359fb8be4c205981a79b3f068 1111 [admin@pe-jira git-test]$
根据commit ID回到指定历史版本,参考下文git reflog
1.6.6 git reflog 历史操作记录,配合git reset
可以查看所有分支的所有操作记录(包括(包括commit和reset的操作),包括已经被删除的commit记录,git log则不能察看已经删除了的commit记录
[admin@pe-jira git-test]$ cat 123 123 456 [admin@pe-jira git-test]$ echo 'ssss' >> 123 [admin@pe-jira git-test]$ git add 123 (reverse-i-search)`c': e^Co 'ssss' >> 123 [admin@pe-jira git-test]$ git commit -m 'add ssss' [master afb2318] add ssss 1 file changed, 1 insertion(+) [admin@pe-jira git-test]$ git log --pretty=oneline afb231865535efef57be61970c441c83502909b0 add ssss 8c0da95e7230b61a0cdb74c1d56d9e034025ae56 修改123文件添加456 ad14308b0030ab9b5a28b5629abd0bb1bdaea537 修改123文件 097f85f3af602919b8cc526387d8b2e9e4cd5781 pay.html a39f4b365bca6892079f9bf5692fd74a43a3394b pay a28c2d6a77895a9359fb8be4c205981a79b3f068 1111 [admin@pe-jira git-test]$ git reflog afb2318 HEAD@{0}: commit: add ssss 8c0da95 HEAD@{1}: reset: moving to 8c0da95 a39f4b3 HEAD@{2}: reset: moving to a39f4b36 a9f0b03 HEAD@{3}: commit: 删除123 cddd358 HEAD@{4}: commit: 修改123文件添加lalal 8c0da95 HEAD@{5}: reset: moving to 8c0da95 9560ced HEAD@{6}: commit: 修改123文件再次添加123 097f85f HEAD@{7}: reset: moving to HEAD^^ 8c0da95 HEAD@{8}: commit: 修改123文件添加456 ad14308 HEAD@{9}: commit: 修改123文件 097f85f HEAD@{10}: commit: pay.html a39f4b3 HEAD@{11}: commit: pay a28c2d6 HEAD@{12}: commit (initial): 1111 [admin@pe-jira git-test]$ git reset --hard cddd358 HEAD 现在位于 cddd358 修改123文件添加lalal [admin@pe-jira git-test]$ cat ^C [admin@pe-jira git-test]$ git status 位于分支 master nothing to commit, working tree clean [admin@pe-jira git-test]$ cat 123 123 456 lalalal [admin@pe-jira git-test]$