首页 Git 进阶学习笔记
文章

Git 进阶学习笔记

好久好久之前,入门学习了一下Git,基本上可以使用GitGithubpush自己的代码,并且clone一下别人的项目。本以为这就能够满足我的日常需求了,但是随着学习以及使用的复杂性,发现那些基础的命令不能再满足我的日常使用了,于是最近在看《pro Git》一书, 希望能更深入的学习一下Git这个工具,工欲善其事,必先利其器。

1. git config 配置

刚开始使用 Git 的时候,很多人肯定都忽略配置的相关内容。也许你还记的在第一次push内容的时候,总会有提示让你设置你的用户名以及邮箱。其实这就是最基本的一个配置。

git config --list可以查看目前 git 仓库中有哪些配置。那么另外一个问题来了,Linux 中有个观点是:『一切皆文件』,这些配置从哪里来的?共有3个地方设置,分别是系统级的、用户级的以及仓库级的。

(1)/etc/gitconfig 系统级的配置

系统中所有的git仓库都普遍适用的配置。

1
git config --system user.name pengloo53

注意:配置文件不一定是/etc/gitconfig,去你的 git 安装的目录下去找。怎么找?Linux和 Mac 用户可以使用which git找到git的所在地,然后就好找了,比如我的 git 的系统配置文件在 /usr/local/etc/gitconfig 下。我的Mac是通过homebrew安装的 git。如果是 Windows 系统,去安装目录下找就 OK 了。

(2)~/.gitconfig 用户级的配置

该用户下所有的git仓库都普遍适用的配置。使用git config --globe来写入。

(3).git/config 仓库级的配置

只针对某个仓库而言的配置。在仓库目录下直接git config来写入配置。

如果我很无聊,分别使用下面三种方式设置了我的用户名,那么,推送消息的时候到底记录的是哪个呢?

1
2
3
git config --system user.name name_1
git config --globe user.name name_2
git config user.name name_3

这里不用担心,git会一级一级覆盖的,也就是会显示最小范围的那个级别。如果有相同的配置存在,最终会显示仓库级的那个配置。

2. git commit 提交

这个命令可真是熟悉得不能再熟悉了,每次git add --all都要习惯性的git commit -m "message"一下,message是一定要写的,Git默认也是要你写的,这是个好习惯,一定要坚持下去。反正我都习惯了,不写-m都觉得奇怪了。

当然保留好的习惯的时候,该偷懒也得偷懒一下。可以尝试git commit -a -m "message"git add --allgit commit -m 'message"合并一块写,我相信你会更爽的。

如果一不小心,message写成了meaasge,虽然不是啥大事,但是对于一个『强迫症』来说,那叫个难受。没事,试一下git commit --amend修改提交文本。

再如果commit之前忘了add某些文件了,想一块commit进来,没关系。

1
2
git add --all
git commit --amend 

这样就不用产生两条提交信息了。

3. git show 查看

在入门笔记里,通过git show v1.0可以查看标签信息,然而它还可以查看每次的提交信息,可能这并不是什么进阶知识,但是对我来说还是比较新鲜的,就记在这里吧。

当你想查看之前某个的提交改了些啥玩意的时候,那么git show就大有用处了。先通过git log --graph --pretty=oneline --abbrev-commit查看一下自己的分支信息,然后git show commitID就可以了。当然你不用写下全部的commitID,写前4位就行了。

如:git show 0fce,就可以查看0fce*那次都提交了哪些内容。

4. git remote 远程

在之前,这个命令我基本上没有怎么使用过,因为创建的仓库,除了第一次使用关联到github上之后,就再也没咋用了。把本地的仓库上传至远程,基本上会用到如下两条命令。

1
2
git remote add origin https://github.com/XXX/xxx.git
git push -u origin

如果是你一个人玩Git,那么上面两条命令真的够了,很长一段时间我就是一个人玩。但是使用Git版本控制器就注定了你不能再一个人玩下去了,协同处理项目才是版本控制器的真正意义。

git remote -v查看一下远程的仓库,通常情况下,你会看到一个origin这个远程仓库,它是默认的远程仓库。基本上就是你第一次push or clone的那个仓库。

假设有如下情景:

你在githubfork了一个别人的项目,并且clone下到本地,而且玩了老长时间了,也许你还pull request一下别人的项目,运气好,别人还merge了你的pull request,然后过了好长时间,你都放弃了这个项目,然而别人还在一直更新,你想看看最新的项目状态。那么你可以通过下面几条命令,再把别人仓库的内容抓取下来。

1
2
3
git reomte add others https://github.com/xxx/xxx.git
git fetch others master
git checkout -b tmp others/master
  1. 首先添加一下别人的远程仓库,命名为others
  2. 然而使用git fetch命令抓取一下远程仓库的内容,通过git branch -r,你就可以看到others/master远程分支了;
  3. 再在本地创建一个tmp分支跟踪远程others/master分支。
  4. 最后tmp的处理权就交到你的手里了,删除它或者merge到本地master上就看你的心情了。
  5. 最最后别忘了,再把它推送到你的远程分支上origin/master,使用git push origin master就行了。

5. gitk图形界面

要是让我记那么多git log的参数实在是太让人为难了,基本上是用的时候现查命令参数,自从知道了gitk,现在连git log都快忘了,这个图形工具真是太方便了。一目了然各个分支都哪个地方。纵使我再崇拜命令行,我还是为了它妥协了。

  • Windows上就不用安装了,安装完git for windows就可以直接使用了。
  • Mac上如果无法使用gitk命令启动图形界面,赶紧点击这里安装,不要再犹豫。
  • Linux,啊,能把Linux当桌面系统使用的用户都是高手,我这里就不班门弄斧了。

2022.11 更新

6. git 分支

分支查看与创建

1
2
3
4
5
6
7
8
9
10
11
git branch #查看本地分支
git branch -r #查看远程分支
git branch -a #查看所有分支
git branch xxx #创建分支 xxx

git checkout xxx #切换到分支 xxx
git checkout -b xxx #创建分支 xxx,并切换到 xxx 上(基于当前 HEAD 指向的分支,创建新分支)

git checkout -b new-branch existing-branch  #基于 existing-branch 创建 new-branch,new-branch 和 existing-branch 可以是远程分支,例如:origin/xxx

git fetch --all #拉取所有远程分支

分支删除与更改

1
2
3
git branch -d xxx
git branch -D xxx
git branch -m <new-branch-name> 将当前分支重命名

删除远程分支

1
2
git push origin --delete branch_name
git push origin :branch_name

7. git 裸库

1
2
3
4
5
6
7
8
9
# 生成一个裸仓库
git init --bare blog.git

# 切换分支,执行 git checkout <branch-name> 会报错:fatal: this operation must be run in a work tree
# 使用下面命令切换分支
git symbolic-ref HEAD refs/heads/<branch-name>

# 与其他远程仓库镜像
git push --mirror http://github.com/pengloo53/xxx
本文由作者按照 CC BY 4.0 进行授权

溺水失去意识那一刻我想到了什么?

让你了解相对论的一本书-《时间的形状》