跳到主要内容

Git

1. Setup and Config

config

DESCRIPTION

git 的配置文件为 .ini 格式, 由 sections, keys, values 三部分组成

# 注释为 # 或 ;
[section]
key = value

COMMANDS

  • list

列出配置文件所有 key,value

  • get

通过 section.key 形式来获取配置文件的值, 例如

git config get user.email
  • set

通过 section.key 形式为一个或多个选项设置值

关闭 mac 和 windows 默认的忽略大小写
git config set core.ignoreCase false
  • unset

通过 section.key 形式取消设置一个或多个配置选项的值

  • edit

打开编辑器修改配置文件

OPTIONS

  • --system

系统的全局配置文件, 最低优先级生效

  • --global

用户的配置文件

  • --local

项目的配置文件, 默认, 最高优先级生效

help

DESCRIPTION

帮助命令

OPTIONS

  • --config

列出可用的配置文件 key

  • --man

以 man 手册格式列出常用命令


2. Getting and Creating Projects

init

创建一个空的 Git 仓库或是重新初始化一个已经存在的仓库

clone

克隆一个仓库到新目录


3. Basic Snapshotting

add

DESCRIPTION

将变更加入到暂存区 (索引)

OPTIONS

  • <pathspec>...
* 匹配任意数量字符
git add *.txt
git add src/*.txt
? 匹配单个字符
git add file?.log
[] 匹配括号内任意一个字符
git add image[1-3].png
** 递归地匹配任意深度的子目录
git add **/config.ini
. 添加当前目录及子目录下变化
git add .
:(top) 从根目录下匹配
git add :(top)/*.md 
:(icase) 不区分大小写
# 匹配 jpg 和 JPG
git add :(icase)*.jgp
! 排除特定文件
git add . "! *.log" 

status

显示工作树状态

commit

记录仓库的变化

diff

DESCRIPTION

默认比较工作区暂存区差异

OPTIONS

  • --staged

暂存区上一次提交的差异

  • <旧版本> <新版本>

比较最新提交上一次提交

HEAD~1 代表 HEAD 往前回溯 1 步
git diff HEAD HEAD~1

restore

DESCRIPTION

默认丢弃工作区的修改

OPTIONS

  • --staged

比较暂存区和 HEAD 的差异, 将变动从暂存区撤回到工作区

reset

DESCRIPTION

将 HEAD 强行移到指定历史节点, 默认模式为--mixed

OPTIONS

  • --soft

只移动 HEAD 指针, 不碰暂存区工作区

回退 4 步
git reset --soft HEAD~4
  • --mixed

移动指针并清空暂存区, 工作区不变

  • --hard

移动指针, 暂存区工作区也回到历史状态

notes

DESCRIPTION

不影响对象本身情况下, 添加,查看对象注释

COMMANDS

  • add
git notes add -m "这是我的备注"
  • remove <提交id>
git notes remove <提交id>

4. Branching and Merging

branch

DESCRIPTION

列出, 创建或删除分支

OPTIONS

  • -m <旧名> <新名>

重命名分支

  • -d

删除分支

  • <新分支名称> <起点>

从某个历史节点创建分支

  • -vv

查看每个分支进度, ahead 1 表示本地还有1个提交未推送到远程, behind 2表示远程还有2个提交未拉到本地

git branch -vv

checkout

DESCRIPTION

切换分支或恢复工作区文件

OPTIONS

  • -b

创建新分支并移动 HEAD 到新分支

创建并切换分支
git checkout -b <新分支>
  • --
撤销工作区修改
git checkout -- hello.txt
从另一个分支拿文件覆盖到当前分支
git checkout <另一个分支> -- hello.txt

merge

DESCRIPTION

合并另一个分支到当前分支, 建议合并到 master 前先 merge master 在本地解决冲突

OPTIONS

  • --abort

撤销合并, 回到合并前状态

  • --no-ff

表示即使快进解决也创建合并提交

log

  • --oneline

一行显示一个提交

  • --graph --oneline --all

图形化显示提交

  • -n

指定显示最近几次提交

reflog

记录了每次 HEAD 移动, 配合 git reset --hard <哈希值> 可回退到某次操作

tag

DESCRIPTION

创建, 列出, 删除或验证 tag 对象

OPTIONS

  • -d

删除给定名字的现存标签

  • -f <新标签名> <旧标签名>

强制修改标签名

  • -a

通过创建标签对象, 制作注释性标签用来发布

创建并发布标签
git tag -a v0.1.0 -m "发布正式版v0.1.0"
git push origin v0.1.0

worktree

DESCRIPTION

管理多个工作区, 实现多个分支同时进行, 创建文件夹单独存放某分支并共享 .git 文件

COMMANDS

  • add <路径名> <分支名>

为指定的分支新建一个工作区

  • list

查看所有工作区

  • remove <路径名>

移除工作区

  • prune

手动删除工作区文件夹后, 清理无效工作区


5. Sharing and Updating Projects

fetch

pull

push

remote

DESCRIPTION

管理一组远程仓库

COMMANDS

  • add <别名> <URL>

添加远程仓库

  • set-url <别名> <新URL>

修改远程仓库地址

  • rename <旧别名> <新别名>

修改远程别名

  • remove <别名>

删除远程关联

OPTIONS

  • -v
查看远程仓库详情
git remote -v

6. Patching

rebase

将分支拆下来拼到 master 最新状态处

revert

自动创建一个与历史节点一致的新提交


7. Best Practices

创建远程仓库

配置 ssh

  1. 项目目录下生成 .git 文件
git init -b master
  1. 创建 ssh 密钥对, 过程中连续回车保持默认
ssh-keygen -t ed25519 -C "描述信息" -f c:/users/your_username/.ssh/id_ed25519_myblog
  1. 添加公钥到远程仓库设置中
cat c:/users/your_username/.ssh/id_ed25519_myblog.pub

  1. 编辑 .ssh 的 config 文件, 使得通过 URL 能找到对应的私钥
添加如下配置
Host github.com-myblog
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_myblog
  1. 查看远程仓库
git remote -v
  1. 配置对远程仓库的 URL 引用,
@ 和 : 之间为 config 文件的 Host 字段值
# 修改则使用 git remote set-url
git remote add origin git@github.com-myblog:HsiehBro/myblog.git
  1. 验证是否返回 sucessful
ssh -T git@github.com-myblog

多分支开发

  1. 确保在主线上
git checkout master
  1. 创建并切换到长期的开发分支
git checkout -b dev
  1. 新地基推送到远程仓库
git push -u origin dev
  1. 确保在 dev 分支并拥有最新代码
git checkout dev
git pull origin dev
  1. 开发小功能 todo, 开启 feature 分支
git checkout -b feature/todo
  1. 在 feature 分支进行开发后, 切回 dev 分支合并功能
git checkout dev
git merge --no-ff feature/todo
  1. 删除临时分支
git branch -d feature/todo

推送上线

  1. 切回主线, 并合并 dev 分支
git checkout master
git merge --no-ff dev
  1. 打上里程碑标签
git tag -a v0.1.0 -m "发布 todo 功能新版本"
  1. 推送代码和标签到云端
git push origin master
git push origin v0.1.0