Git&Github
1.Git基础
1.1 版本管理
版本管理是一种记录文件变化的方式,以便将来查阅特定版本的内容
1.1.1 人为维护版本的问题
- 文档数量多且命名不清晰导致混乱
- 每次修改都需要复制备份
- 多个人同时编译同一个文件,容易覆盖
1.2.Git
Git是一个版本管理工具
2.1 Git好处
- 可以在任何时间点,将文档的内容作为更新记录保存起来,也可以在任意时间点,将更新记录恢复回来
- 当文件覆盖的时候,Git会发出警告,因此会避免多人合作开发时,无意覆盖了他人的操作
2.2 Git工作流程
- 工作目录:被Git管理的工作目录,也就是我们的项目
- 暂存区:临时存放被修改要提交的文件,如果直接放在Git太臃肿
- git仓库:用于存放提交的文件和提交的记录

2.3 Git的使用
2.3.1 使用前配置
在使用git前,需要告诉git你是谁,在向git提交时需要用到
//设置名字
git config --global user.name "你的名字"
//设置邮箱
git config --global user.email "你的邮箱"
//查看配置信息
git config --list
* 如果需要修改重复设置即可
2.3.2 提交步骤
git init初始化仓库git status查看文件状态git add 文件列表将文件存放在暂存区中git commit -m 提交信息提交文件到git仓库git log查看提交记录
2.3.3撤销
- 用暂存区的文件覆盖工作目录的文件:
git checkout 文件- 当我们将代码写了一半添加到暂存区,然后继续编写代码,但是写到最后又想回到一半,可以使用它
- 将文件从暂存区删除和不被git管理:
git rm --cached 文件- 比如代码添加到暂存区后发现添加的代码有问题,想删除掉先不提交,可以使用它
- 将git仓库指定的更新记录恢复出来,并且覆盖工作目录和暂存区:`git reset --hard commitId(提交记录的id)
- 比如第一版本已经上线成功,后来又加了几个功能也提交了,结果全是bug,就想回到上线成功的那个版本,把git仓库这些bug代码都删掉,并且本地的bug代码也删掉,而且也会将暂存区的文件都清空掉
- 删除github远程仓库文件:
git rm -fr 文件git commit -m "无用"git push origin master:master
2.Git进阶
2.1 Git分支
使用分支,可以从主分支分离出来,进行添加功能、修改bug,不影响主分支,要保持主分支的稳定性
2.1.1 分支流程
- 主分支(master):第一次向git提交时会自动产生的一个分支
- 开发分支(dev):作为开发的分支,基于mater创建
- 功能分支:作为开发具体功能的分支,基于开发分支创建
流程:先在功能分支上开发,开发完成后合并到开发分支,当开发分支功能完成一定程度后,合并到主分支
2.1.1 分支命令
- 查看分支:
git branch- 绿色带*号的为当前所在分支
- 创建分支:
git branch 分支名 - 切换分支:
git checkout 分支名- 切换分支之前,当前分支的代码一定要提交到git仓库上,不然当前分支上暂存区的文件也会跟着切换到另一个分支的暂存区,而不同分支之间没有联系的话就出了大问题!!!
- 从某个分支上创建分支:
git checkout -b v1.0 origin/master- 将1.0分支提交:
git push origin HEAD -u,HEAD:当前分支
- 将1.0分支提交:
- 合并分支:
git merge 分支名- 如果主分支要合并开发分支,那需要切换到主分支然后执行命令,合并之前,分支需要先提交
- 删除分支:
git branch -d 分支名- 默认只有合并过它的分支才可以对它删除
- 可以将 -d 改为 -D进行强行删除,这样不合并也可以删除它
2.1.2 暂时保存更改
- 我们知道,如果要切换其他分支,必须保证当前分支是干净的,也就是暂存区没有文件,不然会把暂存区的内容带过去,但是假如这个时候其他分支有严重bug,你必须切过去修改,但是当前分支功能还没开发完,你不想提交,所以就可以使用暂时保存更改操作了
git stash:将当前分支修改的操作暂时保存到Git提供的工作空间中,这样我们就可以去切换分支了git stash pop:将保存的内容恢复回来
3.Github
Github是面向开源及私有软件项目的托管平台,本地仓库只适用于独立开发,而多人开发则需要远程仓库
3.1多人协作开发流程
- A在自己的电脑创建本地仓库
- A在github创建远程仓库
- A将本地仓库推送到远程仓库
- B克隆远程仓库到本地仓库开发
- B将本地仓库推送到远程仓库
- 此时B需要和A在同一个团队中,不然无法推送
- A将远程仓库的最新内容拉去本地
- …...
3.2 本地仓库推送到远程仓库
- 第一种方式:
git push 仓库地址 分支名称- 每次提交都写仓库地址太麻烦了,所以可以起别名
- 提交需要输入github的用户名和密码,一会发现只有第一次需要输入,那是因为我们的电脑帮我们记录了,而不是github帮我们记住的
- 第二种方式:
git push 仓库地址别名 分支名称- 起别名:
git remote add 别名 仓库地址
- 起别名:
- 第三种方式:
git pushgit push -u 别名 master,使用-u以后,github会记住地址和用户名密码- 下次提交时直接使用
git push即可
- 如果远程仓库的版本高于本地仓库的版本,此时是不可以向远程仓库推送的,必须先拉取,再提交
3.3 克隆远程仓库到本地仓库
git clone 仓库地址
3.4 拉取远程仓库最新版本
git pull 仓库别名 分支名称
3.5 不在同一个团队如何写作开发(fork)
场景:你创建了一个项目,然后其他网友想要给这个项目提交代码
- 网友fork你的项目到它的远程仓库中
- 网友clone远程仓库到本地
- 网友做了修改后push到远程仓库
- 网友发起pull request
- 你收到它的pull request并开始审核
- 你将它的代码合并到项目中
3.6 使用ssh免密登录
- 使用http的话每次都需要输入密码,只不过是有的操作系统会帮我们记住密码,比如linux就不会,所以每次push都要输入密码
ssh使用密钥的形式,在本地电脑生成一个私钥和公钥,然后github设置公钥,当push的时候,如果私钥和公钥匹配就可以直接push,不需要输密码
-
在设置之前确保设置了name和email,具体设置看2.3.1
-
cd ~/.ssh- 如果存在该目录,说明已经生成过了ssh-add id_rsa,如果想覆盖重新生成即可
-
ssh-keygen -t rsa -C "email"- 会在user目录下生成一个ssh文件夹,有一个id_rsa私钥,id_rsa.pub公钥
-
ssh-add id_rsa,添加密钥到ssh(这一步很重要,有的教程没有写这一步),如果没有这一步会说没有权限,如果出现Could not open a connection to your authentication agent.,那就先执行eval ssh-agentPermission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. FATAL Something's wrong. Maybe you can find the solution here: xxxxxxxxxxxx -
将id_rsa.pub中的内容拷贝到github Settings->SSH and GPG keys->New SSH key
-
测试:
ssh git@github.com,出现Hi xxxxxx! You've successfully authenticated, but GitHub does not provide shell access.即配置成功 -
然后用ssh的url进行推送
3.7 忽略清单文件
- 将不需要被git管理的文件名字添加到此文件中,当执行git命令的时候就会忽略这些文件
- 比如一些编译后的class文件,out目录就需要忽略
忽略文件:.gitignore- 对于已经提交了的文件如何忽略:
git rm -r —cached 文件名- 删除以后再commit,push
这是一份JAVA项目的忽略文件
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**
!**/src/test/**
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
doc/
### VS Code ###
.vscode/
3.8 为项目添加详细说明
- 在项目根目录下创建名为
README.md文件,这是一个markdown文件,在里面可以对仓库进行详细说明
4.Github回滚到某一个Commit
1.查看提交日志
git log
2.复制要回退的的commitid
3.本地回退
$ git reset --hard commitid
4.同步到Github,-f强制更新,因为回退版本后本地仓库与仓库不一致了,此时使用git push提交就会报错
git push -f origin HEAD
5.如果你后悔了,又想回退回去
#查看你之前操作过的命令,找到之前版本的commitid
git reflog
#再次执行
$ git reset --hard commitid
5.本地合并多个commit
由于很多原因我们 需要多次commit,比如进行pull,那我们就需要合并commit,不然就太多了
1.查看commit日志
git log
2.这是日志
commit 4a31115713062f960d480ddfe51e91cf28b47a6c
Merge: 0a58a2e 7864394
Author: DingJiangNan <codedjn@163.com>
Date: Fri May 1 15:40:08 2020 +0800
第二次修改 pom.xml
commit 0a58a2eba304be36a11df9dc5a7c14ed5a3ee1d6
Author: DingJiangNan <codedjn@163.com>
Date: Fri May 1 15:23:28 2020 +0800
update pom.xml
3.合并这个commit为 一个commit,使用到rebase命令
git rebase -i HEAD~2
执行该命令会进入交互模式

这个时候将下面的pick改为s或者squash他就会合并到上面的,所以要注意顺序

然后执行wq保存退出,这个时候会进入commit message页面,然后你要修改message为一条

然后执行wq保存退出
然后执行git log,查看日志,会发现就只有一条了


浙公网安备 33010602011771号