Git入门

202 阅读10分钟

gitee-git教程

  • git应用流程 image.png

  • 扩展知识

ls/ll 查看当前目录
pwd 查看当前所在路径名称
cat 查看文件内容 
touch 创建文件 
mkdir 文件名   创建文件夹
rm -f 文件名   删除文件夹(会递归删除所有层级的子目录)
mv 文件名 要移动等到的文件夹路径(如果该路径不存在,会把该路径赋值给文件;前提:先进入到文件A的目录下再执行命令)
vi vi编辑器(使用vi编辑器是为了方便展示效果,学员可以记事本、editPlus、notPad++等其它编 辑器)
用法:
1, vi file01.txt
2, 必须先输入i   (底部会显示插入或者insert)
3, 可以输入内容了xxx, 输入完之后, 点击ESC按键
4, 输入:wq   (保存&退出)
5, 输入:qa!  (不保存&退出)

在GitBash窗口选中一段内容,系统默认会复制,
1,shift+insert 粘贴
2,鼠标中间单击  粘贴
  • Linux常用指令--操作 image.png
  • 删除指定文件 rm -f 文件名
Mrhan@DESKTOP-88659SF MINGW64 ~/Desktop/test
$ touch h3.txt

Mrhan@DESKTOP-88659SF MINGW64 ~/Desktop/test
$ ls
h2.txt  h3.txt  hello.txt

Mrhan@DESKTOP-88659SF MINGW64 ~/Desktop/test
$ rm -f h3.txt

Mrhan@DESKTOP-88659SF MINGW64 ~/Desktop/test
$ ls
h2.txt  hello.txt
  • Git GUI:Git提供的图形界面工具

  • Git Bash:Git提供的命令行工具 image.png

  • 当安装Git后首先要做的事情是设置用户名称和email地址。这是非常重要的,因为每次Git提交都会使用 该用户信息

基本配置 
1. 打开Git Bash 
2. 设置用户信息 
git config --global user.name “mrhan” 
git config --global user.email904410775@qq.com” 

查看配置信息 
git config --global user.name 
git config --global user.email

image.png

  • 获取本地仓库 要使用Git对我们的代码进行版本控制,首先需要获得本地仓库
1)在电脑的任意位置创建一个空目录(例如test)作为我们的本地Git仓库 
2)进入这个目录中,点击右键打开Git bash窗口 
3)执行命令git init 
4)如果创建成功后可在文件夹下看到隐藏的.git目录。
  • git本地仓库的状态(工作区--暂存区--本地仓库) image.png
//把工作区所有文件提交到-->暂存区
git add .
//这里的.是通配符,表示提交所有的文件到暂存区
//如果某个文件file01.txt,想从暂存区返回到工作区
git restore --stage file01.txt
//把工作区单个文件提交到-->暂存区
git add 单个文件名

//把暂存区所有文件提交到-->本地仓库
git commit -m "描述"

//当前仓库的状态
git status
//所有的操作记录(如果操作比较多,结果会特别乱,可以用option参数优化)
git log
//用别名alias的方式给常用比较长的指令添加别名,下面我们就添加了个优化后的
git-log
  • git log [option] [option]表示option对应的参数可写可不写, 并不是option左右必须有[]
git log [option] 
options包括:
--all 显示所有分支 --pretty=oneline 将提交信息显示为一行 --abbrev-commit 使得输出的commitId更简短 --graph 以图的形式显示
  • 为常用指令设置别名alias image.png

  • 解决GitBash乱码问题 image.png

  • 添加文件至忽略列表, 因为git不再跟踪忽略列表中的文件, 所以git status查看状态时,git commit提交时, 都不会有相关状态, image.png

  • 分支branch 涉及到head或HEAD, 表示当前分支, 并不是什么主分支!!!

//查看分支
git branch
//创建分支
git branch dev01
//切换分支
git checkout dev01
//切换到xx分支,如果xx分支不存在,会自动创建xx分支,并切换到xx分支
git checkout -b dev02
//删除分支,会进行各种检查,保证删除dev02没有影响(无法删除当前分支)
git branch -d dev02
//强制删除分支, 不会进行任何检查(无法删除当前分支)
git branch -D dev02
//合并分支, 假如当前是dev02分支,想要合并master分支的内容
git merge master
//如果dev02和master都修改了同一个文件file01.txt,就会有冲突
//当前分支不解决冲突,无法切换分支
//打开冲突的文件, head表示当前分支修改的内容,下面代表其他分支修改的内容
//两个分支的开发者一块解决冲突,保留正确的代码即可
//文件处理好之后, 提交到暂存区
git add .
//提交到本地仓库
git commit -m '这里是描述内容--解决了file01.txt冲突'
//这时候就可以切换其他分支啦!
//如果只写了git commit
//可能会在当前终端弹框让输入提交的描述,这时候:wq即可提交成功
//如果弹框是在其他编辑器中打开,比如vscode, 那么必须输入描述然后Ctrl+s保存、关闭vscode, 终端会自动处理提交的描述并自动提交
--soft 回退后a分支修改的代码被保留并标记为add的状态(git status 是绿色的状态)
--mixed 重置索引,但不重置工作树,更改后的文件标记为未提交(add)的状态。默认操作。
--hard 重置索引和工作树,并且a分支修改的所有文件和中间的提交,没提交的代码都被丢弃了。
--merge--hard类似,只不过如果在执行reset命令之前你有改动一些文件并且未提交,merge会保留你的这些修改,hard则不会。【注:如果你的这些修改add过或commit过,merge和hard都将删除你的提交】
--keep--hard类似,执行reset之前改动文件如果是a分支修改了的,会提示你修改了相同的文件,不能合并。如果不是a分支修改的文件,会移除缓存区。git status还是可以看到保持了这些修改。
复制代码

- a分支的代码我不需要了,以后应该也不需要了。因此:
`git reset (commit的id) --hard`

- a分支代码我还是想要的,只是这个提交我不想要了:
`git reset (commit的id)`
  • 当前分支修改的内容, 在切换分支前要记得提交暂存区, 并提交到本地仓库!
否则修改的数据, 会被带到切换后的分支, 
哪个分支提交到了本地仓库, 哪个仓库就是最新代码, 
其他分支的数据再查看,发现是修改前的数据, 会容易误解代码怎么不是最新的了!

image.png

解决冲突

本地仓库和远程仓库,解决冲突的方式是一样的 image.png

Git远程仓库

  • GitHub、码云(gitee)、GitLab如何选择?
  1. GitHub服务器在国外, 网速慢;
  2. 码云服务器在国内, 网速快(推荐);
  3. GitLab是在公司或学校自己搭建服务器存放代码, 存放在自己服务器更安全.
GitHub( 地址:https://github.com/ )是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名gitHub 
码云(地址: https://gitee.com/ )是国内的一个代码托管平台,由于服务器在国内,所以相比于 GitHub,码云速度会更快 
GitLab (地址: https://about.gitlab.com/ )是一个用于仓库管理系统的开源项目,使用Git作 为代码管理工具,并在此基础上搭建起来的web服务,一般用于在企业、学校等内部网络搭建git私服。

生成SSH公钥

  • ssh公钥需要在生成SSH的网络下才能使用!!! 经测试切换网络SSH公钥失效,报错: connect to host localhost port 22: Connection refused 官网文档-生成SSH公钥
1, 执行命令: ssh-keygen -t rsa 
2, 不断回车 
3, 如果公钥已经存在,则自动覆盖
4, 公钥和私钥在终端会显示生成的路径
Enter file in which to save the key (/c/Users/Mrhan/.ssh/id_rsa):
5, 进入公钥和私钥所在的文件
cd /c/Users/Mrhan/.ssh
//查看.ssh包含的文件
ls
输出的文件: id_rsa(私钥)  id_rsa.pub(公钥)
//查看公钥
cat id_rsa.pub
6, 把公钥添加到gitee的[设置-SSH公钥], 
标题随便输入, 确定的时候需要输入gitee的登录密码验证通过即可添加成功
7, 验证公钥是否配置成功
ssh -T git@gitee.com
//系统有个问题, 输入yes即可

d6029b19ca13356e58d66c71ca7c7ae.png

  • 添加远程仓库、克隆项目、推送远程仓库、抓取远程仓库、拉取远程仓库
//添加远程仓库(简称"远端、远程")
git remote add <远端名称> <仓库路径>
远端名称,默认origin,取决于远程服务器设置(origin可以写成其他名称) 
仓库路径,从远程服务器获取此URL 例如: git remote add origin git@gitee.com:904410775/git_test.git
因为我们之前已经配置过SSH公钥了,所以这里我们直接用仓库的ssh路径,相比http路径省去了输入账号密码的步骤

//查看远程仓库
git remote
//移除远程仓库origin(idea中可以在Git-Manage Remotes中修改)
git remote rm origin

//推送到远程仓库
git push [-f] [--set-upstream] [远端名称 [本地分支名][:远程分支名] ] 
如果远程分支名和本地分支名称相同,则可以只写本地分支 git push origin master 
如果当前是dev01分支, git push origin dev01会把本地的dev01分支推送给远程的dev01分支

-f 表示强制覆盖 
--set-upstream 推送到远端的同时并且建立起和远程分支的关联关系。 
git push --set-upstream origin master:master
git push --set-upstream origin dev01:dev01
如果当前分支已经和远程分支关联,则可以省略分支名和远端名。 
git push 将master分支推送到已关联的远程分支。
注意: 
1, 经过测试, 只有本地分支和远程分支是同一个分支(名称),建立关联关系后,
才可以使用git push 等价于 git push origin master 或 git push origin dev01
2, 如果不太清楚--set-upstream的用法, 完全可以不用, 因为标准写法也不复杂.
git push origin master或git push origin master:master
git push origin dev01或git push origin dev01:dev01

//远程分支和本地的分支一样,我们可以进行merge操作
抓取 命令:git fetch [remote name] [branch name] 
1, 抓取指令就是将仓库里的更新都抓取到本地, 不会进行合并
2, 如果不指定远端名称和分支名,则抓取所有分支。

拉取 命令:git pull [remote name] [branch name] 
1, 拉取指令就是将远端仓库的修改拉到本地, 并自动进行合并,等同于fetch+merge 
2, 如果不指定远端名称和分支名,则抓取所有并更新当前分支。
  • 查看本地仓库和远程仓库的关联关系,添加后缀-vv
git branch -vv
git remote -vv

image.png

例如: https://www.toptal.com/developers/gitignore/api/java
//网上找了个后端的.gitignore
# Compiled class file
*.class

# Log file
*.log
*.imi
*.lst

# BlueJ files
*.ctxt

# Mobile Tools for Java (J2ME)
.mtj.tmp/

# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar

# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*

.idea
*.iml
out
.settings/
.project
.classpath
/*/target/
logs/
.txlcn
  • .gitignore规则不生效的解决办法
把某些目录或文件加入忽略规则,按照上述方法定义后发现并未生效,
原因是.gitignore只能忽略那些原来没有被追踪的文件,
如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。
那么解决方法就是先把本地缓存删除(改变成未被追踪状态),
然后再提交:
git rm -r --cached .
git add .
git commit -m 'update .gitignore'
git push 或 git push origin head

idea中集成GitBash作为Terminal

image.png

idea中本地项目使用git

image.png

image.png

image.png

image.png

image.png

image.png

image.png

  • 2021新版idea取消git commit时的代码分析,取消analyzing code

image.png

git提交时报ssh: connect to host localhost port 22: Connection refused

远程origin使用https协议, 不要使用ssh协议,估计是被公司网络禁用了

git错误 error: failed to push some refs to 'https://...'

`**问题描述**`:
在git bash中键入 $ git push origin master 进行提交的时候出现 如下错误:
error: failed to push some refs to 'https://gitee.com/904410775/oss.git'

`**问题原因**`:
远程库与本地库不一致造成的,在hint中也有提示把远程库同步到本地库就可以了。

`**解决办法**`:
使用命令行:
git pull --rebase origin master

查看标签tag设置的message信息

//格式: git show (tag版本)
git show v2.7