总第94篇
接上篇,本篇将详细梳理git
版本控制的一些常规操作与命令,这些命令包含我们在日常使用过程中的80%
,掌握好了这些操作,可以让你的工作得心应手。不多说了,Charging
~
1.获取Git
仓库
一般有两种获取Git
仓库的方式:一种是将尚未进行版本控制的本地目录转换为仓库
;一种是从其它服务器克隆一个已经存在的仓库
。
- 在已存在的目录中初始化仓库
首先进入到你待进行版本控制的文件目录下, 直接执行git init
命令,此命令后会生成一个.git
的子目录,它包含了仓库所有必须的文件;此后,你应该用git add
命令追踪目录下的文件并用git commit
命令进行初始提交。提交完成后,你就得到了一个git
仓库了。
- 克隆现有的仓库
如果你想为某个开源项目贡献自己的力量,这时就必须先将git
仓库中的项目进行克隆到本地。你可以使用git clone <remote url> <self_defined_name>
命令来完成。若命令中未设定self_defined_name
,执行命令后,会在当前目录下创建一个同名的项目,并在项目目录下初始化一个.git
文件夹,此文件夹已经保存了所有项目的数据。
2.记录修改与更新
通常,我们会对仓库中的文件进行修改,想要将这些修改记录下来,就必须提交到仓库。
请注意,仓库工作目录下的每一个文件不外乎两种状态:已跟踪
和未跟踪
。已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,是git
版本已经知道其存在的文件。
工作目录中,除了已跟踪的文件外,其它所有的文件都属于未跟踪文件,必须通过git add
指令,将其加入仓库中,git
才能进行跟踪。对于git
跟踪的文件,当你在上次提交后对其做了修改,git
会将其标记为已修改文件,你可以选择性地将这些文件放入暂存区
,然后提交这些已暂存的修改
。
- 可以通过命令
git status
来查看仓库中全部文件的状态。 - 可以用命令
git add <dir>or<fileName>
跟踪一个文件或目录、暂存已修改的文件或目录、合并时把有冲突的文件标记为已解决状态等。这是一个多功能
命令,它的更准确意义是:精确地将内容添加到下一次提交中
。
3.忽略文件
在git
仓库中,我们总有一些文件无需纳入管理,也不希望总出现在未跟踪文件列表中。在这种情况下,我们可以创建一个名为.gitignore
文件,列出要忽略的文件模式,以达到想要的效果。
.gitignore
文件的格式规范如下:
- 所有的空行或以
#
开头的行都会被git
忽略; - 可以使用标准的
glob
模式匹配,它会递归地应用在整个工作区中; - 匹配模式可以以
/
开头防止递归; - 匹配模式可以以
/
结尾指定目录; - 要忽略指定模式以外的文件或目录,可以在模式前加上
!
取反;
一般情况下,一个仓库可能只有根目录下一个.gitignore
文件,它递归地应用到整个仓库中,然而子目录也可以有额外的.gitignore
文件,它的作用范围仅限于自己的目录。详细的.gitignore
文件列表,可以参考 gitignore项目 。
4.查看已暂存和未暂存的修改
git status
命令输出的只是简略的文件状态信息,可用git diff
命令查看详细的文件对比信息,它可以通过文件补丁的格式更加具体地显示文件发生的哪些改变。
- 查看工作目录当前文件与暂存区快照间的差异:
git diff
,不用参数; - 查看已暂存文件与最后一次提交文件间的差异:
git diff --staged
;
5.文件的提交
可以用命令git commit
来提交暂存区的文件到仓库。在提交之前,请务必确认还有什么已修改或新的文件还没有git add
,否则提交时不会记录这些尚未暂存的变化。
因此,在每次提交前,先用git status
来查看一下,你所有修改的文件是否已全部暂存,然后再运行git commit
提交。 在你执行git commit
命令后,会启动你选择的文本编辑器来输入提交说明,编辑好说明后,保存退出,这一次提交就完成了。
当然你也可以在命令后面加-m
选项,来写简要的提交说明信息,如下示例:
$ git commit -m "this is commit specification text"
在有些时候,若你觉得麻烦,也可以跳过暂存区直接一步提交,不过,这也是有风险的。可以用git commit -a
命令,将所有跟踪的文件修改一次性直接提交。
6.移除文件和移动文件
- 移除文件
要从git
中移除某个文件,就必须从跟踪文件清单(暂存区) 中移除,然后再提交。可以用命令git rm
来操作。分为两种情况:
一种情况是:手动将工作目录中的文件删除了,再运行git rm <fileName>
,下次该文件就不再纳入版本管理了。若在删除之前修改过或已经将文件放在暂存区,则必须使用强制删除项-f
。这是一种安全特性,用于防止误删除尚未添加到快照的数据;
另一种情况是:我们想将文件从git
仓库中删除(从暂存区中移除),但仍然希望保留在当前工作目录中。亦即你想让文件保留在磁盘中,但是不想让git
跟踪,特别是当你忘记将之放在.gitignore
文件时,这一做法特别有用。
这种情况下,可以用git rm --cached <dir>or<fileName>
来实现,其中文件名或目录名可以用通配符。
- 移动文件
若仓库中有两个文件重名了,可以用命令git mv
来进行改名,其具体的语法如下:
git mv <file_from> <file_to>
上面的一条命令相当于执行了三条命令:
$ mv file_from file_to
$ git rm file_from
$ git add file_to
7.查看仓库的历史记录
可以用git log
命令来查看仓库的提交历史记录,在不传入任何参数的情况下,它会按时间先后顺序列出所有的提交,最上面的是最近一次提交。下面列出几种非常有用的参数组合:
git log -p -<Num>
:表示按补丁(提交差异)的格式来显示最近Num
次提交;git log --stat
:表示查看每次提交的简略统计信息;git log --pretty=format:"%h %s"
:可以自定义格式展示git
的提交历史;
下面列出了git log --pretty=format 常用选项
可接受的常用格式占位符的写法及意义:
选项 | 说明 |
---|---|
%H | 提交的完整哈希值 |
%h | 提交的简写哈希值 |
%T | 树的完整哈希值 |
%t | 树的简写哈希值 |
%P | 父提交的完整哈希值 |
%p | 父提交的简写哈希值 |
%an | 作者名字 |
%ae | 作者的电子邮箱 |
%ad | 作者修订日期(可用--date=选项 来定制格式) |
%ar | 作者修订日期,按多久以前的方式显示 |
%cn | 提交者的名字 |
%ce | 提交者的电子邮箱 |
%cd | 提交日期 |
%cr | 提交日期(距今多长时间) |
%s | 提交说明 |
作者
与提交者
之间是有差别的,作者
是指实际作出修改的人,提交者
是指最后将此工作成果提交到仓库的人。
上面只是简单地介绍了几个git log
命令支持的选项,其全部选项如下表所示:
选项 | 说明 |
---|---|
-p | 按补丁格式显示每个提交引入的差异 |
--stat | 显示每次提交的文件修改统计信息 |
--shortstat | 只显示--stat中最后的行数修改添加移除统计 |
--name-only | 仅在提交信息后显示已修改的文件清单 |
--name-status | 显示新增、修改、删除的文件清单 |
--abbrev-commit | 仅显示SHA-1核验和所有40个字符中的前几个 |
--relative-date | 使用较短的相对时间而不是完整的日期格式 |
--graph | 在日志旁以ASCII图形显示分支与合并历史 |
--pretty | 使用其它格式显示历史提交信息,可用的选项包括online、short、full、fuller和format |
--oneline | --pretty=oneline --abbrev-commit的简写 |
除了定制输出格式的选项外,git log
还有许多非常实用的限制输出长度的选项,这些选项非常有用。
选项 | 说明 |
---|---|
-<n> | 仅显示最近的n条提交 |
--since, --after | 仅显示指定时间后的提交 |
--until, --before | 仅显示指定时间之前的提交 |
--author | 仅显示作者匹配指定字符串的提交 |
--committer | 仅显示提交者匹配指定字符串的提交 |
--grep | 仅显示提交说明中包含指定字符串的提交 |
-S | 仅显示添加或删除内容匹配指定字符串的提交 |
8.撤销操作
撤销操作主要有三个方面:撤销提交、撤销暂存和撤销修改。
- 撤销提交
有时候我们在提交完了,才发现漏掉了几个文件没有添加,或者提交信息写错了,此时可以用命令git commit amend
进行修补。具体操作是:先将忘记的文件git add
到暂存区,再运行git commit amend
命令,执行的效果就像旧有的提交从来未发生过一样。
- 撤销修改
当对工作区的文件有修改后,运行git status
可以看到有提示命令 放弃修改
。可用命令git restore <file>
来放弃修改,恢复成原样。
这是一个相对危险的命令,执行此命令后,你对此文件的修改将会消失,git
会用最近提交的版本的覆盖它。
- 撤销暂存
在用git add
命令将修改提交到暂存区后,用git status
命令,也可以看到提示命令放弃暂存
。可用命令git restore --staged <file>
来放弃暂存,恢复成原样。
9.远程仓库的使用
远程仓库是指托管在因特网或其它网络中的你的项目的版本库。当然,远程仓库也可以在你的本地主机上,“远程”它未必在互联网上,而是表示在别处。
- 查看远程仓库
可以用git remote -v
来查看所有的远程仓库;
也可以用git remote show <remote-name>
查看更多远程仓库的更多信息。
- 添加远程仓库
可以用git remote add <shortName> <url>
命令来添加一个新的远程仓库,并同时指定仓库的名字为shortName
, 后面你可以直接通过名字操作,而不用复杂的url
。
- 从远程仓库中拉取与抓取
运行git fetch <remote name>
命令,可以从远程仓库中抓取本地没有的数据,执行完成后,你将会拥有远程仓库中所有分支的引用,可以随时合并或查看。 应当注意的是,此命令只是将数据下载到本地仓库,不会自动合并。当你准备好时,你必须手动合并。
如果你的当前分支设置了跟踪远程分支,那么可用git pull
命令来自动抓取后合并此远程分支到当前分支。默认情况下,git clone
命令会自动设置本地master
分支跟踪远程仓库的master
分支,用git pull
会从最初克隆的服务器上抓取并自动合并到当前所在的分支。
- 推送到远程仓库
可用git push <remote-name> <local-branch>
命令将你本地的分支推送到服务器。当然,你必须有写入权限,这个命令才会生效。
- 远程仓库的重命名
可用git remote rename name_from name_to
命令对仓库进行重命名。值得注意的是,重命名后引用也会变成新的引用名。
- 远程仓库的删除
可用git remote remove <remote-name>
来删除一个仓库。当删除这个仓库后,所有和这个远程仓库相关的远程跟踪分支及配置信息也会一起被删除。
10.打标签与删除标签
- 列出标签
可用git tag
快速列出全部标签,你也可以按特定的模式查找标签,用通配符来查找特定的标签,其形式为git tag -l <tag_char>
。
- 创建附注标签
最简单地创建附注标签方式是git tag -a <tag-name> -m <comment-text>
。在标签创建完成后,可以用git show <tag-name>
命令,查看标签信息与对应的提交信息。
- 创建轻量标签
创建轻量标签只需要提供标签名字,方式为git tag <tag-name>
。
- 后期打标签
你也可以对过去的提交打标签。先用git log --pretty=oneline
来查看提交历史,找到对应的校验和,再用git tag -a <tag-name> <对应的校验和>
来打标签。
- 推送标签
默认情况下,git push
命令并不会传送标签到远程仓库服务器上,在创建完成标签后,你必须显式地推送到共享服务器上,可以用命令git push <remote-name> <tag-name>
。
若你想一次推送很多标签,可以用命令git push <remote-name> --tags
。
- 删除标签
要删除本地的标签,可用命令git tag -d <tag-name>
。这个命令并不全删除远程仓库中的标签。
删除远程仓库的标签有两种方法:
git push <remote-name> :refs/tags/<tag-name>
:用冒号前的空值推送到远程。
git push <remote-name> --delete <tag-name>
本文到此结束!
如果对你有帮助,请随手 点个赞 或 点喜欢!
=======================================================
欢迎【关注作者、私信作者】。我们一起交流一起进步。
=======================================================