廖雪峰Git教程学习笔记

Posted Spring-_-Bear

tags:

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

原文链接:Git教程 - 廖雪峰的官方网站

一、Git 简介

Git 的诞生

集中式 vs 分布式

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

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

  • CVS 由于设计问题,会导致提交文件不完整、版本库损坏等情况;同样开源的 SVN 修正了 CVS 的一些稳定性问题,是目前用的最多的集中式版本库控制系统

二、安装 Git

  • 初始化配置 git 用户名和邮件地址
git config --global user.name "username"
git config --global user.email "user-email"

三、创建版本库

  • 初始化版本库
git init
  • 添加文件到仓库
git add readme.txt
  • 把文件提交到仓库
git commit -m "create readme.txt file"

四、时光机穿梭

  • 查看工作区状态
git status
  • 查看文件差异
git diff

版本回退

  • 查看 commit 日志
git log
  • 一行一行显示
git log --pretty=oneline
  • HEAD 表示当前版本,HEAD^ 表示上一个版本,HEAD^^ 表示上上个版本,HEAD~100 表示上 100 个版本

  • 回退到上一个版本,前提是未推送到远程仓库

git reset --hard HEAD^
  • 查看所有操作过的命令
git reflog

工作区与暂存区

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

管理修改

  • Git 比其它版本控制系统设计得优秀的原因:Git 跟踪并管理的是修改,而非文件

  • 先修改文件,然后添加到暂存区,而后再次修改文件,最后提交。使用 git status 查看状态,发现文件处于修改状态,证明了 Git 跟踪管理的是修改而非文件

  • 查看工作区中的文件与版本库中最新版本的区别

git diff HEAD -- readme.txt

撤销修改

  • 撤销未添加到暂存区的修改
git restore readme.txt
  • 撤销添加到暂存区
git restore --staged readme.txt

删除文件

  • 从版本库中删除文件并提交
git rm test.txt
git commit
  • 从版本库中恢复工作区已删除的文件
git restore test.txt

五、远程仓库

  • 创建 SSH key
ssh-keygen -t rsa -C "springbear2020@163.com"

添加远程库

  • 将本地仓库与远程仓库相关联,origin 为远程库的名字
git remote add origin https://gitee.com/Spring-_-Bear/temp.git
  • 第一次推送使用 -u 参数,将本地分支内容推送到远程分支,还会将本地的 master 分支和远程的 master 分支关联起来
git push -u origin master
  • 将本地 master 分支的最新修改推送到远程仓库
git push origin master
  • 查看远程仓库信息
git remoter -v
  • 解除本地仓库与远程仓库的关联关系
git remote rm origin

从远程库克隆

  • 从远程库克隆
git clone git@gitee.com:Spring-_-Bear/temp.git

六、分支管理

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

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

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

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

  • 合并完分支后,甚至可以删除 dev 分支。删除 dev 分支就是把 dev 指针给删掉

创建与合并分支

  • 创建并切换到 dev 分支
git switch -c dev
  • 查看分支
git branch
  • 切换分支
git switch master
  • 合并分支到当前分支,Fast-forward - 直接将 master 指向 dev 的当前提交
git merge dev
  • 删除分支
git branch -d dev

解决冲突

  • 当在两个分支上都对同一个文件做出修改提交后,尝试合并时会产生冲突,手动解决冲突后重新提交

  • 查看分支的合并情况

git log --graph --pretty=oneline --abbrev-commit

分支管理策略

  • 分支合并时 Git 默认使用 Fast forward 模式,此种模式下,删除分支后会丢失分支信息

  • 禁用 Fast forward 模式合并分支

git merge --no-ff -m "merge with no-ff" dev

  • 分支策略
  1. master 分支仅用来发布新版本,推送到远程分支
  2. dev 分支用来管理团队的提交,后将 dev 分支合并到 master 分支

Bug 分支

  • 隐藏当前分支的“工作现场”
git stash
  • 查看隐藏的“工作现场”
git stash list
  • 恢复工作现场并删除
git stash pop
  • 恢复到指定的工作现场
git stash apply stash@0
  • 删除指定的工作现场
git stash drop stash@0
  • 复制一个特定的提交到当前分支
git cherry-pick 9863d08

Feature 分支

  • 添加一个新功能时,最好新建一个 feature 分支,完成工作后合并到 dev 分支,最后删除 feature 分支

  • 强行删除没有被合并过的分支

git branch -D feature

多人协作

  • 当从远程仓库克隆时,实际上 Git 自动把本地的 master 分支与远程库的 master 分支管理起来的,远程库默认名称是 origin

  • 查看远程库的详细信息

git remote -v
  • 将指定的本地分支推送到远程库的对应分支上
git push origin master
  • 根据远程库的 dev 分支新建本地 dev 分支
git switch -c dev origin/dev
  • 将本地 dev 分支与远程 dev 分支进行关联
git branch --set-upstream-to=origin/dev dev
  • 从远程抓取
git pull
  • 多人协作的工作模式
  1. 尝试推送自己的分支修改到远程库的对应分支上:git push orgin branch_name
  2. 推送失败,远程库已被小伙伴修改在前,使用 git pull 尝试合并
  3. 若合并有冲突则本地解决冲突后重新推送

Rebase

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

七、标签管理

  • tag 就是一个有意义的的名字,跟某个 commit 绑定

创建标签

  • 切换到某个分支
git switch branch_name
  • 给指定的 commit 打上标签
git tag tag_name commit_id
  • 查看所有标签
git tag
  • 查看标签信息
git show tag_name
  • 创建标签同时指定标签描述
git tag -a tag_name -m "tag_describtion" commit_id
  • 标签总是和某个 commit 绑定,若这个 commit 即出现在 master 分支,又出现在 dev 分支,那么这两个分支上都可以看到这个标签

操作标签

  • 删除本地标签
git tag -d tag_name
  • 推送本地标签到远程库
git push origin tag_name
  • 一次性推送本地所有标签到远程库
git push origin --tags
  • 默认情况下创建的标签都只存储在本地,不会自动推送到远程库

  • 删除已经推送到远程库的标签

  1. 先删除本地标签
git tag -d tag_name
  1. 删除远程库标签
git push origin :refs/tags/tag_name

八、使用 Github

九、使用 Gitee

十、自定义 Git

  • 配置 git 颜色
git config --global color.ui true

忽略特殊文件

  • 忽略文件的原则是
  1. 忽略操作系统自动生成的文件,比如缩略图等
  2. 忽略编译生成的中间文件、可执行文件等,比如 Java 编译生成的 .class 文件等
  3. 忽略带有敏感信息的配置文件,比如存放口令的配置文件等
  4. .* 排除所有 . 开头的隐藏文件
  5. *.class 排除所有 .class 文件
  6. !spirngbear.class 不排除 spirngbear.class 文件
  • 强制提交已被 .gitignore 忽略的文件
git add -f filename

配置别名

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"

搭建 Git 服务器

  1. 安装 git
sudo apt-get install git
  1. 创建一个 git 用户,用来运行 git 服务
sudo adduser git
  1. 收集所有需要登录的用户的公钥(id_rsa.pub),导入到
/home/git/.ssh/authorized_keys
  1. 初始化 git 仓库,git 就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的 git 仓库纯粹是为了共享,所以不让用户直接登录到服务区上区修改工作区,并且服务器的 git 仓库通常都以 .git 结尾,把 owner 改为git
sudo git init --bare sample.git
sudo chown -R git:git sample.git
  1. 禁用 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

十一、使用 SourceTree

十二、期末总结

序号命令功能
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教程