Git笔记

安装

Windows

Download for Windows

Linux

1
sudo apt install git

MacOS

1
brew install git

说明

工作区:未添加暂存的文件存放的地方

暂存区:git add 后的文件存放的地方

vscode
trace

文件状态分为:

  • untrack:新建的文件,未添加到暂存区
  • modified:原有的文件被修改,且未添加到暂存区
  • staged:已添加到暂存区
  • deleted:已删除
  • committed:已提交

配置

1
2
3
4
5
6
7
8
9
# --global 表示本机所有仓库都使用这个配置
git config --global user.name "Your Name"
git config --global user.email "email@example.com"

# 查看配置
git config list

# 查看版本
git --version

初始化仓库

在项目根目录执行,初始化Git仓库。

1
git init

初始化后出现一个隐藏文件夹.git

添加与提交

未添加到暂存区的修改不会被提交。

1
2
3
4
5
6
7
8
9
10
# 添加文件 / 跟踪 / 暂存
git add README.md Main.java # 添加指定文件
git add . # 添加所有已修改文件

# 提交
git commit -m "提交说明"

# 把本次的修改合并到上次commit / 修改上次commit的提交信息
git commit --amend
git commit --amend --no-edit

查看修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看当前仓库文件状态
git status

# 查看文件修改
git diff

# 查看提交历史
git log
git log --pretty=oneline

# 查看命令历史
git reflog

# 查看分支合并图
git log --graph

删除

1
2
3
4
5
# 删除指定文件并将该删除操作直接添加到暂存区
git rm Main.java

# 当文件为有修改(modified)或已暂存(staged)时,需要 -f 删除
git rm -f Main.java

撤销

1
2
3
4
5
6
7
8
9
10
11
12
# 撤销已有文件的未暂存修改,其中 -- 表示后面无参数了,避免与切换分支指令混淆
git checkout -- Main.java

# 撤销暂存
git rm --cached Main.java
git reset Main.java

# 撤销提交
git reset --hard HEAD^ # 回退到上一个版本的已提交状态
git reset --soft HEAD^^ # 回退到上两个版本的未提交状态
git reset --mixed HEAD~100 # 回退到上100个版本的已暂存但未提交的状态
git reset --hard <版本号>

工作流程图

分支管理

分支说明

分支管理1
分支管理2
分支管理3
分支管理4

这种情况下把dev合并到master,可以直接让master指向dev,即Fast-Forward

创建、查看分支

1
2
3
4
5
6
git branch dev      # 创建 dev 分支
git checkout dev # 切换到 dev 分支

git checkout -b dev # 相当于一次性执行了前两条命令

git branch # 查看分支,星号标记的是当前分支

git checkout容易与前面的撤销指令混淆,推荐使用git switch

1
2
git switch -c dev # 创建并切换到 dev 分支
git switch dev # 切换到 dev 分支(dev 已存在)

合并分支

dev分支上的提交master分支上不可见,除非将二者合并。

1
2
3
4
5
# 将 dev 分支合并到当前所在分支上
git merge dev

# 禁用 Fast-Forward
git merge --no-ff -m "提交信息" dev

删除分支

1
2
# 删除 dev 分支
git branch -d dev

配置SSH公钥

1
ssh-keygen -t rsa -C "youremail@example.com" -f ~/.ssh/id_rsa.yourname

其中-t用于指定密钥类型。-C用于为密钥添加注释,通常填写邮箱或其他标识信息,但注释内容不会影响实际功能。-f用于指定生成的密钥对的路径及名称,默认为~/.ssh/id_rsa

通过配置config文件可以让不同用户不同域名使用不同的密钥对。

创建~/.ssh/config文件,输入如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 张三访问 example.com 的时候,用的是 ~/.ssh/id_rsa 这个私钥
Host example.com
User zhangsan
IdentityFile ~/.ssh/id_rsa

# 李四访问 example.com 的时候,用的是 ~/.ssh/id_rsa.lisi 这个私钥
Host example.com
User lisi
IdentityFile ~/.ssh/id_rsa.lisi

# 新的SSH客户端不支持 ssh-rsa 算法,需要加下面两行
HostkeyAlgorithms +ssh-rsa
PubkeyAcceptedKeyTypes +ssh-rsa

最后将公钥~/.ssh/id_rsa.pub上传到代码托管平台即可。

远程仓库

关联远程仓库

1
git remote add origin git@github.com:YourGithubName/RepoName.git

origin是Git中远程库的默认叫法,也可以改成别的。这里远程仓库的全名是git@github.com:YourGithubName/RepoName.git,用origin来指代。

克隆 / 拉取

1
2
3
4
5
# 使用 SSH,速度最快
git clone git@github.com:YourGithubName/RepoName.git

# 使用 HTTPS
git clone https://github.com/YourGithubName/RepoName.git

推送

输入下面的指令将本地库的内容推送到远程库中:

1
2
# 第一次推送 master 分支加上 -u,可以把本地的 master 和远程 master 关联。后续不需要 -u
git push -u origin master

解绑

1
git remote rm origin

关联远程分支

upstream是本地分支默认对应的远程分支。

例如git push -u origin feature-123中的-u,是--set-upstream的缩写。该命令除了推送代码,还会将当前本地分支默认对应的远程分支设为feature-123,这样以后该分支直接git pullgit push都是对远程feature-123分支操作。

1
2
3
4
5
# 手动设置当前分支的 upstream
git branch --set-upstream-to=origin/feature-123

# 查看当前所有分支的 upstream
git branch -vv

将远程分支合并到本地

1
2
3
4
5
# 将本地的 git 记录更新
git fetch origin

git checkout my-local-branch
git merge origin/other-remote-branch

git stash

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 保存所有未提交的修改(包括暂存的和非暂存的)
git stash
git stash save "这是本次stash的说明"

# 查看所有存储
git stash list

# 恢复并删除最近的储存
git stash pop

# 使用并不删除指定的存储
git stash apply stash@{0}

# 删除指定存储
git stash drop stash@{0}

提交规范

VSCode 插件:git-commit-plugin

git-emoji大全

git-commit-plugin

该插件可帮助你规范commit描述格式,便于生成易于阅读且美观的提交。

效果

修改上次commit的描述

有时候我们提交的描述格式或内容填错了,想要覆盖掉之前的描述,只能重新commit一次,但这样就会多一个提交记录。

其实有一个不需要重新提交就可以修改上次commit描述的方法,详见这篇文章

结合Jira

在commit信息前加上Jira的任务编号,Jira会自动跟踪,在任务描述中附上提交链接