[Git]廖雪峰 Git 教程精要知识点总结

Posted Spring-_-Bear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Git]廖雪峰 Git 教程精要知识点总结相关的知识,希望对你有一定的参考价值。

Git

1. 集中式 vs 分布式

  1. 集中式版本控制系统(CVS、SVN):由中央服务器负责版本控制,必须联网才能工作

  1. 分布式版本控制系统(Git):没有所谓 “中央服务器”,每个人的电脑上都是一个完整的版本库,安全性高

  1. 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. 工作区与暂存区

  1. 工作区(working directory)、版本库(repository
  2. git add:把文件添加到暂存区
  3. git commit:把暂存区的所有内容提交到当前分支

7. 管理修改

  1. Git 比其它版本控制系统设计得优秀的原因:Git 跟踪并管理的是修改,而非文件
  2. 先修改文件,然后添加到暂存区,而后再次修改文件,最后提交。使用 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. 分支管理

  1. HEAD 严格来说不是指向提交,而是指向 mastermaster 才是指向提交的,所以,HEAD 指向的就是当前分支

  1. 当我们创建新的分支如 dev 时,Git 新建了一个指针 dev,指向与 master 相同的提交,再把 HEAD 指向 dev,就表示当前分支在 dev

  1. HEAD 指向 dev 分支开始,对工作区的修改和提交就是针对 dev 分支了,比如新提交一次后,dev 指针向前移动一步,而 master 指针不变

  1. 假如我们在 dev 分支上的工作完成了,就可以把 dev 合并到 master 上,最简单的合并办法就是把 master 指针指向 dev 的当前提交

  1. 合并完分支后,甚至可以删除 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. 分支管理策略

  1. 分支合并时 Git 默认使用 Fast forward 模式,此种模式下,删除分支后会丢失分支信息
// 禁用 Fast forward 模式合并分支
git merge --no-ff -m "merge with no-ff" dev

  1. master 分支仅用来发布新版本,推送到远程分支
  2. 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

多人协作的工作模式:

  1. 尝试推送自己的分支修改到远程库的对应分支上:git push orgin branch_name
  2. 推送失败,远程库已被小伙伴修改在前,使用 git pull 尝试合并
  3. 若合并有冲突则本地解决冲突后重新推送

18. Rebase

  1. rebase 操作可以把本地未 push 的分支提交历史整理成直线
  2. rebase 的目的是使我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比

19. 标签管理

  1. tag 就是一个有意义的的名字,跟某个 commit 绑定,标签总是和某个 commit 绑定,若这个 commit 即出现在 master 分支,又出现在 dev 分支,那么这两个分支上都可以看到这个标签

  2. 默认情况下创建的标签都只存储在本地,不会自动推送到远程库

// 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. 忽略特殊文件

忽略文件的原则是:

  1. 忽略操作系统自动生成的文件,比如缩略图等
  2. 忽略编译生成的中间文件、可执行文件等,比如 Java 编译生成的 .class 文件等
  3. 忽略带有敏感信息的配置文件,比如存放口令的配置文件等
  4. .* 排除所有 . 开头的隐藏文件
  5. *.class 排除所有 .class 文件
  6. !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. 命令总结

序号命令功能
1git config --global user.name <name>配置全局用户名。省略 --global 参数则配置的当前 repo 的用户名
2git config --global user.email <email>配置全局用户邮箱。省略 --global 参数则配置的当前 repo 的邮箱
3git config --global --edit打开当前用户的 git 全局配置并编辑
4git config --global alias.<alias-name> <git-command>配置一个 git 命令的快捷方式
5git config --system core.editor <editor>配置文本编辑器
6git init <directory>在指定目录里下创建一个空的 repo。省略参数则在当前目录创建
7git add <directory>将指定目录的文件加入到暂存区。若参数是文件则将文件添加到暂存区
8git commint -m “<message>”提交暂存区的修改,使用指定的提交信息
9git commit -m <message> --amend将当前 staged 修改合并到最近一次的 commit 中
10git status查看仓库状态
11git log以缺省格式显示全部 commit 历史
12git log -<limit>限制 log 的显示数量
13git log --oneline每行显示一条 commit
14git log --author=“<pattern>”按提交者名字搜索并显示 commit
15git log --grep=“<pattern>”按指定内容搜索并显示 commit
16git log <since>…<until>显示指定范围的 commit。参数可以是 commit id、分支名称、HEAD 或任意相对位置
17git log – <file>仅显示包含指定文件修改的 commit
18git reflog显示本地 repo 的所有commit 日志
19git diff比较暂存区和工作区的修改
20git diff HEAD比较工作区和上一次 commit 后的修改
21git diff --cached比较工作区和上一次 commit 后的修改
22git revert <commit>回滚到指定的 commit
23git switch -c <branch>创建并切换到一个新分支。省略 -c 参数将切换到指定分支
24git branch显示本地 repo 的所有分支
25git log --graph显示图形化的 branch 信息
26git merge <branch>将指定的分支合并到当前分支
27git reset <file>将 file 从暂存区移除,但保持工作区不变
28git reset移除暂存区的所有修改,但不会影响到工作区
29git reset --hard移除所有暂存区的修改,并强制删除所有工作区的修改
30git reset <commit>将当前分支回滚到指定 commit,清除暂存区的修改,但保持工作区状态不变
31git reset --hard <commit>将当前分支回滚到指定 commit,清除暂存区的修改,并强制删除工作区的修改
32git remote add <name> <url>添加一个新的远程连接。用 <name> 作为远程库的名称
33git clone <repository>克隆一个指定的 repo 到本地,指定的 repo 可以是本地文件系统或者由 http、ssh 指定的远程路径
34git push <remote> <branch>将本地指定分支推送到远程库,若远程库中无此分支则自动创建
35git push <remote> --force将本地分支推送到远程库
36git push <remote> --tags本地所有的 tag 推送到远程库
37git pull <remote>从指定远程库抓取所有分支的 commit 并立刻合并到本地 repo
38git fetch <remote> <branch>从指定的远程库抓取指定分支的所有 commit 到本地 repo。省略 <branch> 参数将抓取远程库的所有修改
39git pull --rebase <reomote>抓取远程库所有分支,并以 rebase 模式并入本地 repo 而不是 merge
40git rebase <base>基于 <base> 对当前分支进行 rebase,<base> 可以是 commit、分支名称、tag 或相对于 HEAD 的 commit
41git rebase -i <base>以交互模式对当前分支做 rebase

以上是关于[Git]廖雪峰 Git 教程精要知识点总结的主要内容,如果未能解决你的问题,请参考以下文章

廖雪峰Git教程笔记与总结 -- Git简介常用命令分支管理

廖雪峰Git教程笔记与总结 -- Git简介常用命令分支管理

廖雪峰的git教程总结

学习总结Git学习-参考廖雪峰老师教程九-使用码云

git

廖雪峰Git教程学习笔记