IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> git入门笔记 -> 正文阅读

[开发工具]git入门笔记

看完这个课程理解了一些东西,但很多东西也没搞清楚:比如rebase、还有团队协作的方式。这些还需要打一打基础或是一些深入学习,下面是对课程知识点的一些记录:

1. git的最小配置:user.nameuser.email

  • 配置user.nameuser.email
git config --global user.name 'your_name'
git config --global user.email 'your_email@domain.com'

这里填的email最好是真实的email,如果操作中出现问题,git管控的web系统可以自动向email发送邮件。

  • config的三个作用域
--local // 只对某个仓库有效
--global // 对当前用户所有仓库有效
--system // 对系统所有登录的用户有效(基本不用)
git config user.name 'your_name' // 缺省等同于local
  • 查看config的配置,不加范围值默认是全部的值的信息
git config --list --local(需要在仓库目录下执行)
git config --list --global
git config --list --system

当你golbal的仓库设置好用户之后,在文件内设置local的用户信息,是local的优先级高。优先级:local>global>system

2. 创建一个本地仓库

  1. 把已有项目代码纳入git仓库
cd 项目文件夹
git init
  1. 新建的项目直接用git管理
cd 某个文件夹
git init 项目名
cd 项目名

4. git文件重命名

git reset --hard // 暂存区、工作区路径上所有变更都会被清楚掉
git mv old_filename new_filename // 变更文件名

5.命令行查看版本历史commit

git log  // 当前分支(branch)历史
git log --all  // 所有分支(branch)历史
git log --oneline  // 简洁的git 提交记录
git log -n4 --online  // -nx最近的x次记录
git checkout -b temp commitid // 基于某个commitid创建一个分支,commitid也可以是一个分支名,因为分支的本质也是一个commitid
git commit -am 'xxx'  // 工作区若没有新增的,可以直接使用该命令直接add并commit
git branch -av // 查看所有分支的略缩信息
git log --all --graph // 所有分支历史,且关系树图形化
git log --online --all temp // 查看所有分支(而不是temp分支,--all 后面指定分支,以--all优先 )的所有commit的略缩信息;
git log --online temp // 查看当前分支
git help --web log // 查看log都有什么--参数

6. 视图查看(一般用于查看commit的关系树)

gitk --all

7. 探秘.git目录

  • config:当前 git 的配置文件,可直接在里面修改 user.nameuser.email
  • description:仓库的描述信息文件
  • HEAD:(指向当前所在的分支),例如当前在 develop 分支,该文件存储的当前的分支文件的地址 refs/heads/develop,若分支改变内容也会跟着改变
  • hooks [文件夹] :git执行时的钩子文件
  • objects [文件夹] :(存放所有的 git 对象,对象哈希值前 2 位作为文件夹名称,后 38 位作为对象文件名, 可通过 git cat-file -p 命令,拼接文件夹名称+文件名查看)
  • refs [文件夹]
    • heads:存放当前项目的所有分支
    • tags:存放的当前项目的所有标签,又叫做里程碑,比如开发到某个版本,可以打上标签标识

  • 一些相关的命令:
    ? cat :用来显示文件。 例如 cat text.md 显示 text.md 文件的内容
    ? ls -al:表示列出当前目录下的所有文件(包括隐藏文件)
    ? git cat-file -t 哈希值:查看哈希存放的是什么类型?是commitid还是tagid
    ? git cat-file -p 哈希值:查看哈希存放的是什么内容
    ? git cat-file -s 哈希值: 查看 git 对象的大小

8. commit、tree、blob的关系

在这里插入图片描述

  • commit:一个commit只对应一棵树。
  • tree: 树代表某一个commit的一个关系视图, 视图里面存放了当前commit对应的本项目仓库的所有的文件夹以及文件的快照,这个时间点文件夹和文件长什么样。
  • blob:是具体的某一个文件,且文件和文件名无关而与文件内容有关,例如:index1.htmlindex2.html 内容相同只会生成一个bolb,这样设计的好处可以大大节省存储空间。 `

9. 分离头指针

分离头指针:是指HEAD指针没有指向分支,而是直接指向某个commit的状态;一般情况下HEAD指针是指向分支的。

场景: 分离头指针产生commitid之后,若不关联分支,同事切换回某个分支,该commit会被丢掉。若关联分支,该commit才会被保留。

10. HEAD(头指针) 和 branch

  1. 可以指向分支和commit,也可以不跟分支挂钩(分离头状态)
  2. branch的内容记录的也是commit,所以HEAD最后落脚的是commit
git checkout -b 基于哪个分支 要创建的分支
git checkout -b 要创建的分支
git diff commit1 commit2 // 比较分支差异
git diff HEAD HEAD^1^ // 比较HEAD和HEAD的爷爷的比较

11.删除不需要的分支(一般不建议删远程仓库的分支)

如果分支没有合并(no-fast-forward)过使用-d删除会报错提示,此时确定可以删除 可以用-D删除

git branch -d branchname // 删除合并过的分支
git branch -D branchname // 强制删除

12. 修改最新commitmessage

修改最近一次的commitmessage

git commit --amend

进入vim编辑页面 --> 点击 i(英文输入法)开始编辑说明文字 --> 按esc 然后输入:wq!强制保存退出vim

13. 修改老旧的commitmessage

只适用我们未提交到远程仓库的分支

git rebase -i 输入要修改分支的父分支
copy xxxx
// 按i, 然后把copy改成r, esc :wq! 进入修改message
// 按i, 修改message,按esc :wq! 保存并退出

这个操作是git帮我们做的一个分离头指针操作,修改后commitid已经变了,但bolb对象还是那个blob对象

14. 合并commit(远程仓库不要执行该操作,会影响同事们的操作)

场景:多次提交的commit,本质上是同一个功能,这时候我们可以对commit进行合并让commit更简洁。

// rebase依然是基于父commit操作
git rebase -i xxxx
pick xxxx1
squash xxxx2
squash xxxx3
squash xxxx4
pick xxxx5
// 把2、3、4合并到1里面去

15. 把间隔的commit整理成1个

git rebase -i --root // 如果要操作root commit可以使用该命令

间隔的commit合并一般会有冲突,此时需要解决冲突,然后使用git rebase --continue,继续进入合并操作。

16. 暂存区和HEAD如何比较

git diff --cache
// --cache 表示暂存区
// 暂存区和HEAD比较差异

git diff 
// 默认比较工作区和暂存区的差异

git diff -- 具体文件名 具体文件名 具体文件名
// 工作区和暂存区某几个文件的差异

17. 暂存区还原成HEAD指向的代码

场景:

git reset HEAD
// 把暂存区所有的东西恢复成HEAD

git reset HEAD -- styles/style.css
// 把暂存区某个文件 恢复成HEAD的文件

git checkout -- 某个文件
// 把工作区恢复成暂存区,变更工作区的内容一般用checkout

18. 消除某个分析最近几次的提交

git reset --hard commitId
// 工作区暂存区都回退到这个分支的代码

git reset --hard HEAD^ 
// 工作区暂存区退回到上个版本

git reset --hard HEAD 退回到HEAD
// 工作区暂存区退回到HEAD

19. 看看不同的commit的差异

git diff branch1 branch2
// 所有文件, 分支可以换成不同的commit
git diff branch1 branch2 -- index.html
// index.html

20. 正确的删除文件

git rm 文件名
// 删除文件并提交到暂存区

21. 开发时遇到加急任务如何操作

git stash
// 存放
git stash list
git stash pop
// 存放的内容弹出来,删除stash里的该条内容
git stash apply
// 存放的内容弹出来,且不删除该条内容

22. 指定不需要管理的文件

.gitignore 文件

  • .d:以.d结尾的文件和文件夹都不被管控
  • .d/:该文件夹及文件夹下的不被管控,但.d文件会被管控

23. 将git远程代码拉取到本地的相关知识

  1. 常用的4种git传输协议
    • 本地协议1,例:/path/to/repo,git(相对路径),哑协议;
    • 本地协议2,例:file:///path/to/repo.git(///开头是三个斜杠),智能协议;
    • http/https协议,智能协议,使用该协议拉取代码需要输入账号密码;
      在这里插入图片描述
    • ssh,工作中最常用的智能协议,使用该协议拉取代码需要创建ssh公私钥,并把公钥配置在远程仓库对应的账号;
      在这里插入图片描述

    哑协议和智能协议的区别:1. 直观区别:哑协议不可见,智能协议可见,比如传输了多少东西,传输进度等;2.智能协议比较快;

  2. 相关命令:
git clone --bare 协议 仓库名称
// --bare 表示不带工作区的裸仓库

git remote -v
// 显示所有远程仓库

git remote show remote_name
// 显示要查看的远程仓库信息,git中常见的origin就是仓库名称

git remote add zhineng(remote的名称) 协议
// 创建远程仓库,并命名,若自己拉取的仓库代码,远程仓库会自动被命名为origin

git push zhineng
// 推送到zhineng远程仓库

git push --set-upstream zhineng master
// 把名为zhineng的远程仓库设为上游,默认会提交到该仓库

git push --set-upstream <remote> <branch>
// 该命令等同于 git push -u <remote> <branch>

24. 配置公私钥 (ssh协议)

gitub帮助文档地址

公私钥创建好之后可以在多个服务器上使用

ssh-keygen -t rsa -b 4096 -C 'your_email@163.com'
// 1. 默认生成用于SSH-2的RSA密钥。这里使用的是rsa。
// 2. -C用来注释,可以标识这个密钥,指出密钥的用途或其他有用的信息。在这里输入自己的邮箱或者其他都行。
// 3. 输入完会要求输入密语字符串(passphrase),不填表示没有密语。
// 4. 接着会让输入2次口令(password),空表示没有口令。
// 5. 次回车即可完成当前步骤,此时[c盘>用户>自己的用户名>.ssh]目录下已经生成好了。

id_rsa(文件名) 私钥(留在本地)
id_rsa(文件名) 公钥(放到github)

去profile-> ssh配置ssh(一个账号可以有多个公钥)

25. 个人github仓库的常用属性

  1. Description,可以让别人快速搜到你
  2. readme,搜索的时候会到readme中搜关键字的
  3. .gitignore,可以选不同语言的默认配置
  4. licenses,开源协议 MIT协议是可以商用的(在github创建的仓库会有这个文件,在本地创建的没有)

27. 什么是fast-forward

fast-forward到底是什么?
通俗的解释:commitcommit之间,子commit有一个箭头指向父commit,用这种方式,版本演变的历史就会形成一幅带方向的图,把commit比做人的话,孙子和爷爷之间,儿子和爸爸之间就是fast-forward的关系,而堂兄之间就不是fast-forward的关系了。

官网解释:fast-forwardmerge的一种特殊类型,你把A分支合入到B分支的时候,恰好B分支指向的commitA分支的祖先,在这种情况下,我们无须额外创建一个mergecommit,而只需把B分支指向A分支对应的commit就行。

举个例子,本地分支往远端分支做push,如果远端分支不是本地分支的祖先,那它俩就不是fast-forward 了。反之,它俩就是fast-forward的关系。

26. 本地推送到github

fetch是拉取,push是推送,pull拉取的时候会进行一些合并操作
rebasemerge 两种不同的合并方式

git remote add xxx
// 新增远端的仓库

git remote remove xxx
// 删除远端的仓库

git push xxx --all
// 将所有的分支push到xxx仓库,push之前要pull,否则远端仓库被其他人变更过远端的分支

git fetch remotename branchname
// 仅仅拉取远端的内容,不会做其他操作

git pull 
// 拉取远端的内容,并与本地的内容做一个合并

git merge remotename/master
// remotename/master合并到当前分支,两个分支必须有关联

git merge --allow-unrelated-histories remotename/master
// 合并两个没有关联的分支, 新生成的树是有两个父亲的

27. 多人协作,不同人修改了不同文件如何处理

如果不是我们自己创建的远程仓库名称,克隆下来的远端仓库名称默认都叫origin

场景:一个用户基于xxx分支创建分支并修改了一个文件并提交到远程,第二个用户拉取代码,基于xxx分支创建分支,修改了一些内容,此时未提交。

此时第一个用户又修改了一些东西提交到该分支,此时第二个用户开始提交,结果导致失败。

因为此时第二个用户xxx分支的commitid,远程xxx分支的commitid不一致,属于no-fast-forward

如何处理?

  1. 通过merge
git fetch
git merge github/xxx分支
// 把远程的xxx分支合并到当前的xxx分支
  1. pull也可以,pull会给远端的分支和本地分支自动merge,我把git pull理解为fetch + merge

28. 多人协作,有人修改了文件名并提交同时有人基于旧文件名修改了内容

git能感知到同一个文件的修改和重命名,但需要我们到vim确认esc:wq!

29. 多人协作,两个人都修改了文件名

会报冲突,且文件都保留到冲突中,需要rm不需要的文件,add想保留的文件

30. 禁止向集成(公共)分支执行push -f操作

-f即使不是fast-forward也能push上去,例如:当本地使用git reset --hard commitid111回到很早以前的commit作为HEAD,此时强制提交会删除掉远程仓库在commitid111之后的提交

31. 公共分支禁止更改历史

集成分支不要做rebase(变基)行为

32. issue是什么

github中的issue需求:bug和任务都可以放到issue管控。

33. github如何搜索想查找的项目

  • 关键字 + in:readme,在readme里面搜关键字,例:git学习资料in:readme
  • stars:>1000,星大于1000的项目。
  • language:javascript,项目的语言等。

34. 团队工作流

SETTING可以设置允许哪些本地代码合并的类型,可以设置通过审核才能进行合并
工作流:

  1. 主干开发,就直接再master上开发,不创建特性分支,并及时对代码进行更新。适用团队都是一些技术比较好的团队。在这里插入图片描述2. git flow(特性分支),包含了很多中版本:github flow是相对简单,但不流程并没那么完善的一种。在这里插入图片描述
  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-10-08 21:02:36  更:2022-10-08 21:05:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:26:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码