学习 Git,看这一篇就够了!(上)https://developer.aliyun.com/article/1411079
三、Git 进阶
1. 修改操作
如果只是简单地从工作目录中手工删除文件,运行 git status
时就会在 Changes not staged for commit 的提示
(1)删除文件
可以使用以下命令将文件从暂存区和工作区中删除:
git rm
如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f
:
git rm -f
如果想把文件从暂存区域移除,但仍然希望保留在当前工作目录中,换句话说,仅是从跟踪清单中删除,使用 --cached
选项即可:
git rm --cached
可以使用以下命令进行递归删除,即如果后面跟的是一个目录做为参数,则会递归删除整个目录中的所有子目录和文件:
git rm –r *
进入某个目录中,执行此语句,就会删除该目录下的所有文件和子目录。
(2)取消修改
取消修改有三种情况:
1)未使用 git add 将修改文件添加到暂存区这种情况下,可以使用以下命令来撤销所有还没有加入到缓存区的修改:
git checkout --
需要注意,此文件不会删除新建的文件,因为新建的文件还没加入到Git管理系统重,所以对Git来说事未知的,需要手动删除。
2)已使用 git add 将修改文件添加到暂存区,未使用 git commit 提交缓存这种情况下,相当于撤销了 git add 命令对于文件修改的缓存:
git reset HEAD
上面的命令可以撤销指定文件的缓存,要想放弃所有文件的缓存,可以执行以下命令:
git reset HEAD
需要注意,在使用此命令后,本地的修改并不会消失,而会回到第一种情况。要想撤销本地的修改,执行第一种情况中的命令即可。
除此之外,还可以指定返回到N次提交之前的阶段,执行以下命令即可:
git reset HEAD~N
这样就能退回到n个版本之前,同样不会修改本地文件的内容,这些新的内容会变成未更新到缓存区的状态。
3)已使用 git commit 提交缓存这种情况下,可以使用以下命令来回退到上一次 commit 的状态:
git reset --hard HEAD^
也可以使用以下命令来回退到任意版本:
git reset --hard
注意,使用 git log 命令来查看 git 提交历史和 commit id。
(3)恢复删除内容
这是一个很重要的命令,假如你回退到某个旧版本,现在想恢复到新版本,又找不到新版本的commit id怎么办?Git提供了下面的命令用来记录每一次命令:
git reflog show HEADgit reflog
执行之后输出如下:
可以看到,最左侧黄色字体就是修改的commit id,根据这个id就可以将代码恢复到对应节点位置。HEAD@{n}表示HEAD更改历史记录,最近的操作在上面。
假如需要把代码回退到HEAD@{5}
处,可以执行以下命令:
git reset --hard HEAD@{5}
或者执行下面的命令:
git reset --hard 8a0fd74
需要注意,如果有任何本地修改,该命令也会将其销毁,因此在reset
之前建议使用stash
将本地修改储存。
2. 标签操作
标签指的是某个分支某个特定时间点的状态,通过标签可以很方便的了解到标记时的状态。
标签有两种类型 :
- 轻量标签 : 只是某个commit 的引用,可以理解为是一个commit的别名;
- 附注标签 : 存储在Git仓库中的一个完整对象,包含打标签者的名字、电子邮件地址、日期时间 以及其他的标签信息。它是可以被校验的,可以使用 GNU Privacy Guard (GPG) 签名并验证。
(1)展示标签
可以使用以下命令来获取所有标签:
git tag
它会列出所有标签的名称:
可以使用以下命令来查看某一个标签的详细信息:
git show
还可以根据条件来显示标签,比如列出以v1.
开头的所有tag:
git tag -l "v1."
(2)创建标签
可以使用以下命令在本地创建新标签:
git tag
例如:
git tag v1.0.0
通常遵循的命名模式如下:
v..
- major(主版本号):重大变化
- minor(次要版本号):版本与先前版本兼容
- patch(补丁号):bug修复
除此之外,我们还可以为特定的commit创建标签,其命令格式如下:
git tag
以上面的的形式创建的标签都属于轻量标签,下面来看看如何创建一个附注标签。
在创建标签时,可以添加一个-a
标志以创建一个带备注的标签,备注信息使用-m message
来指定:
git tag -a -m ""
(3)推送标签
标签创建完成之后就可以使用以下命令将其推送到远程仓库:
git push origin --tags
以上命令会将本地所有tag都推送到远程仓库。如果想推送指定标签,可以执行以下命令:
git push origin
(4)切换标签
可以使用以下命令来切换标签:
git checkout
(5)删除标签
可以使用以下命令来删除本地仓库指定标签:
git tag -d
可以使用以下命令来删除远程仓库指定标签:
git push origin :refs/tags/
也可以使用以下命令来删除远程仓库的指定标签:
git push origin --delete
(6)拉取标签
可以使用以下命令来将远程仓库的标签拉取(同步)到当前分支:
git fetch --tags
(7)检出标签
检出标签实际上就是在标签的基础上进行其他开发或操作。需要以标签指定的版本为基础版本,新建一个分支,继续其他的操作。执行以下命令即可:
git checkout -b
3. 日志记录
(1)基础日志
可以使用以下命令来查看分支的历史提交信息:
git log
这是其最基础的用法,输出如下:
可以看到,终端上输出了该分支近期的提交记录,它包含了所有贡献者的提交。
(2)按作者查看
如果想只看某个人的提交,可以添加过滤条件:
git log --author="username"
当然也可以搜索多个作者的提交信息,只需要在用|分隔用户名即可,注意需要使用\来对|进行转义:
git log --author="username1\|usernmae2"
这里列出的是每次提交的详细信息,如果指向看到每个提交的概要,可以在命令中添加--oneline
标志:
git log --author="username" --oneline
(3)按时间查看
除了可以按照作者来查看日志之外,还可以按照时间查看日志。可以查看某个时间之前的日志,也可以查看某个日期之后的日志:
//某个日期之后 git log --since=<date> git log --after=<date> //某个日期之前 git log --until=<date> git log --before=<date>
如果想查看某个具体时间区间之间的日志,可以组合以上参数:
bash
复制代码
git log --since="2022.05.15" --until="2022.05.20"
(4)按文件查看
如果我们想查看某个文件都在哪些提交中修改了内容,也是可以的。使用以下命令即可:
git log --
比如查看README.md
文件的修改记录:
(5)按合并查看
在历史提交中可能会有很多次合并的提交记录,想要只查看代码合并的记录,可以执行以下命令:
git log --merges
如果想查看非合并操作的操作记录,可以执行以下命令:
git log --no-merges
(6)按分支查看
可以按照分支查看日志,如果想查看test
分支比master
分支多提交了哪些内容,就可以执行以下命令:
git log master..test
相反,如果想看master
分支比test
分支多提交了哪些内容,就可以执行以下命令:
git log test..master
(7)美化日志
git log命令可以用来查看提交历史,此命令的问题在于,随着项目复杂性的增加,输出变得越来越难阅读。可以使用以下命令来美化日志的输出:
git log --graph --oneline --decorate
输出结果如下,这样就能看到更简洁的细分以及不同分支如何连接在一起:
(8)其他标志
上面我们提到了,可以使用--oneline
标志来简化日志的输出:
git log --oneline
可以使用--stat
标志来简要显示文件增改行数统计,每个提交都列出了修改过的文件,以及其中添加和移除的行数,并在最后列出所有增减行数小计:
git log --stat
可以添加-N
标志来仅显示最近N次的提交,其中N
是一个正整数,例如查看最近三次提交:
git log -3
可以使用-p
标志来展开显示每次提交的内容差异对比:
git log -p
注意,以上这些命令标识符都可以组合使用。
4. 差异对比
git diff 命令可以用来比较文件的不同,即比较文件在暂存区和工作区的差异。
(1)未缓存改动
当工作区有改动,暂存区为空时, diff对比的是工作区与最后一次commit提交的共同文件; 当工作区有改动,暂存区不为空时,diff对比的是工作区与暂存区的共同文件。
(2)已缓存改动
当已缓存改动时,可以使用以下任一命令来显示暂存区(已add但未commit文件)和最后一次commit(HEAD)之间的所有不相同文件的差异对比:
git diff --cached git diff --staged
(3)已缓存和未缓存改动
可以使用以下命令来显示工作目录(已修改但未add文件)和暂存区(已add但未commit文件)与最后一次commit之间的的所有不相同文件的差异对比:
git diff HEAD
(4)不同分支差异
可以使用以下命令来比较两个分支上最后 commit 的内容的差别:
git diff <分支名1> <分支名2>
这样就可以显示出两个分支的详细差异,如果只是想看有哪些文件存在差异,可以在命令中添加--stat
标志,这样就不会显示每个文件的内容的详细对比:
git diff <分支名1> <分支名2> --stat
5. 定位问题
git bisect 可以用来查找哪一次代码提交引入了错误。它的原理很简单就是将代码提交的历史使用二分法来缩小出问题的代替提交范围,确定问题出在前半部分还是后半部分,不断执行这个过程,直到找到引入问题的那一次提交。
其命令合适如下:
git bisect start
其中end就是最近的提交,start就是最开始的提交。假如第一次的提交的 commit id为685f868,总共有21次提交。那么执行以下命令,从第一次提交到最近一次提交:
git bisect start HEAD 685f868
执行完之后,验证那个问题是否存在,如果发现问题不存在了,就执行以下命令来标识第11次提交是没问题的:
git bisect good
这样就说明前半段是没有问题的,问题出在后半段,也就是第11-21次提交中。这时再去刷新浏览器,如果问题出现了,使用以下命令来标记:
git bisect bad
这样就说明第11-16次提交是有问题的。继续重复上面的步骤,直到成功找出那一次提交位为止,这时Git就会给出如下的提示:
c8ad045 is the first bad commit
这时就确认了是这一次提交导致的问题,可以去查看时那些修改导致的问题。
之后就可以使用以下命令退出错误查找过程,回到最近一次代码提交:
git bisect reset
四、实用 Git 工具
1. GitLens
GitLens 是一个VS Code插件,可以用来查看项目的提交记录、文件修改记录、显示每行代码的提交记录等。通过丰富的可视化和强大的比较命令获得有价值的见解。
2. Git History
Git History 是一个VS Code插件,增强了Git 的功能,它可以用来查看日志信息,查看和搜索历史,进行分支对比、提交对比,跨提交对比文件等。
3. Git Automator
Git Automator 是一个VS Code插件,主要用来自动化Git提交消息和 Git 工作流程。它允许用一个快捷方式添加和提交文件。它还为提交信息提供了自动填充功能。当动作很明显时,例如你删除了一个文件,Git Automator 会猜测该动作并将其添加到预填充的提交消息中。
4. LearnGitBranching
LearnGitBranching 是一个 git 存储库可视化工具、沙箱和一系列教程和挑战。它的主要目的是帮助开发人员通过可视化的力量来理解 git。这是通过不同级别的游戏来熟悉不同的git命令来实现的。
Github:github.com/pcottle/lea…