Git&Github

1.Git基础

1.1 版本管理

版本管理是一种记录文件变化的方式,以便将来查阅特定版本的内容

1.1.1 人为维护版本的问题

  • 文档数量多且命名不清晰导致混乱
  • 每次修改都需要复制备份
  • 多个人同时编译同一个文件,容易覆盖

1.2.Git

Git是一个版本管理工具

2.1 Git好处

  • 可以在任何时间点,将文档的内容作为更新记录保存起来,也可以在任意时间点,将更新记录恢复回来
  • 当文件覆盖的时候,Git会发出警告,因此会避免多人合作开发时,无意覆盖了他人的操作

2.2 Git工作流程

  • 工作目录:被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:当前分支
  • 合并分支: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 push
    • git 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-agent

    Permission 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,查看日志,会发现就只有一条了

posted @ 2020-04-20 14:20  范特西-  阅读(107)  评论(0)    收藏  举报