Git基础与分支使用

最近对于hotfix有点困惑,所以重新学习一下git。参考资料,感谢。
https://www.liaoxuefeng.com/wiki/896043488029600
https://rogerdudler.github.io/git-guide/index.zh.html
https://backlog.com/git-tutorial/cn/

基本概念

Git是一个软件版本控制软件,但Git不仅属于程序猿,它可以用它来方便管理任何非二进制文本内容(如果仅为了记录版本和打tag那都行),而不仅仅是代码,比如有gitbook。比较流行的软件还有SVN,不过原理差别很大。

  • 本地仓库
    本地仓库由 git 维护的三棵“树”组成。第一个是你的 工作目录,它持有实际文件;第二个是 暂存区(Index),它像个缓存区域,临时保存你的改动;最后是 HEAD,它指向你最后一次提交的结果。后两者的信息都在工作目录的.git隐藏文件夹(版本库repository)中由git维护。


    本地仓库1.png

    本地仓库2.png
  • 远程仓库
    要和其他人协同开发,就必须有一个大家都可以访问的仓库服务,每个人在将本地仓库关联到远程仓库后就可以进行代码的同步和推送。另外也有备份的作用,防止本地磁盘崩溃导致的代码丢失。
    最著名的公共代码仓库服务是Github,个人企业也可搭建自己的仓库服务,比如使用Gitlab。


    Remote.png

基础指令

# 初始化仓库
git init // 在当前目录下初始化git仓库(生成.git文件夹记录所有信息,这个文件夹不要随意修改)
git clone  // 拷贝一个仓库至当前目录,path可以是本地也可以是远程的git仓库地址,比如/path/to/repository(要有.git信息)或者username@host:/path/to/repository

clone下载了完整的git信息,所以和拷贝代码是很不一样的

# 本地管理
git add  // 添加文件到git暂存区,以被git索引
git commit -m "提交信息" // 提交到本地仓库
## 查看变更
git diff  // 查看当前文件和上一次提交的变更详情。
git diff HEAD --  // 对比工作区file文件和版本库内的区别

  • 分add和commit两阶段的原因主要是可以提交部分修改,也容易给一批add打上标志信息。
# 远程提交
git pull // 拉取远程代码(下载最近的变更日志,并覆盖自己本地数据库的相关内容。)
  • origin/master表示远程数据库“origin”的分支“master”的位置。
  • origin/HEAD克隆远程数据库“origin”时,表示下载commit的位置,通常指向与“origin/master”相同的位置。
  • master表示本地数据库分支“master”的位置。

版本历史、回退、文件删除

// 查看提交历史
git log //  --pretty=oneline参数显示简略信息,commit id提交版本号是一串SHA-1生成的uuid,因为是分布式的版本控制,版本号不能冲突
git log --graph --oneline --decorate --all // 树形美化展示
// 通过查看命令历史,来找到某次提交的commit id(比如像让版本恢复到最新)
git reflog // 救命神器

可以看到回退是分三个阶段的,另外还可以使用远程分支覆盖本地并同步

## 工作区回退
git checkout -- file // 强制让最近一次提交(add/commit)覆盖当前工作区的文件

## 暂存区回退
git reset HEAD  // 撤销add(把暂存区的修改回退到工作区——把HEAD中的文件覆盖暂存区中的)

## commit回退(切换)
// 参数可为版本号,或者可以写成基于HEAD来表示之前的第n次提交:
// HEAD^(上一次),HEAD^^(上两次),HEAD~n(上第n次),HEAD~1^^(上三次)
git reset --hard  

## 到服务器上获取最新的版本历史覆盖本地的所有改动与提交,并将本地主分支指向它:
git fetch origin
git reset --hard origin/master
  • 删除
    在删除工作区的文件后:1、确定删除使用git rm 。2、删错了,使用工作区回退功能

标签

是版本库的一个快照,为软件(实际就是某个重要的commit id)打上版本标记。方便定位追溯。

git tag 1.0.0   // 为当前分支下的某个commit 打tag。 -m添加标签说明
git tag // 查看tag
git show   // 查看标签信息
git tag -d   // 删除标签

git push origin  // 推送某个tag到远程
git push origin --tags // 推送所有tag到远程

git push origin :refs/tags/ // 删除已经推送的tag

分支

分支将修改记录的整体流程分叉保存。分叉后的分支不受其他分支的影响。分支是为了程序员协同开发,以及应对项目的各种需求而存在的。
分支在实际项目中是最重要而且也是最容易遇到问题的部分,所以也最需要规范使用。


分支.png

通常有两类分支:Merge——为了Release,一般叫master;Topic——各类不同功能的分支(dev/test/feature/hotfix等)。

  • HEAD
    HEAD标志代表现在使用中的分支的commit版本位置。
git branch // 查看所有分支
git branch -d  // 删除分支

git branch  // 创建新分支
git checkout  // 切换工作区文件为新分支下的最新版本
// 上面两条等价为
git checkout -b 

git merge  // 将目标分支<>合并到当前分支

创建Git版本库时,Git自动为我们创建了唯一一个master分支

解决冲突

冲突.png

当要合并的两个分支都有各自的提交时,自动merge很有可能不能完成,需要手动解决冲突。
在master分支此时执行git merge feature1,查看冲突文件可以看到如下内容

<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1

此时需要对冲突的内容重新编辑,删除git给出的这些指示信息:<<<<===>>>>完成后,重新add和commit

配置远程仓库

github配置关联

git remote add origin  // 远程仓库地址
git push -u origin <本地分支名> //  分支名为想要推送的任何分支,比如master。第一次提交使用-u参数

远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库

拉取与合并代码

git fetch orgin master //将远程仓库的master分支下载到本地当前branch中
git log -p master  ..origin/master //比较本地的master分支和origin/master分支的差别
git merge origin/master //进行合并

git fetch origin master:tmp //从远程仓库master分支获取最新,在本地建立tmp分支
git diff tmp //將當前分支和tmp進行對比
git merge tmp //合并tmp分支到当前分支
 
git pull // 相当于是从远程获取最新版本并merge到本地
git pull origin master

经验与规范

git config

可添加一些全局配置

  • git config color.ui true颜色
  • git config format.pretty oneline单行log

.gitignore文件

可以定义不需要添加到git的文件。注意最好在项目初始时配置好,不然已经提交了的文件很难再剔除。
文件内容可以用正则自定义,但已经有人梳理了很多常用的了
https://github.com/github/gitignore

别名

很长的常用指令记不住的话,非常方便,比如

// 语法
git config --global alias.   
// 例子
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

生产环境的分支、合并使用

发现这篇文章讲的足够了
https://blog.csdn.net/ShuSheng0007/article/details/80791849

简单来说就是开发时本地从dev创建feature/个人/bugfix分支,开发完毕合并dev推送远程。
从master创建hotfix分支,开发完毕合并dev和master推远程(或者安全起见暂缓直接推master)

你可能感兴趣的:(Git基础与分支使用)