git

Git快速学习手册

快速预览重点 & git flow

Posted by zhidaliao on May 1, 2018

This document is not completed and will be updated anytime.

git

最近在重温git的一些基本知识,把原来技术团队总结的一些知识点贴在这里方便回顾,本文会提供一些git的比较好的学习资料、一些常用命令和开发流程的使用场景

Introduction

首先对git要有基本的认识,这里不做太多的介绍,仅提供一些较好的资料,请 认真 一篇一篇阅读和理解,欢迎提问

Command

在对git有基本的认识和理解后,我们重点了解一些常用的命令,前面也已经提到了大部分的命令。标准的命令是 git xxx 方式,但是我们使用了oh-my-zsh的插件,它会采用alias的方式简化命令,从而不用每次都输入很长的命令,比如 git status 查看状态,使用oh-my-zsh后,命令可以直接使用 gst 。更多的命令简写方式可以在命令行输入 alias 来查看。

  • 查看状态

    git status 或者 gst 这是最常用的命令,做任何其他操作时,都应该执行该命令来看看状态,以确保接下来的命令是符合期望的

  • git初始化

    git init 对于一个项目一般只会执行一次,把一个非git管理的文件夹(项目)使用git管理起来

    git flow init 或者 gfl init 使用该命令会完成上一命令的工作,同时还会新建一些分支,请在了解git-flow之后进行实践

  • 远程仓库定义

    git remote -v 或者 grv 查看当前项目的远程仓库地址,一个项目可以有多个远程仓库地址的,默认会有一个叫origin

    git remote add [名称] [地址] 或者 gra [名称] [地址] 给当前项目添加一个远程仓库地址,这样就可以将代码提交到添加的远程仓库中了

    git remote rename|remove 可以添加,同样可以修改和删除

  • 从远处仓库迁出代码

    git clone [远处仓库地址] 或者 gcl [远处仓库地址] 该命令会在当前目录下迁出代码,通常迁出的代码会在 master分支

    git checkout -t origin/develop 或者 gco -t origin/develop 如果需要跟踪其他分支的时候,使用该命令,origin/develop就代表远程仓库的develop分支

  • 将修改的内容加入跟踪管理

    git add [文件] 或者 ga [文件] 指定需要加入跟踪的文件

    git add --all 或者 gaa 通常在一个目录下,可能需要把所有修改的文件都加入跟踪,不需要一个一个文件加入,就可使用该命令

  • 提交到本地仓库(除了以下两个命令,请少用其他commit命令)

    git commit -v 或者gc 注意是提交到本地仓库,不是远程仓库,使用该命令后,会在sublime弹出一个文件,在该文件里面写相关的message,message的写法请参考 写好 Git Commit 信息的 7 个建议,写好后保存关闭即可(command + s 然后 command + w)

    git commit -v --amend 或者gc! 当你发现commit之后message写错了,可以使用该命令重新写!

  • 获取最新的分支和数据

    git fetch -p 或者 gf -p

  • 查看和操作所有分支情况

    git branch -a -v 或者 gba -v

    git branch -d|-D [分支名] 或者 gb -d|-D [分支名] 只能删除本地分支 -D为强制删除

  • 新建分支和切换分支

    git checkout -b [分支名] 或者gcb 以当前分支为基准,创建一个一样的分支

    git checkout [分支名] 切换到指定分支,常用的有:

    • gcm : master分支
    • gcd : develop分支

    git branch [-a:包括远程的分支] 查看分支

  • 回退/撤销操作:

    • 取消跟踪状态并删除本地文件:git rm file
    • 取消跟踪状态:git rm –cache file
    • 使用当前修改前的版本覆盖本地文件:git checkout file
    • 回退提交状态,变成暂存状态:git reset –soft [version] : 针对commit
    • 回退提交和暂存状态,变成未暂存状态:git reset –mixed [version]  默认 针对commit
    • 回退提交和暂存状态,本地源码也变成提交之前的版本的:git reset –hard [version] 针对commit version可以为以下内容
      • HEAD : 当前提交
      • HEAD^ :上一次提交
      • HEAD number :number前的提交
      • branch : 该分支的提交
    • 撤销本地改动和提交,使用服务器上的最新代码:
      • 获取服务器上最新的git信息:git fetch remote-name
      • 使用服务器上的文件到本地:git reset –hard remote-name/remote-branch
    • 错误代码提交到远程服务器
      • 修复自己本地的代码,commit,强制推送到服务器 git push —force
      • 需要回退代码,使用revert 反向提交减少冲突,推送到服务器上
  • checkout 用法

    checkout branch 切换分支(HEAD 指针的移动)

    checkout file 将文件切换到当前版本的提交

  • 创建/删除远程分支

    创建:push remote-name [本地分支]:[远程分支]

    删除:push remote-name :[远程分支] 当本地分支为空的时候 删除对应的远程分支

  • 合并分支:移动指针

    git checkout master git merge new_branch

    删除无用分支:git branch –d new_branch

  • 解决合并之后的冲突步骤:
    • 手动修改冲突文件
    • 将修改好的文件标记为已解决: git add file
    • 提交合并信息:git commit
  • 储藏:不提交当前分支但是要切换到其他分支进行工作

    储藏:git stash

    查看储藏列表: git stash list

    恢复文件: git stash apply

    重新应用被暂存的变更. git stash apply --index

    移除储藏 git stash drop

    从储藏中创建分支 git stash branch

  • 文件比对

    git diff :未暂存的文件更新的部分

    git diff –cached /git diff –stage :查看暂存的文件和上次提交的文件差异

  • 恢复被删除的提交

    • Git 会在你每次修改了 HEAD 时悄悄地将改动记录下来。当你提交或修改分支时,reflog 就会更新
    • git reflog
    • git log -g 会详细输出reflog日志
    • 找到丢失的commitID
    • git branch recover-branch ab1afef  //可以在那个 commit (ab1afef) 上创建一个名为 recover-branch 的分支:
  • 标签

    git tag [-l 'pattern']

    git -a tagName -m 'msg'

    git -a tagName commitId -m 'msg'

    git -s tagName -m 'msg' 将秘钥信息附上

    git show tagName

    推送标签到服务器 git push origin tagName

    推送所有 git push origin --tags

  • 需要一份和远程分支一样的代码

    git checkout -b serverfix origin/serverfix

  • Rebase

    它的原理是回到两个分支(你所在的分支和你想要衍合进去的分支)的共同祖先,提取你所在分支每次提交时产生的差异(diff),把这些差异分别保存到临时文件里,然后从当前分支转换到你需要衍合入的分支,依序施用每一个差异补丁文件 git rebase [主分支] [特性分支] 命令会先检出特性分支 server,然后在主分支 master 上重演

  • 拉取和推送到远程仓库

    git pull origin $(git_current_branch) 或者 ggpull 从远程仓库拉取代码并且何必到当前分支

    git push origin $(git_current_branch) 或者 ggpush 推送当前分支到远处仓库

  • 查看commit日志

    git log 或者 glg 或者 glgg 或者 glgga 区别是日志的详细程度

核心知识点

Git 对象

Git 是一套内容寻址文件系统。Git 从核心上来看不过是简单地存储键值对(key-value)。它允许插入任意类型的内容,并会返回一个键值,通过该键值可以在任何时候再取出该内容

Git 基础

直接记录快照,而非差异比较 Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异。

Git-flow

在gitlab中,master分支是受保护的分支,意思就是你无法将代码提交这个分支中,这个分支只能通过在gitlab中进行合并。工作流程如下:

  • 如果本地无项目,请在对应的目录(注意:所有代码必须存在git文件对应的路径)从远程分支签下项目

  • 如果没有issue,不能修改任何代码,意思就是必须有问题了才需要修改代码,可以在issues页面查看确定要解决哪一个问题,比如确定要解决issues #2问题

  • 不能在master分支上修改任何代码,需要新建分支来开发,使用命令gcb 2-xxx,其中的2是相应的issues编号,这样就已经在相应的分支下了

  • 修改完代码后,确保测试等环节都没有问题,使用gc来commit到本地,commit message的标题必须写fix #2 , xxxx

  • 确认完毕后,使用ggpush将当前分支提交到远程仓库等待code review

  • 所有的分支最好都基于master分支去创建,但是有可能上一个issue的代码还未被何必到master,这个时候你可以从其他分支创建,在创建之前最好使用ggpull来确保分支的一致性

Skill

一些实用的技巧

  • 因为不允许在master分支上修改代码,但是如果修改了,不可能重新还原再写一遍吧,怎么办?

      gsta    //在master分支下将当前的修改进入缓存区
      gcb xxx //切换到应该修改的分支下
      gstaa   //将缓存区的内容应用到当前分支下,完成
    
  • 当你commit到本地之后,发现上一次的提交中还少了一些修改内容,那你需要把上一次的提交取消,然后重新commit

      git reflog //查看需要回滚的commit号,例如98ad499
      git reset 98ad499