Git 和 GitHub 基础

git

git version 2.34.1 - 64 bit

Git结构

  • 工作区
  • 暂存区
  • 本地库

Git和托管中心

局域网:

  • GitLab服务器

外网:

  • GitHub

  • Gitee

本地库和远程库

私人库或者团队内部协作:

  • push 可以将本地库的代码推送到远程库
  • clone 将远程库的代码下载到本地库
  • 团队外的人不可以push到远程库

团队外协作:

  • fork 复制到自己的远程库

  • clone 下载到自己的本地库

  • push 到自己的远程库

  • pull request 申请将自己的远程库内容合并到对方远程库

  • merge 远程库合并

  • pull 然后就可以拉取合并后的代码

本地库初始化

命令:

  • git init
  • git add

设置签名:

  • 形式:

    • 用户名

    • Email

  • 作用: 区分不同开发人员身份

  • 这里的签名和登录远程库的账号密码没有关系

  • 命令

    • 项目级别/仓库级别
      • git config user.name tom
      • git config user.email tom@gmail.com
      • 可以使用 git config --unset <credential name>取消设置的签名
    • 系统用户级别: 登录当前操作系统的用户范围
      • git config –global …
    • 优先级
      • 就近原则: 项目级别优先于系统用户级别, 二者都有的时候采用项目级别的签名
      • 如果只有系统用户级别的签名, 就以系统用户级别的签名为准
      • 二者都没有不允许

设置完成以后可以使用cat ./git/config, 查看项目级别的签名

系统用户级别的签名在C:\user\用户名下的.gitconfig里面

添加提交

git status 查看状态:

  • on branch
  • no commits files:
  • untracked files
  • nothing to commit / change to be committed

添加提交文件:

  • git add <file> 将文件加入到暂存区

  • git rm --cached <file> 将文件从暂存区中删除

  • git commit <file> 提交到本地库

  • git add <file> 将修改过的文件更新到暂存区, 也可以直接git commit -a 直接提交

  • git restore <file>将修改过的内容取消

  • git commit -m "<messages>" <file>不用进vim直接设置提交日志并提交

本地版本穿梭

  • git log 查看本地仓库历史版本
    • git log --pretty=oneline 以简洁方式显示
    • git log --oneline 更简洁
    • git reflog简洁, 但是显示更多有价值的信息
      • HEAD{}显示了从当前版本去到对应版本所需要的步数

前进后退

基于索引值操作:

  • git reset --hard <索引值> 退回历史版本
  • 往前进也是一样的指令

基于^的操作:

  • 只能后退不能往前
  • git reset --hard HEAD^^^回退3个记录

基于~的操作:

  • 也是只能后退

  • git reset --hard HEAD~3 后退三个记录

软硬参数对比

hard``soft``mixed三个参数的区别

  • soft
    • 不会碰暂存区
    • 仅仅移动HEAD指针
  • mixed
    • 移动HEAD指针
    • 重置暂存区
  • hard
  • 在本地库移动HEAD
  • 重置暂存区
  • 重置工作区

删除文件后找回: 就直接退回到对应还有该文件的版本就好了, 之前的版本记录一直都存在, 前提是删除前提交过该文件到本地库

比较文件

  • git diff <filename> 与暂存区的文件进行比较
  • git diff HEAD <filename>与本地库文件进行比较
    • git diff HEAD^ <filename>或者和某个特定本地库记录比较
  • git diff 不指定文件名就可以比较所有文件

分支管理

分支的功能

  • 每个分支开发过程中彼此独立

  • 如果某个分支出问题可以直接删除分支, 不影响其他分支

  • 开发完成后合并到主分支

  • 主分支出bug一般开一个hot_fix分支进行修复

分支操作

  • git branch -v 查看分支
  • git branch <branch name>创建新分支
  • git checkout <branch name>切换分支

合并分支:

  1. 切换到被合并的分支上
  2. 执行merge命令
    • git merge 把较为新的分支合并到当前分支

解决冲突

  1. 编辑文件删除特殊符号,
  2. 把文件修改到满意的程度
  3. git add标记冲突解决
  4. git commit -m "<log>"结束合并不可以带文件名

Git基本原理

哈希

一种加密算法, 明文->加密算法->密文

  • 不管输入数据量多大, 输入同一个算法, 得到的加密长度一致
  • 哈希算法确定, 输入数据确定, 输出数据就也能保持不变
  • 只要更改输入数据, 输出一定改变
  • 不可逆

常见hash加密算法:

  • MD5
  • SHA1
  • CRC32

哈希值的变化可以代表数据的更改和丢失

git底层采用的是sha1的算法

版本数据管理机制

  • SVN的版本控制方式是增量式版本控制, 换言之就是只保存更改或者添加的内容, 然后进行拼接
  • git是快照机制, 如果文件没有更改, 则指针指向之前文件, 不会重复保存快照
  • 每个文件都会做一次哈希, 所有对象包装成tree对象也有哈希值, 然后再包装成提交数据, 也有哈希值
  • 每个提交对象还会指向一个父节点, 这样就可以管理历史版本

分支管理

  • HEAD 指向初始分支master
  • 新分支只是创建了一个指针, 提交的时候指向新的对象
  • 切换分支的时候只是指针变了, 所以速度非常快

远程库Github

先创建远程库,

  • git remote add origin https://[USERNAME]:[TOKEN]@git.mycompany.com/[ORGANIZATION]/[REPO].git 用授权token添加远程地址
  • git remote set-url origin <url>重新设置远程库地址
  • git remove -v 查看设置好的地址
  • git push origin <branch name>将本地库推送至远程库
  • 注意: 如果之前使用了签名, 需要删除签名github才会显示对应账号名, 不然是以签名作为一个虚拟身份commit to repo

此处测试暂时使用的token: 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, 7天过期

参考:

如何获得授权token:

https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token

如何使用token将本地库文件推送至远程库:

https://stackoverflow.com/questions/18935539/authenticate-with-github-using-a-token

在远程库删除新加入.gitignore中的文件

https://stackoverflow.com/questions/7927230/remove-directory-from-remote-repository-after-adding-them-to-gitignore

克隆clone

克隆特点:

  • 完整把远程库下载到本地
  • 创建origin远程地址别名
  • 初始化好了本地库

命令:

  • git clone <url>

远程库的拉取(更新)

fetch 加 merge 就是pull

fetch merge分开操作流程:

  • git fetch origin master下载下来但是没有修改本地文件
  • git checkout origin/master切换到下载下来的远程库, 可以看到下载后的内容
  • git checkout master返回本地分支
  • git merge origin/master将远程库内容进行合并
  • 这样就完成了分开操作

pull操作流程:

  • git pull origin master

  • 直接完成合并操作, 当程序比较简单不会产生冲突的时候可以使用

协同开发时的冲突

当远程库有内容发生冲突的时候, 后推送的人就无法推送了, 必须先拉取下来, 再本地库解决了冲突才能再推送

  1. 使用fetch修改, 或者使用pull命令直接进入merging状态
  2. 修改冲突文件
  3. 重复之前解决冲突时的方法, (git add <conflict/modified file name>)
  4. 然后git commit 结束merging状态
  5. git push origin master 结束推送状态

要点:

  • 不是基于最新修改, 不能推送, 必须先拉取
  • 拉取后进入冲突状态, 按照”分支解决冲突”的操作解决

还有其他解决冲突的方法, 比如 stash 命令

github跨团队协作

团队外成员操作:

  • 在对方的repo远程仓库里面点击fork, 就复制了一份到自己的本地仓库
  • 然后正常执行 clone, commit, push
  • 在此仓库中怎么修改都不会影响原仓库
  • 发起pull request, new pull request
  • create pull request

然后团队内部人员审核pull request:

  • 点击对应pull request 查看pull request

  • 可以进行对话

  • 看commits和files changes 审核代码

  • 点击merge pull request进行合并

  • confirm merge

  • 再将合并后的内容拉取到本地就完成了

SSH

  1. cd ~ 进入HOME目录

  2. ssh-keygen -t rsa -C <username> 生成ssh密钥

  3. 进入生成到的目录cat id_rsa.pub查看密钥

  4. 到github中设置ssh密钥

  5. 先从repo复制ssh的地址, git remote add origin_ssh <ssh_url>

  6. push 推送

这样就不需要密码进行推送

.gitignore

默认自动ignore该文件里定义的路径和文件

1
git config core.excludesfile .gitignore

只能忽略还没有被track的文件, 如果以及commit了, ignore就是无效的

可以使用指令

1
git rm -r --cached <directory/file name>

查看哪些文件被ignore了

1
git status --ignored

IDEA使用ignore插件

https://blog.csdn.net/qq_34745957/article/details/80035578

.gitignore 使用

https://blog.csdn.net/wnvalentin/article/details/105448739

Git工作流

  • 集中式
  • GitFlow
  • Forking

GitFlow

master 分支: 主分支

release分支: 预发布分支, 完成后合并到主分支

develop分支: 开发基准分支, 开发完成合并到主分支

多个feature_name分支: 各种单个功能开发, 开发完成合并到develop分支

hotfix分支: 热修复bug, 完成后到合并到主分支

GitLab服务器

gitlab是在服务器自行搭建的私人局域网远程库

  1. 将gitlab 的rpm包上传到linux服务器
  2. 到指定目录(opt)

安装命令:

CentOS 7

1
2
3
4
5
6
sudo yum install -y curl policycoreutils-python openssh-server cronie
sudo lokkit -s http -s ssh
sudo yum install postfix
sudo service postfix start
sudo chlconfig postfix on
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash sudo EXTERNAL_URL="http://gitlab.example.com" yum -y install gitlab-ee

使用rpm包的话就先装rpm包

1
sudo rpm -ivh /opt/gitlab-ce....x86.rpm

可以将命令写到.sh脚本文件中, 然后统一跑

操作

gitlab-ctl reconfigure 初始化配置gitlab

gitlab-ctl start 启动

gitlab-ctl stop 停止

直接去访问ip地址, 如果不成功就检查防火墙是否停止

service firework stop停止防火墙

正常情况需要设置防火墙策略, 而不是关闭

初次启动设置root的账号密码

—end—

Author: klenq
Link: https://klenq.github.io/2021/12/15/Git和Github基础/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.