Git学习
学习git之前,需要明白一个概念,版本控制
版本控制
什么是版本控制,版本迭代,新的版本!版本管理器
版本控制简单来说就是用于管理多人协同开发项目的一项技术
常见的版本控制工具
- Git
- SVN
- CVS
- VSS
- TFS
- Visual studio Online
版本控制分类
1、本地版本控制
适合个人用,如RCS
2、集中版本控制 SVN
版本数据都保存在服务器上,服务器坏了就嘎了,可以通过定期备份带解决。代表:SVN
3、分布式版本控制 Git
所以版本信息仓库全部同步到本地的每个用户,可以离线在本地提交,只需在联网后push到服务器
Git与SVN的最主要区别
SVN需要从服务器手动得到最新版本,需要把自己做完的活上传到服务器,必须联网才能工作
Git队友提交了更新代码,我电脑上的版本自动更新了,不需要手动操作。我离线可以提交代码,等到有网络时上传到服务器,上传好了以后队友的电脑代码文件也更新了
Git历史
Git免费,开源。最初是为了辅助Linux内核开发,来替代Bitkeeper。
Git配置
所以东西下载慢的话就可以找镜像下(淘宝,阿里等)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pQZTvtKO-1684315182464)(C:\Users\zw\AppData\Roaming\Typora\typora-user-images\image-20230516092424820.png)]
Git Bash: Linux风格命令行,用的最多,推荐最多
Git CMD: Windows风格命令行
Git GUI: 图像界面的Git,不建议初学者使用,先熟悉常用命令
Git配置
查看配置 git config -l
查看系统配置 git config --system --list
查看本地配置 git config --global --list
配置用户名与邮箱
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pTnEOy6D-1684315182465)(C:\Users\zw\AppData\Roaming\Typora\typora-user-images\image-20230516105858719.png)]
C:\Users\zw下有gitconfig (用户的名字,邮箱之类的)
C:\Program Files (x86)\Git\etc有gitconfig
基本Linux命令
cd /d/zwx/code/Gitcode 改变目录 (不在d盘下)
cd zwx/code/Gitcode(在d盘下,注意前面没’\')
cd … 回退到上一个目录,直接cd进入默认目录
pwd 现实当前所在目录路径p
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eXstaB0J-1684315182466)(C:\Users\zw\AppData\Roaming\Typora\typora-user-images\image-20230516102236482.png)]
//增
touch 新建一个文件。如touch index.js 在当前目录下新建一个index.js文件
mkdir 新建一个文件夹
//删
rm 删除一个文件 ,如rm index.js 删除index.js文件
rm -r 删除一个文件夹,如rm -r app 删除app文件夹
rm -rf 删除电脑中全部文件,切勿在Linux中尝试!
//改(移动文件)
mv 文件 文件夹,如mv index.html test 把index.html文件移动到test文件夹里
//查
ls(ll) 列出当前目录中所有文件,ll更详细
clear 清屏(window下 cls)
reset 重新初始化终端/清屏(跟clear差不多)
history 查看命令历史
help 帮助
exit 退出
“#” 注释
Git基本理论(核心,git所有实践都源于这个理论)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-soyCodDJ-1684315182466)(D:\zwx\MarkDown用到的截图,图片\微信图片_20230516110926.jpg)]
Working Directoty 工作区,平时存放项目代码的地方
Stage\Index 暂存区,实际上它只是一个文件
Repositort/History 仓库区/本地仓库
Remote Directory 远程仓库
注:跟自己有关的就是本地工作区和远程仓库(gitee码云),中间两个区一般用命令操控就行
本地三个空间理解(次要)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WyiDxs36-1684315182467)(D:\zwx\MarkDown用到的截图,图片\微信图片_20230516112858.jpg)]
Git项目搭建
创建工作目录与常用命令
工作目录/区(WorkSpace)一般就是你要使用Git管理的文件夹,可以是你项目的目录,也可以是空目录,建议不要有中文
只需要记住以下六个命令
本地工作区-----add---->暂存区(index)—commit—>本地仓库—push—>远程库
同理返回来用 clone,checkout,pull
#查看指定文件状态
git status 文件名
#查看所有文件状态
git status
#提交所有文件到暂存区
git add .
#提交暂存区中的内容到本地仓库 -m表示提交信息
git commit -m "消息内容" //提交到本地仓库
#提交本地仓库的内容到远程仓库
git push
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1WuDzdwO-1684315182467)(D:\zwx\MarkDown用到的截图,图片\微信图片_20230516133825.jpg)]
本地仓库搭建
创建本地仓库有两种方法:1.创建全新的仓库 2.克隆远程仓库
1、创建全新仓库,需要在Git管理的项目的根目录执行Git bash
# 在当前目录新建一个Git代码库
git init
执行后在项目目录多出了一个.git目录,关于版本等所有信息都在这个目录里面
2、克隆远程仓库
克隆远程目录,如码云上的
git clone 码云上的HTTPS链接
git clone https://gitee.com/kuangstudy/kuang_livenote.git
Git文件操作
文件4种状态
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OIXRA6JE-1684315182468)(D:\zwx\MarkDown用到的截图,图片\微信图片_20230516140623.jpg)]
忽略文件
上传项目时,有些文件不需要or不想上传,如数据库临时文件,临时文件,设计文件等
在项目主目录下建立”.gitignore“文件,该文件规则如下:
-
#开始的行会被忽略
-
可使用Linux通配符。
“*” 星号代表所有字符
“?” 问号代表一个字符
“[abc]” 方括号代表可选字符范围
“{string1,stirng2,…}” 大括号代表可选的字符串
-
“!” 最前面的感叹号,表示例外,不被忽略
-
"\"最前面的杠,表示往前忽略
-
"\"最后面的杠,表示往后忽略
#注释 *.txt #忽略所有 .txt文件 !lib.txt #但lib.txt除外 /temp #仅忽略项目根目录下TODO文件,不包括目录temp build/ #忽略build目录下的所有文件 doc/*.txt #会忽略 doc/notes.txt 但不会忽略 doc/server/arch.txt
使用码云
1、注册登录码云,完善个人信息
2、设置本机绑定SSH公匙,实现免密登录(挺重要)
#进入 C:\Users\zw\.ssh
#生成公钥 ssh-keygen
#如果要用加密算法 则可用 ssh-keygen -t rsa
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WvAGaSpb-1684315182468)(C:\Users\zw\AppData\Roaming\Typora\typora-user-images\image-20230516145938415.png)]
在C:\Users\zw.ssh使用gitbash输入ssh-keygen -t rsa 再一路空格,生成下图两个文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CLeY7rNh-1684315182469)(C:\Users\zw\AppData\Roaming\Typora\typora-user-images\image-20230516145949333.png)]
IDEA中集成Git
[(29条消息) git报错:rejected]master->master(non-fast-forward)_孤城浪人的博客-CSDN博客
1、将gite仓库文件(down下来的)复制到新建的项目目录下,相同文件替换
2、使用IDEA操作git
- 添加到暂存区 在terminal中输入 git add .
- commit 提交 直接右上角绿色勾勾 或者在terminal 中输入 git commit -m “new file hello.java”
- push到远程库 IDEA右上角向上绿色箭头 或者在terminal 中输入git push。如果push报错,看一下上面链接的博客。
Git分支、提交树移动
分支可以理解为平行宇宙。如果两个平行宇宙互不干扰,那对我们没啥影响。但如果在某个时间点两个平行宇宙合并,则会产生一些问题需要我们处理。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K3yNDC4N-1684315182470)(D:\zwx\MarkDown用到的截图,图片\微信图片_20230516162218.jpg)]
git中常用分支命令
###增
#新建一个分支,但依然停留在当前分支
git branch 分支名
#新建一个分支,并切换到该分支
git checkout -b 分支名
###删
#删除本地分支
git branch -d 分支名
#删除远程分支
git push origin --delete 分支名 (这句更好用)
###改
#合并指定分支到当前分支(HEAD)
git merge 指定分支名
#合并分支,实际上就是取出一系列的提交记录,"复制"它们,然后在另一个地方逐个放下去
#Rebase优势: 创造更线性的提交历史。如果只用Rebase来合并分支,代码库的提交历史会非常清晰
git rebase 分支名
git rebase master bugFix #HEAD在master这里,将master合并到bugFix,并把HEAD给bugFix
#移动分支
git branch -f master HEAD~3 #-f 分支名 HEAD~3 :移动master往上三级
#移动HEAD
git checkout HEAD~4 #向上移动4步
#撤销变更
git reset HEAD~3 #本地撤销,把分支记录回退3个提交记录来实现撤销改动
git revert HEAD~3 #远程撤销,把分支记录回退3个提交记录来实现撤销改动
###查
#列出所有本地分支
git branch
#列出所有远程分支
git branch -r
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k0RtRmDg-1684315182471)(C:\Users\zw\AppData\Roaming\Typora\typora-user-images\image-20230516164123193.png)]
多个分支如果并行执行,就会导致我们代码不冲突,也就是同时存在多个版本!
web-api A组负责
web-admin B组负责,会调用A的代码 (修改了A的代码)
web-app C组负责,会调用B和A的代码 (修改了B、A的代码)
如果冲突了就要协商(选择冲突的部分到底是用谁的代码)
在同一文件合并分支时都被两位或多位开发者修改了则会引起冲突。
** master主分支非常稳定,用来发布新版本,一般清空不允许在上面工作;工作一般在dev上;工作完后若要发布,或者是dev分支代码稳定后可以合并到主分支master上来**
注意:会学以上所述内容,基本足够满足开发者日常需求了。
整理提交记录 (只占10%)
到现在我们已经学习了 Git 的基础知识 —— 提交、分支以及在提交树上移动。
然而, 剩余的 10% 在处理复杂的工作流时(或者当你陷入困惑时)可能就显得尤为重要了。
接下来要讨论的这个话题是“整理提交记录” —— 开发人员有时会说“我想要把这个提交放到这里, 那个提交放到刚才那个提交的后面”, 而接下来就讲的就是它的实现方式,非常清晰、灵活,还很生动。
- 将一些提交复制到当前位置(HEAD)
#将一些提交复制到当前位置(HEAD)
git cherry-pick c1 c2 c3 #三个分支中的提交记录复制到当前位置(用checkout做到当前位置,一般当前位置都是master)
- 交互式rebase用于从一系列提交记录中找到想要的记录。
交互式rebase指带参数–interactive,简写为 -i。git会打开一个UI界面并列出将要被复制到目标分支的备选提交记录,它还会显示每个提交记录的哈希值和提交说明,提交说明有助于你理解这个提交进行了哪些更改。
当 rebase UI界面打开时, 你能做3件事:
- 调整提交记录的顺序(通过鼠标拖放来完成)
- 删除你不想要的提交(通过切换
pick
的状态来完成,关闭就意味着你不想要这个提交记录) - 合并提交。 遗憾的是由于某种逻辑的原因,我们的课程不支持此功能,因此我不会详细介绍这个操作。简而言之,它允许你把多个提交记录合并成一个。
#打开UI界面,可以调整提交记录顺序,删除提交记录,合并提交记录
git rebase -i HEAD~5
- 本地栈式提交
来看一个在开发中经常会遇到的情况:我正在解决某个特别棘手的 Bug,为了便于调试而在代码中添加了一些调试命令并向控制台打印了一些信息。
这些调试和打印语句都在它们各自的提交记录里。最后我终于找到了造成这个 Bug 的根本原因,解决掉以后觉得沾沾自喜!
最后就差把 bugFix
分支里的工作合并回 master
分支了。你可以选择通过 fast-forward 快速合并到 master
分支上,但这样的话 master
分支就会包含我这些调试语句了。你肯定不想这样,应该还有更好的方式……
实际我们只要让 Git 复制解决问题的那一个提交记录就可以了。跟之前我们在“整理提交记录”中学到的一样,我们可以使用
git rebase -i
git cherry-pick
来达到目的。
git rebase -i HEAD~5
git cherry-pick C2 c3
- 提交的技巧1
接下来这种情况也是很常见的:你之前在 newImage
分支上进行了一次提交,然后又基于它创建了 caption
分支,然后又提交了一次。
此时你想对的某个以前的提交记录进行一些小小的调整。比如设计师想修改一下 newImage
中图片的分辨率,尽管那个提交记录并不是最新的了。
我们可以通过下面的方法来克服困难:
git checkout master
git cherry-pick c1 c2
- Tag
相信通过前面课程的学习你已经发现了:分支很容易被人为移动,并且当有新的提交时,它也会移动。分支很容易被改变,大部分分支还只是临时的,并且还一直在变。
你可能会问了:有没有什么可以永远指向某个提交记录的标识呢,比如软件发布新的大版本,或者是修正一些重要的 Bug 或是增加了某些新特性,有没有比分支更好的可以永远指向这些提交的方法呢?
当然有了!Git 的 tag 就是干这个用的啊,它们可以(在某种程度上 —— 因为标签可以被删除后重新在另外一个位置创建同名的标签)永久地将某个特定的提交命名为里程碑,然后就可以像分支一样引用了。
更难得的是,它们并不会随着新的提交而移动。你也不能检出到某个标签上面进行修改提交,它就像是提交树上的一个锚点,标识了某个特定的位置。
#建立一个标签v1,指向提交记录 C1,表示这是我们 1.0 版本。
git tag v1 c1 #如果你不指定提交记录,Git 会用 HEAD 所指向的位置。
由于标签在代码库中起着“锚点”的作用,Git 还为此专门设计了一个命令用来描述离你最近的标签,它就是 git describe
!
#Git Describe 能帮你在提交历史中移动了多次以后找到方向;当你用 `git bisect`(一个查找产生 Bug 的提交记录的指令)找到某个提交记录时,或者是当你坐在你那刚刚度假回来的同事的电脑前时, 可能会用到这个命令。
git describe
git describe
的语法是:git describe <ref>
<ref>
可以是任何能被 Git 识别成提交记录的引用,如果你没有指定的话,Git 会以你目前所检出的位置(HEAD
)。它输出的结果是这样的:
<tag>_<numCommits>_g<hash>
tag
表示的是离ref
最近的标签,numCommits
是表示这个ref
与tag
相差有多少个提交记录,hash
表示的是你所给定的ref
所表示的提交记录哈希值的前几位。当
ref
提交记录上有某个标签时,则只输出标签名称
补充学习
git大全:Git 大全 - Gitee.com
git指令练习:https://oschina.gitee.io/learn-git-branching/
练习答案可见[(29条消息) git命令-可视化学习_git可视化学习_Enjoy-li的博客-CSDN博客](https://blog.csdn.net/weixin_45062275/article/details/124227637)
合并分支时“Already up to date.”解决办法:(29条消息) Already up to date.问题解决_already up-to-date_刘顺顺_的博客-CSDN博客
新建完分支,push时出现“The current branch test1 has no upstream branch.“ 解决方案: git push --set-upstream origin test1 (test1为新建分支)