《Pro Git》 读书笔记

起步

Git 有三种状态

  • 已提交 committed
  • 已修改 modified
  • 已暂存 staged

初次运行 Git 前的配置

git config --global user.name "John Doe"
git config --global user.email johndoe@example.com

获取帮助

git help <指令>
git help merge

Git 基础

获取 Git 仓库

# 在现有目录中初始化仓库
git init # 这将创建一个名为.git的子目录,此目录中含有初始化Git仓库的所有文件
git add *.c # 跟踪指定文件
git commit -m "init repo" # 提交

# 克隆现有仓库
git clone https://github.com/libgit2/libgit2
git clone https://github.com/libgit2/libgit2 mylibgit # 指定文件夹的名称

记录每次更新到仓库

工作目录下的每一个文件只有两种状态:

  • 已跟踪 (指的那些呗纳入了版本控制的文件)
  • 未跟踪

新添加的文件,一般是untracked,这时候要使用git add <文件名> 去跟踪文件

git add 的作用

  • 开始跟踪新文件
  • 把已跟踪文件放到暂存区
  • 合并时把有冲突的文件标记为已解决的状态

Git 只会暂存你最后一次运行git add时的版本

查看状态

git status
git status -s # 更紧凑的格式输出状态

忽略文件

touch .gitignore # 添加

示例:

# no .a files
*.a

# but do track lib.a, even though you're ignoring .a files above
!lib.a

# only ignore the TODO file in the current directory, not subdir/TODO
/TODO

# ignore all files in the build/ directory
build/

# ignore doc/notes.txt, but not doc/server/arch.txt
doc/*.txt

# ignore all .pdf files in the doc/ directory
doc/**/*.pdf

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

git diff # 比较的是工作区和暂存区快照之间的差异,也就是修改后没有暂存起来的变化内容
git difftool # 使用图形化界面来查看差异

提交更新

git commit 之前最后再进行一次git add,确保还有什么修改过的文件或新增的文件还没被暂存

git commit # 这样会打开一个文本编辑器,让你输入提交信息
git commit -m "commit msg" # 直接提交

也可以使用

git commit -a -m "commit msg"

这样加一个-a,Git 就会子哦对那个把所有已经跟踪过的文件(意味着如果未跟踪过的将不会暂存)暂存起来,一并提交

移除文件

这个命令是把文件移除然后提交到暂存区,如果单纯的删除的话还得手动git add提交到暂存区

git rm <文件名>
git rm --cached <文件名> # 将文件在暂存区删除,然后让这个文件变成untrack状态,这时这个文件还在

移动文件

移动文件并提交到暂存区

git mv <文件名> <新的文件名>

查看提交历史

git log
git log -p -2 # 查看最近两次提交的内容差异
git log --stat # 查看每次提交的简略的统计信息
git log --online # 一行显示简要信息
git log --pretty=oneline # 可以指定格式去展示提交历史
git log --pretty=format:'%h -%an, %ar : %s'
git log --pretty=format:'%h %s' --graph # 配合graph使用

撤销操作

如果你commit之后发现还有要修改的地方,那么你就可以使用下面这条命令:

git commit -m "init repo"
git add <忘记要修改的文件>
git commit --amend

最终你第二次提交会代替你第一次提交,也就是最终只有一条提交

撤销对文件的修改

# 先是要取消暂存,让它回到工作区
git reset HEAD <filename> # 第一种方法
git restore --staged <filename> # 第二种方法


# 撤销对文件的修改
git checkout -- <filename> # 第一种方法
git restore <filename> # 第二种方法

远程仓库的使用

查看远程仓库

git remote 
git remote -v # 显示详细信息

可以发现 origin 是 git clone 时的服务器默认的名字

添加远程仓库

git remote add <remote-name> <url>

从远程仓库中抓取与拉取

git fetch <shortname> # git fetch会将数据拉取到你本地仓库,并不会自动合并或修改你当前的工作,你必须要手动git merge
git pull # 这个命令其实包含着git fetch,而且还会尝试合并远程分支到当前分支

推送到远程分支

git push <remote-name> <branch-name>
git push origin master

查看远程仓库

git remote show <remote-name>
git remote show origin

远程仓库的移除和重命名

git remote rename <remote-name> <new-remote-name> # 重命名
git remote rm <remote-name> # 移除

打标签

列出标签

git tag # 会列出所有标签

创建标签

Git 中分为两种标签

  • 轻量标签:特定提交的一个引用
  • 附注标签:存储在Git中的一个完整对象

创建附注标签:

git tag -a v0.1 -m "chicken you are beautiful"
git tag -a v0.05 -m "hungry" a6da524 # 后面加上版本号可以对某一个commit打上版本号

查看某个标签的详细信息:

git show v0.1

共享标签(push到远程服务器)

git push origin v0.05 # push一个
git push origin --tags # push全部

检出标签

git checkout -b version005 v0.05 # 创建一个新分支,这个分支的内容和我的指定的版本号的内容是一致的