前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Git基础知识(二)

Git基础知识(二)

作者头像
zx钟
发布2019-07-19 14:27:57
7120
发布2019-07-19 14:27:57
举报
文章被收录于专栏:测试游记测试游记

Git基础知识(二)

文件状态

git status和git status -s

git status命令的输出十分详细,但其用语有些繁琐。

可以使用 git status -s 命令或 git status --short 命令,得到一种更为紧凑的格式输出。

输出如下:

代码语言:javascript
复制
M README 
MM Rakefile 
A lib/git.rb 
M lib/simplegit.rb 
?? LICENSE.txt

??:新添加的未跟踪文件前面有 ?? 标记,

A:新添加到暂存区中的文件前面有 A 标记,

M:修改过的文件前面有 M 标记。

MM:右边的 M 表示该文件被修改了但是还没放入暂存区,左边的 M 表示文件被修改了并放入了暂存区

  • README 文件在工作区被修改了但是还没有将修改后的文件放入暂存区
  • lib/simplegit.rb 文件被修改了并将修改后的文件放入了暂存区。
  • Rakefile 在工作区被修改并提交到暂存区后在工作区中被修改了,所以在暂存区和工作区都有该文件被修改了的记录。

忽略文件

对一些无需使用Git管理的文件,可以使用.gitignore来进行管理

  • 所有空行或者以 # 开头的行都会被 Git 忽略。
  • 可以使用标准的 glob 模式匹配。( glob 模式是指 shell 所使用的简化了的正则表达式。 )
  • 匹配模式可以以(/)开头防止递归。
  • 匹配模式可以以(/)结尾指定目录。
  • 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。

*匹配零个或多个任意字符; [abc] 匹配任何一个列在方括号中的字符([abc]就是要么匹配一个 a,要么匹配一个 b,要么匹配一个 c); ?匹配一个任意字符; [字符-字符]方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配 ( [0-9] 表示匹配所有 0 到 9 的数字); ** 表示匹配任意中间目录,比如a/**/z 可以匹配 a/z, a/b/z 或 a/b/c/z等。

代码语言:javascript
复制
# 以a为后缀的文件
*.a

# 排除lib.a(因为上面忽略了全部.a后缀的的内容)
!lib.a

# 忽略当前路径下的TODO文件(注意是当前路径,不会递归查找)
/TODO

# 忽略build文件夹下的全部文件(注意是全项目路径,会递归查找)
build/

# 获取doc文件夹下的全部以txt为后缀的文件
doc/*.txt

# 忽略doc文件夹里面的全部pdf文件(不管doc文件夹下有几个文件夹,文件夹里面的pdf都会被忽略)
doc/**/*.pdf

GitHub 有一个十分详细的针对数十种项目及语言的 .gitignore 文件列表,可以在 https://github.com/github/gitignore 找到它.

我们新建一个.gitignore文件,并且输入 *.txt,把它commit到git仓库管理。

然后我们新建一个txt文件并用add添加它

忽略txt

查看已暂存和未暂存的修改

我们新建一个文件1.py并把它提交至本地仓库,然后我们修改它,再使用git status查看

修改文件

git会提示你,1.py文件被修改了,但是我们并不能看到它修改了什么

这时候使用git diff就可以看到具体的修改了

查看修改

此命令比较的是工作目录中当前文件(b/1.py)和暂存区域快照(a/1.py)之间的差异。可以看到绿色部分+print("学习Git")也就是修改之后还没有暂存起来的变化内容。当然很多编辑器中都集成了文件对比。

以Pycharm为例,文件一行中新增内容,当前行之前会多一个绿色的小块

文件差异

已存在的内容修改,当前行之前会多一个蓝色的小块,点击可以看到修改前的内容

修改存在的内容

也可以使用Compare with the Same Repository Version来查看变更

Compare with the Same Repository Version的位置

Compare with the Same Repository Version

跳过暂存区

暂存区是一个很好的设计,但是每次对修改的提交都需要再加一遍暂存区就有点繁琐了。

可以使用git commit -a -m '描述信息'来跳过文件修改时候的添加暂存区

跳过暂存区

移动文件

在Linux中一般移动和重命名都是使用的mv操作,Git是Linux的创建者Linus写的,所以它也是用mv来完成这个操作。

我们新建一个文件夹后把1.py移动到这个文件夹之下git mv 1.py test/1.py使用git status可以看出它告诉我们,我们重命名了一个文件

改变文件位置

我们再把1.py从test中拿回来,再改名为2.py使用git status可以看出它告诉我们,我们重命名了一个文件并且它是从1.py重命名过去的,也就是git是使用的最开始的记录进行对比变更的。

重命名

根据之前的学习,如果要实现重命名文件需要执行以下操作:

代码语言:javascript
复制
mv 1.py 2.py
git rm 1.py
git add 2.py

所以git mv相当于执行了三句命令

git log

使用git log可以看到提交的历史

查看历史

它有几个拓展的命令

-<num>:查看最近的提交

git log -2查看最近两次的提交

查看最近两次的提交

git log --stat

可以查看每次提交的下面列出所有被修改过的文件、有多少文件被修改了以及被修改过 的文件的哪些行被移除或是添加了,在每次提交的最后还有一个总结。

image-20190331104406273

git log --pretty=XXXXX

pretty支持多种格式:onelineshortfullfullerformat

oneline

short

full

fuller

format可以让内容按照格式输出

例如:git log --pretty=format:"%h - %an, %ar : %s"

格式化输出

选项

说明

%H

提交对象的完整哈希字串

%h

提交对象的简单哈希字串

%T

树对象的完整哈希字串

%t

树对象的简单哈希字串

%P

父对象的完整哈希字串

%p

父对象的**简单哈希字串

%an

作者名字

%ae

作者邮箱

%ad

作者修订日期

%ar

修订日期,多久以前

%cn

提交者姓名

%ce

提交者邮箱

%cd

提交日期

%cr

提交日期,多久以前

%s

提交说明

  • 作者指的是实际作出修改的人。
  • 提交者指的是最后将此工作成果提交到仓库的人。

在使用GitHub/Gitlab等Git管理服务器进行协作的时候,一般都需要通过审核才能将代码合入,所以作者和提交者(合入者)很有可能不是一个人。

git log的常用选项

选项

说明

-p

按补丁格式显示每个更新之间的差异

—stat

显示每次更新的文件修改信息

—shortstat

显示—stat中最后的行数修改添加移除的统计

—name-only

仅在提交信息后显示已修改的文件清单

--name-status

显示新增/修改/删除的文件清单

—abbrev-commit

仅显示SHA-1的前几个字符

—relative-date

使用比较短的相对时间显示(比如"2 weeks ago")

—graph

显示ASCII图形表示的分支合并历史

—pretty

使用其他格式显示

--graph比较重要,在后续工作使用中,会有很多分支的拉出和合并,需要对分支历史有一个直观的展示,不过现在没有例子,在之后分支部分再讲好了。

选项

说明

-(n)

仅显示最近的 n 条提交

--since, --after

仅显示指定时间之后的提交。

--until, --before

仅显示指定时间之前的提交。

--author

仅显示指定作者相关的提交。

--committer

仅显示指定提交者相关的提交。

--grep

仅显示含指定关键字的提交

-S

仅显示添加或移除了某个关键字的提交

撤销操作

注意⚠️:有些撤消操作是不可逆的!可以会因为操作失误而导致之前的工作丢失。

提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。

使用git commit --amend尝试重新提交

  1. 把在缓存区中的内容提交
  2. 修改文件
  3. 使用--amend弹出提交信息,修改提交信息后保存
  4. 查看最终状态

提交后修改

弹出的修改信息

再次查看

最终只会有一个提交,第二次提交将代替第一次提交的结果。

取消暂存的文件

从提交后查看状态的提示信息可以看出,我们可以使用 git reset HEAD <文件>... 以取消暂存

取消暂存

撤销对文件的修改

我们把上一个例子中的1_1.py文件提交之后再进行修改,先不要加入暂存区,现在我们不要这个修改了,根据它的提示,我们使用 git checkout -- <文件>... 丢弃工作区的改动

修改

恢复

⚠️git checkout -- [file] 是一个危险的命令。 对文件做的任何修改都会消失,你只是拷贝了另一个文件来覆盖它。 除非你确实清楚不想要 那个文件了,否则不要使用这个命令!!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试游记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Git基础知识(二)
    • 文件状态
      • 忽略文件
        • 查看已暂存和未暂存的修改
          • 跳过暂存区
            • 移动文件
              • git log
                • git log的常用选项
                  • 撤销操作
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档