[Git]廖雪峰 Git 教程精要知识点总结
Posted Spring-_-Bear
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Git]廖雪峰 Git 教程精要知识点总结相关的知识,希望对你有一定的参考价值。
Git
1. 集中式 vs 分布式
- 集中式版本控制系统(CVS、SVN):由中央服务器负责版本控制,必须联网才能工作
- 分布式版本控制系统(Git):没有所谓 “中央服务器”,每个人的电脑上都是一个完整的版本库,安全性高
- CVS 由于设计问题,会导致提交文件不完整、版本库损坏等情况;同样开源的 SVN 修正了 CVS 的一些稳定性问题,是目前用的最多的集中式版本库控制系统
2. 初始化配置
// 初始化配置 git 用户名和邮件地址
git config --global user.name "username"
git config --global user.email "user-email"
3. 创建版本库
// 1. 初始化版本库
git init
// 2. 添加文件到仓库
git add readme.txt
// 3. 把文件提交到仓库
git commit -m "create readme.txt file"
4. 查看状态
// 1. 查看工作区状态
git status
// 2. 查看文件差异
git diff
5. 版本回退
HEAD
表示当前版本,HEAD^
表示上一个版本,HEAD^^
表示上上个版本,HEAD~100
表示上 100 个版本
// 1. 查看 commit 日志
git log
// 2. 查看 commit 日志且一行一行显示
git log --pretty=oneline
// 3. 回退到上一个版本,前提是未推送到远程仓库
git reset --hard HEAD^
// 4. 查看所有操作过的命令
git reflog
6. 工作区与暂存区
- 工作区(
working directory
)、版本库(repository
)git add
:把文件添加到暂存区git commit
:把暂存区的所有内容提交到当前分支
7. 管理修改
- Git 比其它版本控制系统设计得优秀的原因:Git 跟踪并管理的是修改,而非文件
- 先修改文件,然后添加到暂存区,而后再次修改文件,最后提交。使用
git status
查看状态,发现文件处于修改状态,证明了 Git 跟踪管理的是修改而非文件
// 查看工作区中的文件与版本库中最新版本的区别
git diff HEAD -- readme.txt
8. 撤销修改
// 1. 撤销未添加到暂存区的修改
git restore readme.txt
// 2. 撤销添加到暂存区
git restore --staged readme.txt
9. 删除文件
// 1. 从版本库中删除文件并提交
git rm test.txt
git commit
// 2. 从版本库中恢复工作区已删除的文件
10. 远程仓库
// 1. 创建 SSH key
ssh-keygen -t rsa -C "springbear2020@163.com"
// 2. 将本地仓库与远程仓库相关联,origin 为远程库的名字
git remote add origin https://gitee.com/Spring-_-Bear/temp.git
// 3. 推送到远程库,第一次推送使用 -u 参数,将本地分支内容推送到远程分支,还会将本地的 master 分支和远程的 master 分支关联起来
git push -u origin master
// 4. 将本地 master 分支的最新修改推送到远程仓库
git push origin master
// 5. 查看远程仓库信息
git remoter -v
// 6. 解除本地仓库与远程仓库的关联关系
git remote rm origin
// 7. 从远程库克隆
git clone git@gitee.com:Spring-_-Bear/temp.git
11. 分支管理
HEAD
严格来说不是指向提交,而是指向master
,master
才是指向提交的,所以,HEAD
指向的就是当前分支
- 当我们创建新的分支如
dev
时,Git 新建了一个指针dev
,指向与master
相同的提交,再把HEAD
指向dev
,就表示当前分支在dev
上
- 从
HEAD
指向dev
分支开始,对工作区的修改和提交就是针对dev
分支了,比如新提交一次后,dev
指针向前移动一步,而master
指针不变
- 假如我们在
dev
分支上的工作完成了,就可以把dev
合并到master
上,最简单的合并办法就是把master
指针指向dev
的当前提交
- 合并完分支后,甚至可以删除 dev 分支。删除 dev 分支就是把 dev 指针给删掉
12. 创建与合并分支
// 1. 创建并切换到 dev 分支
git switch -c dev
// 2. 查看分支
git branch
// 3. 切换分支
git switch master
// 4. 合并分支到当前分支,Fast-forward - 直接将 master 指向 dev 的当前提交
git merge dev
// 5. 删除分支
git branch -d dev
13. 解决冲突
当在两个分支上都对同一个文件做出修改提交后,尝试合并时会产生冲突,需手动解决冲突后重新提交
// 查看分支的合并情况
git log --graph --pretty=oneline --abbrev-commit
14. 分支管理策略
- 分支合并时 Git 默认使用 Fast forward 模式,此种模式下,删除分支后会丢失分支信息
// 禁用 Fast forward 模式合并分支
git merge --no-ff -m "merge with no-ff" dev
- master 分支仅用来发布新版本,推送到远程分支
- dev 分支用来管理团队的提交,后将 dev 分支合并到 master 分支
15. Bug 分支
// 1. 隐藏当前分支的 “工作现场”
git stash
// 2. 查看隐藏的 “工作现场”
git stash list
// 3. 恢复工作现场并删除
git stash pop
// 4. 恢复到指定的工作现场
git stash apply stash@0
// 5. 删除指定的工作现场
git stash drop stash@0
// 6. 复制一个特定的提交到当前分支
git cherry-pick 9863d08
16. Feature 分支
添加一个新功能时,最好新建一个
feature
分支,完成工作后合并到dev
分支,最后删除feature
分支
// 强行删除没有被合并过的分支
git branch -D feature
17. 多人协作
当从远程仓库克隆时,实际上 Git 自动把本地的
master
分支与远程库的master
分支管理起来的,远程库默认名称是origin
// 1. 根据远程库的 dev 分支新建本地 dev 分支
git switch -c dev origin/dev
// 2. 将本地 dev 分支与远程 dev 分支进行关联
git branch --set-upstream-to=origin/dev dev
// 3. 从远程拉取
git pull
多人协作的工作模式:
- 尝试推送自己的分支修改到远程库的对应分支上:
git push orgin branch_name
- 推送失败,远程库已被小伙伴修改在前,使用
git pull
尝试合并- 若合并有冲突则本地解决冲突后重新推送
18. Rebase
rebase
操作可以把本地未push
的分支提交历史整理成直线rebase
的目的是使我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比
19. 标签管理
tag
就是一个有意义的的名字,跟某个commit
绑定,标签总是和某个 commit 绑定,若这个 commit 即出现在 master 分支,又出现在 dev 分支,那么这两个分支上都可以看到这个标签默认情况下创建的标签都只存储在本地,不会自动推送到远程库
// 1. 给指定的 commit 打上标签
git tag tag_name commit_id
// 2. 查看所有标签
git tag
// 3. 查看标签信息
git show tag_name
// 4. 创建标签同时指定标签描述
git tag -a tag_name -m "tag_describtion" commit_id
// 5. 删除本地标签
git tag -d tag_name
// 6. 推送本地标签到远程库
git push origin tag_name
// 7. 一次性推送本地所有标签到远程库
git push origin --tags
// 8. 删除已经推送到远程库的标签
// 8.1 先删除本地标签
git tag -d tag_name
// 8.2 删除远程库标签
git push origin :refs/tags/tag_name
20. 自定义 Git
// 配置 git 颜色
git config --global color.ui true
21. 忽略特殊文件
忽略文件的原则是:
- 忽略操作系统自动生成的文件,比如缩略图等
- 忽略编译生成的中间文件、可执行文件等,比如
Java
编译生成的.class
文件等- 忽略带有敏感信息的配置文件,比如存放口令的配置文件等
.*
排除所有.
开头的隐藏文件*.class
排除所有.class
文件!spirngbear.class
不排除spirngbear.class
文件
// 强制提交已被 .gitignore 忽略的文件
git add -f filename
22. 命令别名
git config --global alias.st status
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"
23. 搭建 Git 服务器
// 1. 安装 git
sudo apt-get install git
// 2. 创建一个 git 用户,用来运行 git 服务
sudo adduser git
// 3. 收集所有需要登录的用户的公钥(id_rsa.pub),导入到
/home/git/.ssh/authorized_keys
// 4. 初始化 git 仓库,git 就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的 git 仓库纯粹是为了共享,所以不让用户直接登录到服务区上区修改工作区,并且服务器的 git 仓库通常都以 .git 结尾,把 owner 改为 git
sudo git init --bare sample.git
sudo chown -R git:git sample.git
// 5. 禁用 git 用户使用 shell 登录,编辑 /etc/passwd 文件完成,将上一行的内容改为下一行,修改成功后 git 用户可以正常通过 ssh 使用 git,但无法登录 shell
git:x:1001:1001:,,,:/home/git:/bin/bash
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
24. 命令总结
序号 | 命令 | 功能 |
---|---|---|
1 | git config --global user.name <name> | 配置全局用户名。省略 --global 参数则配置的当前 repo 的用户名 |
2 | git config --global user.email <email> | 配置全局用户邮箱。省略 --global 参数则配置的当前 repo 的邮箱 |
3 | git config --global --edit | 打开当前用户的 git 全局配置并编辑 |
4 | git config --global alias.<alias-name> <git-command> | 配置一个 git 命令的快捷方式 |
5 | git config --system core.editor <editor> | 配置文本编辑器 |
6 | git init <directory> | 在指定目录里下创建一个空的 repo。省略参数则在当前目录创建 |
7 | git add <directory> | 将指定目录的文件加入到暂存区。若参数是文件则将文件添加到暂存区 |
8 | git commint -m “<message>” | 提交暂存区的修改,使用指定的提交信息 |
9 | git commit -m <message> --amend | 将当前 staged 修改合并到最近一次的 commit 中 |
10 | git status | 查看仓库状态 |
11 | git log | 以缺省格式显示全部 commit 历史 |
12 | git log -<limit> | 限制 log 的显示数量 |
13 | git log --oneline | 每行显示一条 commit |
14 | git log --author=“<pattern>” | 按提交者名字搜索并显示 commit |
15 | git log --grep=“<pattern>” | 按指定内容搜索并显示 commit |
16 | git log <since>…<until> | 显示指定范围的 commit。参数可以是 commit id、分支名称、HEAD 或任意相对位置 |
17 | git log – <file> | 仅显示包含指定文件修改的 commit |
18 | git reflog | 显示本地 repo 的所有commit 日志 |
19 | git diff | 比较暂存区和工作区的修改 |
20 | git diff HEAD | 比较工作区和上一次 commit 后的修改 |
21 | git diff --cached | 比较工作区和上一次 commit 后的修改 |
22 | git revert <commit> | 回滚到指定的 commit |
23 | git switch -c <branch> | 创建并切换到一个新分支。省略 -c 参数将切换到指定分支 |
24 | git branch | 显示本地 repo 的所有分支 |
25 | git log --graph | 显示图形化的 branch 信息 |
26 | git merge <branch> | 将指定的分支合并到当前分支 |
27 | git reset <file> | 将 file 从暂存区移除,但保持工作区不变 |
28 | git reset | 移除暂存区的所有修改,但不会影响到工作区 |
29 | git reset --hard | 移除所有暂存区的修改,并强制删除所有工作区的修改 |
30 | git reset <commit> | 将当前分支回滚到指定 commit,清除暂存区的修改,但保持工作区状态不变 |
31 | git reset --hard <commit> | 将当前分支回滚到指定 commit,清除暂存区的修改,并强制删除工作区的修改 |
32 | git remote add <name> <url> | 添加一个新的远程连接。用 <name> 作为远程库的名称 |
33 | git clone <repository> | 克隆一个指定的 repo 到本地,指定的 repo 可以是本地文件系统或者由 http、ssh 指定的远程路径 |
34 | git push <remote> <branch> | 将本地指定分支推送到远程库,若远程库中无此分支则自动创建 |
35 | git push <remote> --force | 将本地分支推送到远程库 |
36 | git push <remote> --tags | 本地所有的 tag 推送到远程库 |
37 | git pull <remote> | 从指定远程库抓取所有分支的 commit 并立刻合并到本地 repo |
38 | git fetch <remote> <branch> | 从指定的远程库抓取指定分支的所有 commit 到本地 repo。省略 <branch> 参数将抓取远程库的所有修改 |
39 | git pull --rebase <reomote> | 抓取远程库所有分支,并以 rebase 模式并入本地 repo 而不是 merge |
40 | git rebase <base> | 基于 <base> 对当前分支进行 rebase,<base> 可以是 commit、分支名称、tag 或相对于 HEAD 的 commit |
41 | git rebase -i <base> | 以交互模式对当前分支做 rebase |
以上是关于[Git]廖雪峰 Git 教程精要知识点总结的主要内容,如果未能解决你的问题,请参考以下文章
廖雪峰Git教程笔记与总结 -- Git简介常用命令分支管理