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> // 拷贝一个仓库至当前目录,path可以是本地也可以是远程的git仓库地址,比如/path/to/repository(要有.git信息)或者username@host:/path/to/repository

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

# 本地管理
git add <file> // 添加文件到git暂存区,以被git索引
git commit -m "提交信息" // 提交到本地仓库
## 查看变更
git diff <file> // 查看当前文件和上一次提交的变更详情。
git diff HEAD -- <file> // 对比工作区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 <file> // 撤销add(把暂存区的修改回退到工作区——把HEAD中的文件覆盖暂存区中的)

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

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

标签

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

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

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

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

分支

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


分支.png

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

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

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

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

创建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地址> // 远程仓库地址
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.<alias_cmd> <origin_cmd>  
// 例子
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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352