Git 学习文档

Learn Process

创建版本库

1
2
# git init 把目录变成Git可以管理的仓库, .git是版本库
git init

添加文件到仓库

1
2
3
4
# git add 将文件提交到暂存区
git add <filename>
# git commit 将文件提交到版本库
git commit -m "<提交说明>"

查看仓库的状态

1
2
3
4
5
6
7
8
# 掌握仓库当前的状态
git status
# 查看工作区与暂存区之间的修改
git diff <filename>
# 查看暂存区与版本库之间的修改
git diff --cached <filename>
# 查看工作区与版本库之间的修改
git diff HEAD -- <filename>

提交日志

HEAD -> master标识当前分支的HEAD的位置, origin/master标识出远程origin的位置

1
2
3
4
5
6
7
8
# 显示从最近到最远的提交日志
git log
# 精简信息
git log --pretty=oneline
# 日志图
git log --graph
# 日志图, 查看分支的合并
git log --graph --pretty=oneline --abbrev-commit

回溯

1
2
3
4
5
6
# 将当前版本回溯到以前的一个版本, 上一个版本HEAD^, 以此类推, 也可以写成HEAD~<num>
git reset --hard HEAD^
# 以commit id(版本号)回溯, 可以用来回溯到最新的提交处
git reset --hard <commit id>
# 记录每次的命令, 可以定位版本号
git reflog

撤销与删除

1
2
3
4
5
6
7
8
9
10
11
12
# 丢弃工作区的修改, 注意"--"
# 自修改后还没有被放到暂存区, 撤销修改就回到和版本库一模一样的状态
# 已经添加到暂存区后,又作了修改, 撤销修改就回到添加到暂存区后的状态
git checkout -- <filename>
# 将暂存区的修改撤销, 重新放回工作区
git reset HEAD <filename>
# 从版本库中删除该文件
rm <filename>
git rm <filename>
git commit -m "<提交信息>"
# 错误删除, 将误删文件恢复到最新版本
git checkout -- <filename>

远程仓库

1
2
3
4
5
6
7
8
9
10
# 将本地仓库与远程关联
# 远程库的名字为默认为origin, 多个远程库时需要不同的名称来标识
git remote add origin [email protected]:<GitHub账号名称>/<Repository name>
# 推送, 将当前分支master推送
# -u 由于远程库是空的, 第一次推送分支的所有内容时, 可以将本地的master和远程的master分支关联起来
git push -u origin master
# 本地提交后可以省去-u
git push origin master
# 最好的方式先创建远程库, 从远程克隆
git clone [email protected]:<GitHub账户名称>/<Repository name>

多人协作

master分支是主分支, 要时刻与远程同步; 分支是开发分支, 需要与远程同步; Bug分支只用于在本地修复Bug, 不需要同步; Feature分支可以选择是否同步.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 查看远程库信息
git remote
# 显示更加详细的信息
git remote -v
# 删除已关联的远程库
git remote rm origin
# 创建远程origin的<new>分支
git checkout -b <new> origin/<new>
# 设置<new>与远程origin/<new>的链接
git branch --set-upstream-to=origin/<new> <new>
# 将最新的提交从origin/<new>抓下来, 在本地合并, 再次推送
# git pull 需要指定本地分支与远程分支的链接
git pull
# 合并有冲突, 需要手动解决
git commit -m ""
git push origin <new>

工作模式

  1. 试图推送
  2. 推送失败, 先用git pull试图合并
  3. 合并有冲突, 解决冲突, 并在本地提交
  4. 没有冲突后, 提交

分支

1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建并切换分支
git checkout -b <name>
# -b 表示创建并切换, 是下面两条命令的精简
# 创建分支
git branch <name>
# 切换分支
git checkout <name>
# 查看当前分支
git branch
# 将分支test合并到当前分支
git merge test
# 删除分支, 该分支信息会丢弃(在Fast Forward模式下)
git branch -d <name>

最新版本的Git的新的切换命令:

1
2
3
4
# 创建并切换分支
git switch -c <name>
# 切换分支
git switch <name>

新建的分支使用完成后, 应该删除:

1
2
# 将<new>分支合并并记录分支信息(禁用FF)
git merge --no-ff -m "<分支信息>" <new>

分支策略:

master分支应该稳定, 应仅用来发布新版本

分支是不稳定的, 在新版本发布时, 把分支合并到master上

每个人应在分支再次分支, 可以每时的在分支合并

Bug分支

储藏当前工作:

1
2
# 应用于临时工作
git stash

创建Bug分支:

1
2
3
4
5
6
7
# 需要创建临时分支, 确认需要在哪个分支上创建分支
git checkout <name>
git checkout -b <newname>
git add <filename>
git commit -m "<提交信息>"
git checkout <name>
git merge --no-ff -m "<分支信息>" <new>

恢复到之前储藏工作:

1
2
3
4
5
6
7
8
9
10
11
git checkout <name>
# 查看储藏工作
git stash list
# 恢复, stash内容并不删除
git stash apply
# 删除
git stash drop
# 恢复并删除
git stash pop
# 多次stash, 恢复指定stash
git stash apply stash@{}

将修改Bug的分支的提交复制到其他分支:

1
2
# 复制一个特定的提交到当前分支
git cherry-pick <commit id>

Feature分支

用于添加新功能, 新建Feature分支:

1
2
# 要丢弃一个没有被合并过的分支(其中有未提交文件)
git branch -D <name>

Rebase变基

将本地的提交放到了分支之后, 使得整个提交历史变成一条直线, rebase操作前后, 最终的提交内容是一致的. 本地的commit修改内容已经变化了, 它的修改不再基于分支起点, 而是基于合并后的分支, 但最后的提交内容是一致的.

缺点: 本地的分支提交已经被修改过了.

1
git rebase

使用情形和原则

只对尚未推送或分享给别人的本地修改执行变基操作清理历史, 从不对已推送至别处的提交执行变基操作, 因为变基操作会改变提交历史记录.

1
2
3
4
5
6
# 基于远程分支origin, 创建一个test分支
git checkout -b test origin
# 在rebase的过程中, 出现冲突, 解决之后, 用"git-add"命令去更新, 之后无需执行git-commit
git rebase --continue
# 可以使用--abort终止rebase的行动, 并且test分支会回到rebase开前的状态
git rebase --abort

标签管理

标签可以确定打标签时刻的版本, 所以, 标签也是版本库的一个快照(标签就是指向某个commit的指针). 默认标签是打在最新提交的commit上的.

标签不是按照时间顺序列出, 而是按照字母排序.

1
2
3
4
5
6
7
8
9
10
11
12
# 切换要打标签的分支
git branch
# 新标签
git tag v1.0
# 查看所有的标签
git tag
# 利用版本号对提交打标签
git tag v1.0 <commit id>
# 查看标签信息, 标签说明
git show <tagname>
# 创建带有说明的标签, 用-a指定标签名, -m指定说明文字
git tag -a v1.0 -m "<tag message>" <commit id>

标签总是和某个commit挂钩. 如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签.

操作标签

创建的标签都只存储在本地, 不会自动推送到远程.

1
2
3
4
5
6
7
8
9
# 删除标签
git tag -d v1.0
# 推送某个标签到远程
git push origin <tagname>
# 一次性推送全部尚未推送到远程的本地标签
git push origin --tags
# 若标签已经推送到远程, 删除标签
git tag -d v1.0
git push origin :refs/tags/v1.0

自定义Git

忽略原则(版本管理)

忽略操作系统自动生成的文件,比如缩略图等.

忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件.

忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 使Git显示颜色(文件名颜色显示)
git config --global color.ui true
# 忽略文件, 创建.gitignore文件, 将需要忽略的文件名添加进去, 最后将其提交
# 配置文件 https://github.com/github/gitignore
# 添加到忽略文件中的相关文件不能add到暂存区, 需要-f强制添加到Git
git add -f <filename>
# 检查.gitignore的错误
git check-ignore -v <filename>
# 配置别名
# alias.co checkout
# alias.ci commit
# alias.br branch
# alias.unstage 'reset HEAD'
# alias.last 'log -l' 显示最后一次提交信息
# git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" 将log格式化
git config --global alias.st status
# 仓库的Git配置文件都放在.git/config
# 当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig

Reference

Git教程

Git Rebase

0%