跳转至

Pro GIt 阅读笔记

跟着Pro Git重新学一遍Git

创建仓库

自己创建

cd /path/to/repo
git init

clone

git clone [url]

[url]选项:

  • 本地文件/网络存储:/srv/repo
  • HTTP:分为 smart HTTP 和
  • SSH:推荐,配置简单,但只有鉴权用户才能使用
  • GIT:没有鉴权机制,监听端口,只推荐公开访问
git clone https://github.com/git/git git-fork # 重命名

添加文件

git add -- [file]

查看

stage 详情

git status
git status -s # shorter

修改情况

git diff
git diff --staged

git diff本身diff的是stagedunstaged的文件,不会涉及上次提交的文件;git diff --cached(或者同义词--staged

或者可以通过设置git difftool使用外部工具进行diff

提交修改

git commit
git commit -v # 详细的diff信息
git commit -a # commit前自动stage所有tracked文件

删除文件

使用rmgit add
rm README.md
git add README.md
使用git rm
git rm README.md # 硬删除
git rm --staged README.md

通配符

git rm log/\*.log # 删除log/文件夹下所有后缀名为.log的文件

移动文件

git mv file_from file_to

值得注意的是,git里并没有mv这个状态,而是rename。这是通过git的文件跟踪机制实现的。

查看commit历史

git log
git log -p -2 # -p --patch 显示每次的patch; -2 显示最近两条
git log --stat # 查看简单的统计信息
git log pretty=oneline # --oneline
git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

后悔药

git commit --amend
git reset HEAD CONTRIBUTING.md # 把CONTRIBUTION.md文件拉回HEAD提交的样子
git checkout -- <file> # 很危险,会丢失当前修改
git restore --staged <file> # 用于不小心多stage了一个文件的情况,unstage文件但不丢失修改
git restore <file> # Restore a modified file

分支

每一个git object中,除了文件的snapshot之外还会有指向父commit的指针,可能有零个(root commit)、一个、两个及以上(merge commit),指针情况可以通过git log --oneline --decorate查看。

git log --oneline --decorate --graph --all

创建分支

git branch new_branch

切换分支

git checkout new_branch

注意

git 2.23之后,可以使用git switch来:

  • 切换到已存在分支:git switch test-branch
  • 创建分支并切换:git switch -c new-branch(或--create
  • 切回上一个分支:git switch -

Merge

Fast-forward

在两个分支的tag在同一主线上时

Merge

利用两个commit的内容和公共祖先来合并分支