Github Usage

一、安装git

  • 官网下载 git

    https://git-scm.com/

    Untitled

    选择好操作系统和稳定的版本

    Untitled

    双击下载后的 Git-2.37.3-64-bit.exe,开始安装

    Untitled

  • 配置用户名邮箱和ssh证书

    # 安装
    brew install git
    
    # 配置账户信息
    git config --global user.name "zcy530"
    git config --global user.email "zhangcaiyii@163.com"
    
    # 配置ssh公钥这里一路空格选择默认设置
    ssh-keygen -t rsa -C "zhangcaiyii@163.com"
    
    # 获取公钥复制
    cat ~/.ssh/id_rsa.pub
    
    #github 官网找到 ssh 证书新建 ssh把这个公钥复制进去
    
    # 测试
    ssh -T git@github.com
    

二、远程仓库

  • 在 github 里创建一个新的仓库

    以 test_repository 为例

  • 或者使用远程仓库的地址

    在创建完仓库后,复制它的远程仓库地址,这里使用 HTTP 地址

三、本地仓库

  • 认识文件的四种状态

  • git init 创建本地仓库

    # 创建本地仓库
    git init
    

    在你想上传的文件夹中空白处右键 -> git bash here

    在命令行中输入 git init 就会看到文件夹当中生成了一个 .git 的隐藏文件,它所在的文件夹就是仓库,它会记录你所有的变更行为

  • git clone 把远程仓库下载下来

    把一个repo的项目拷贝到本地,并且连接该仓库

    git clone https://github.com/xxx/xxx.git
    
  • git remote add origin 连接远程仓库

    用于添加远端仓库地址

    git clone 之后自动链接好的,可以省略这一步

    git remote add origin(给远程仓库地址起的别名) 你的远程仓库地址
    

    实际演示:

    git remote add origin 把远程仓库地址保存起来,表示以后就可以用 origin 代替你这一长串的远程仓库地址

  • git remote -v 查看仓库的地址

    查看远程仓库

    gti remote -v
    

四、项目代码变动提交

  • git add

    # 将单个文件添加到暂存区
    git add filename
    
    # 将所有文件添加到暂存区
    git add .
    
  • git push

    # 推送提交
    git push -u origin(远程仓库) master(分支信息)
    
  • git log

    # 查看所有的 commit 记录
    git log 
    
  • git reflog

    # 查看所有的操作记录
    git reflog
    
  • 使用 token push

    你原先的密码凭证从2021年8月13日开始就不能用了,必须使用个人访问令牌(personal access token),就是把你的密码替换成token!

    setting -> developer setting -> personal access tokens

    生成一个token

    要使用token从命令行访问仓库,请选择repo

    要使用token从命令行删除仓库,请选择delete_repo

    生成之后记得把你的token保存下来,因为你再次刷新网页的时候,你已经没有办法看到它了

    然后在 git push -u origin master弹出的窗口里面,输入username,密码复制粘贴你生成的token就行了

    参考教程

    https://blog.csdn.net/weixin_41010198/article/details/119698015

  • 实际操作如下

    接下来我们尝试创建两个文件 index.html 和 index.js,在命令行中输入 git status 可以查看当前仓库的状态信息

    我们用 git add index.html 命令把单个文件 index.html 加到缓存区里

    再用 git status 查看当前仓库的状态信息,发现 index.html 已经绿了

    如果想把项目里所有的文件都上传到缓存区,可以用 git add . 来实现

    接下来就可以提交这次变更了 -m 是 message 的意思,后面跟上跟此次变更信息有关的描述

    在提交后通过 git log 查看日志,通过日志我们可以查看什么人在什么时间,提交了一个什么样的commit

    git push -u origin master 将本地仓库推向远程仓库,如果网络不好可能会失败

    成功后会弹出一个GitHub的登录框, 输入邮箱和密码

    上传成功!可以在你的GitHub远程仓库看到我们在本地添加的 index.html 和 index.js 文件了

  • git reset

    # 取消我的commit
    git reset commitID --hard
    git reset commitID --soft
    git reset commitID --mixed
    
    # 如果回退了commit,用这个把回退push到远端
    git push -f
    

    reset –hard/soft/mixed 三个参数对比:

    hard:在本地库移动 HEAD 指针,也会重置暂存区,也会重置工作区

    soft:仅仅是在本地库移动 HEAD 指针

    mixed:在本地库移动 HEAD 指针,也会重置暂存区

    实际演示:

    我们修改一下index.js文件几行代码之后再查看状态,会发现又出现了红色的文件,红色的文件代表有新的变更

    我们需要重复以上的操作,先用 git add . 将所有文件提交到暂存区,再提交 git commit -m ,通过 git log 可以看到的确已经提交了

    如果想要取消一个commit,恢复到 first commit 的版本,就在 git log 里找到第一次的 commitID

    如果想要取消一个commit,恢复到 first commit 的版本,也可以在 git reflog 里面找到一个短的索引值,这样引用比较方便

五、协作开发

  • Fork

    把当前作者的项目拷贝到我的仓库里面去

    Untitled

  • Pull request

    1. fork 到自己的仓库之后,可以在自己本地仓库进行文件代码的修改,然后把对项目的修改提交给原项目的过程就是 pull request
    2. 原项目作者可以对 pull request 进行 merge,当合并之后原项目的代码也会进行修改
    3. PR可以通过 #530 关联 issue,PR关联issue后,issue的状态会自动更改为进行中,当PR被合并后,issue会更改为关闭状态。一个 PR 可以关联多个 issue
  • git pull

    拉取最新的代码到本地

  • git rebase

    git pull 和 git rebase 都用于同步本地分支和远程分支

    • git pull:拉取远程的 main 分支,并将其和当前分支合并,如果有本地提交,会创建一个 merge commit,保留了历史的分叉结构,不是线性的

      优点:保留所有分支的提交历史,不会改写历史,merge 提交清楚地标记了什么时候哪个分支合并进来了,便于回溯

      缺点:会产生很多“merge commit”,导致 git log 显得很乱,难以阅读。造成分叉结构(非线性历史),不利于定位 bug

      等价于
      git fetch origin
      git merge origin/main
      
      现在是
      A---B---C  (local)
           \
            D---E (origin/main)
      
      git pull 之后是
      A---B---C-------M  (local)
           \         /
            D---E (origin/main)
      
    • git rebase: 将本地提交“移到”最新远程提交之后,结果是一个线性的提交历史,也避免多个 merge commit,历史清爽

      优点:线性历史,没有 merge commit,看起来就像你一个人完成了所有开发

      缺点:每个 commit 都可能冲突,你要一个个解决,如果你和别人共同维护某个分支,不应随意 rebase,否则会导致别人的历史失效

      等价于
      git fetch origin
      git rebase origin/main
      
      现在是
      A---B---C---F    origin/main
               \
                D---E    你的本地 feature 分支落后了
      
      git rebase 之后
      A---B---C---F
                   \
                    D'---E'    rebased feature新的提交
      
  • Merge conflict

  • cherry-pick

    git cherry-pick 可以理解为”挑拣”提交,它会获取某一个分支的单笔提交,并作为一个新的提交引入到你当前分支上。当我们需要在本地合入其他分支的提交时,如果我们不想对整个分支进行合并,而是只想将某一次提交合入到本地当前分支上,那么就要使用 git cherry-pick

六、创建分支

  • git branch

    # 创建一个名叫 manager 的分支
    git branch manager
    
    # 进入新创建的分支
    git checkout manager
    
    # 查看当前分支名称
    git branch -a
    
    # 删除分支
    git branch -D zhangcaiyi2
    
  • git push —set-upstream

    # add  commit 之后提交到远程
    git push origin manager
    
    #分支push提交
    git push --set-upstream origin user/t-caiyizhang/graduate_killswtiches
    
  • branch 的命名规范

    in case you dont know, sum up for you:
    feat: 新增特性功能
    fix:  bug修补
    docs: 更新了文档
    release: 发布某个大版本
    hotfix: 基于master分支的紧急修复
    build: 仅与构建过程严格相关的通常如 config,makefile 这种
    chore: 流程与build相近)、依赖辅助工具的变化或者无法归类的变更
    style: 纯格式变动不影响代码运行
    test: 增加测试
    refactor: 重构不增加新功能
    breakchange: 会严重影响/打断其它模块功能的变动
    revert: 回退
    merge: 代码合并
    rebase  sync同步其它分支的代码变动
    pref:提高性能相关
    ci: 与CI有关的变动