Git开发必知必会
比如说你现在准备写一个自己的视频资源网站,在创业初期,你的项目暂时还是测试阶段,没有用户的时候,你可能只有一个人在开发,你每天都以写的内容和时间作为文件名的命名,这样其实是可以满足你对版本控制的基本需求的,唯一的问题是,当你要返回某个版本的时候你很难直接就找到你想要的那个状态,因为你可能有还几十个版本的文件,如果中途你的硬件坏了,比如磁盘文件丢失,这确实不是一个程序员想看到的状态。这个时候你可能需要一个分布式开发利器来帮你排忧解难了,所以我准备写点关于Git的博客。
首先你要知道的是,Git分为服务端与客户端,我们把每个版本的文件上传到远程仓库里,而且每次提交的信息都可以明确告诉你是那一版,接下来详细说一下怎么使用Git来协助开发。
首先要进行工作文件夹的初始化(就是给仓库进行装修,使仓库更便于管理)。初始化完成后,我们就不需要手动修改什么版本1,版本2了。。。我们每次上传的文件都被保留为一个版本。
比如说你现在准备写一个自己的视频资源网站,在创业初期,你的项目暂时还是测试阶段,没有用户的时候,你可能只有一个人在开发,你每天都以写的内容和时间作为文件名的命名,这样其实是可以满足你对版本控制的基本需求的,唯一的问题是,当你要返回某个版本的时候你很难直接就找到你想要的那个状态,因为你可能有还几十个版本的文件,如果中途你的硬件坏了,比如磁盘文件丢失,这确实不是一个程序员想看到的状态。这个时候你可能需要一个分布式开发利器来帮你排忧解难了,所以我准备写点关于Git的博客。
首先你要知道的是,Git分为服务端与客户端,我们把每个版本的文件上传到远程仓库里,而且每次提交的信息都可以明确告诉你是那一版,接下来详细说一下怎么使用Git来协助开发。
首先要进行工作文件夹的初始化(就是给仓库进行装修,使仓库更便于管理)。初始化完成后,我们就不需要手动修改什么版本1,版本2了。。。我们每次上传的文件都被保留为一个版本,并且每个版本都是经过压缩的,占的空间非常小。
$ git init
Initialized empty Git repository in E:/test/.git/
现在我们创建开发视频项目,并将视频项目从工作区转到版本库中。
MINGW64 /e/test (master)
$ git add '开发视频.txt' MINGW64 /e/test (master)
$ git status
On branch master No commits yet Changes to be committed:
(use "git rm --cached <file>..." to unstage) new file: "\345\274\200\345\217\221\350\247\206\351\242\221.txt"
然后从版本库的暂存区转到分支。
MINGW64 /e/test (master)
$ git commit -m '第一次视频上传'
[master (root-commit) 9e5b463] 第一次视频上传
file changed, insertion(+)
create mode "\345\274\200\345\217\221\350\247\206\351\242\221.txt"
版本提交完成后,本地与分支的代码一致。
MINGW64 /e/test (master)
$ git status
On branch master
nothing to commit, working tree clean
添加一个新的论坛功能。
MINGW64 /e/test (master)
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed) "\350\265\204\346\272\220\350\256\272\345\235\233.txt" nothing added to commit but untracked files present (use "git add" to track)
此时的本地与版本库不一致,查看状态即可得知。我们需要二次上传。按照上述的提交次序进行版本更改后的提交。
MINGW64 /e/test (master)
$ git add . MINGW64 /e/test (master)
$ git commit -m '新开发了论坛功能'
[master e87047a] 新开发了论坛功能
file changed, insertion(+)
create mode "\350\265\204\346\272\220\350\256\272\345\235\233.txt" MINGW64 /e/test (master)
$ git status
On branch master
nothing to commit, working tree clean
此时,我们的版本库里就有两个版本的文件了。
查看分支都有哪些文件。
MINGW64 /e/test (master)
$ git ls-tree head
blob 1890c0533c72cc3b80d681d94a0f891d3f5378be "\345\274\200\345\217\221\350\247\206\351\242\221.txt"
blob 8c46b0fcd2871597ebba639f61b101dfa495840b "\350\265\204\346\272\220\350\256\272\345\235\233.txt"
注:提交前需要配置个人信息,以便记录谁做了哪些操作。
MINGW64 /e/test (master)
$ git config --global user.email "2609749420@qq.com" MINGW64 /e/test (master)
$ git config --global user.name "jefflike"
没有配置相关的信息,在你提交的时候会报错,有了你的信息,git日志文件会记录你所做的事。
MINGW64 /e/test (master)
$ git log
commit e87047a9fe199360d2f0d97d912bf36a63274ff3 (HEAD -> master)
Author: jefflike <@qq.com>
Date: Fri Mar :: + 新开发了论坛功能 commit 9e5b463cc31fd946d78d78919c2f50b077ff14cf
Author: jefflike <@qq.com>
Date: Fri Mar :: + 第一次视频上传
commit后面的作为唯一标识,帮助我们回滚时使用。
比如现在由于相关规定,我们的论坛功能暂时要关闭一段时间,此时我们需要将我们项目回滚到第一次提交的状态。需要使用到9e5b463cc31fd946d78d78919c2f50b077ff14cf。
a2609@DESKTOP-3FO2EDL MINGW64 /e/test (master)
$ git reset --hard 9e5b463cc31fd946d78d78919c2f50b077ff14cf
HEAD is now at 9e5b463 第一次视频上传
直接回到论坛的版本未创建的状态,论坛文件都没有。
过了一段时间,我们的论坛又可以继续上线了,但是此时我们git log发现我们现在回滚到的版本里压根就没有创建过论坛的文件的信息。
MINGW64 /e/test (master)
$ git log
commit 9e5b463cc31fd946d78d78919c2f50b077ff14cf (HEAD -> master)
Author: jefflike <@qq.com>
Date: Fri Mar :: + 第一次视频上传
那该怎么办呢,从新写一个论坛模块吗?不存在的。
MINGW64 /e/test (master)
$ git reflog
9e5b463 (HEAD -> master) HEAD@{}: reset: moving to 9e5b463cc31fd946d78d78919c2f50b077ff14cf
e87047a HEAD@{}: commit: 新开发了论坛功能
9e5b463 (HEAD -> master) HEAD@{}: commit (initial): 第一次视频上传 MINGW64 /e/test (master)
$ git reset e87047a
Unstaged changes after reset:
D 资源论坛.txt MINGW64 /e/test (master)
$ git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory) deleted: "\350\265\204\346\272\220\350\256\272\345\235\233.txt" no changes added to commit (use "git add" and/or "git commit -a") MINGW64 /e/test (master)
$ git checkout 资源论坛.txt
你在继续开发资源论坛开发到一半的时候,视频网站出现了bug急需修复,此时你该如何操作呢。
MINGW64 /e/test (master)
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory) modified: "\350\265\204\346\272\220\350\256\272\345\235\233.txt" no changes added to commit (use "git add" and/or "git commit -a")
MINGW64 /e/test (master)
$ git stash
Saved working directory and index state WIP on master: e87047a 新开发了论坛功能
将当前工作修改部分转移到分支,此时我们的论坛恢复到新功能开发之前的版本:
修复完bug要上传。
MINGW64 /e/test (master)
$ git add . MINGW64 /e/test (master)
$ git commit -m '修复bug'
[master e384a95] 修复bug
file changed, insertions(+), deletion(-)
此时我们的项目又从新运行起来,没有bug,我们需要合并分支,把之前的功能拿回来。
MINGW64 /e/test (master)
$ git stash pop
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory) modified: "\350\265\204\346\272\220\350\256\272\345\235\233.txt" no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{} (683d356c11ebf111412cfaa3ceb996b75dd402a2) MINGW64 /e/test (master)
$ git add . MINGW64 /e/test (master)
$ git commit -m '论坛活动开启'
[master 02c4cfe] 论坛活动开启
file changed, insertions(+), deletion(-)
我们继续开发,合并分支后修改的bug保持被修改后的状态。
在这里可能存在冲突的情况,比如我的论坛开发到一半,我们需要将论坛的模板换掉,此时就存在了冲突。
老板说先把活动的主题换上。
主题换上继续开发未完成的活动。此时应有冲突出现:
MINGW64 /e/test (master)
$ git stash pop
Auto-merging 资源论坛.txt
CONFLICT (content): Merge conflict in 资源论坛.txt
需要我们手动解决,并提交。
直接修改完并提交,我们的新项目在一路bug需求不断的情况下,非常顺利的完成了。
MINGW64 /e/test (master)
$ git status
On branch master
nothing to commit, working tree clean
至此,我们一个人开发项目不论遇到什么事,都可以顺利的解决掉。
上述问题我们一般会采用分支的方式来解决:
我们开发过程中一般会保留两个分支,即master(只保留线上版本)和dev(只保留开发版本)。
创建我们的开发版本和进入开发分支。
MINGW64 /e/test (master)
$ git branch
* master
查看当前分支
MINGW64 /e/test (master)
$ git branch dev MINGW64 /e/test (master)
$ git checkout dev
Switched to branch 'dev' MINGW64 /e/test (dev)
$ git branch
* dev
master
我们在dev开发清明节抽奖活动。
开发到一半时,线上master出了大bug,急需修改。我们先要切换到主分支,创建bug分支解决bug合并到主分支。
MINGW64 /e/test (dev)
$ git checkout master
Switched to branch 'master' MINGW64 /e/test (master)
$ git branch
dev
* master
线上版本是没有我们的新活动的。
MINGW64 /e/test (master)
$ git branch bug MINGW64 /e/test (master)
$ git checkout bug
Switched to branch 'bug' MINGW64 /e/test (bug)
$ git branch
* bug
dev
master
主分支进行合并分支
MINGW64 /e/test (bug)
$ git checkout master
Switched to branch 'master' MINGW64 /e/test (master)
$ git merge bug
Updating 0dfcebc..360e6ca
Fast-forward
"\350\265\204\346\272\220\350\256\272\345\235\233.txt" | +-
file changed, insertion(+), deletion(-) MINGW64 /e/test (master)
$ git status
On branch master
nothing to commit, working tree clean
最后删除bug分支
MINGW64 /e/test (master)
$ git branch -d bug
Deleted branch bug (was 360e6ca). MINGW64 /e/test (master)
$ git branch
dev
切换到开发分支直到开发完成。
此时分支的bug没有解决,因为这不是线上环境,有bug不用担心,我们线上已经解决了。开发完成与主分支合并。
MINGW64 /e/test (dev)
$ git checkout master
Switched to branch 'master' MINGW64 /e/test (master)
$ git merge dev
Merge made by the 'recursive' strategy.
...\\\\\\\\\\\\\\\.txt" | 2 ++
file changed, insertions(+)
create mode "\346\270\205\346\230\216\350\212\202\346\212\275\345\245\226\346\264\273\345\212\250.txt" MINGW64 /e/test (master)
$ git branch
dev
* master
此时将线上分支与开发分支合并。新活动上线并且,bug也是修复成功后的状态。
这样就完成了多分支解决线上bug问题了。
我们现在的所有版本都在自己的主机上跑,实际生产环境是不可能的,我们可能会在多台不同的机器上开发同一个项目。这个时候我们需要一个远程仓库来供我们使用。
关联到远程仓库(首先在github上必须要有一个)
MINGW64 /e/test (master)
$ git remote add origin git@github.com:jefflike/git_test.git
MINGW64 /e/test (master)
$ git push origin master
The authenticity of host 'github.com (192.30.253.112)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,192.30.253.112' (RSA) to the list of known hosts.
Counting objects: , done.
Delta compression using up to threads.
Compressing objects: % (/), done.
Writing objects: % (/), 2.76 KiB | 353.00 KiB/s, done.
Total (delta ), reused (delta )
remote: Resolving deltas: % (/), done.
To github.com:jefflike/git_test.git
* [new branch] master -> master
MINGW64 /e/test (master)
$ git checkout dev
Switched to branch 'dev' a2609@DESKTOP-3FO2EDL MINGW64 /e/test (dev)
$ git push origin dev
Total (delta ), reused (delta )
To github.com:jefflike/git_test.git
* [new branch] dev -> dev
我们把分支提交到线上。
我们把代码放到仓库以后,电脑就可以扔掉了,那是不可能的。
回到家,打开自己的个人电脑,接着开发。第一件事就是从线上把代码拉下来
拉代码的两种方式
MINGW64 /e/Git_test (master)
$ git pull new_origin dev
remote: Counting objects: , done.
remote: Compressing objects: % (/), done.
remote: Total (delta ), reused (delta ), pack-reused
Unpacking objects: % (/), done.
From github.com:jefflike/git_test
* branch dev -> FETCH_HEAD
* [new branch] dev -> new_origin/dev
直接一步把开发版本拉到本地工作区,后面的解决问题主要操作就是我们之前的合并分支所进行的操作一致。
建立本地的dev分支与线上一致。
MINGW64 /e/Git_test (master)
$ git branch
* master MINGW64 /e/Git_test (master)
$ git branch dev new_origin/dev
Branch 'dev' set up to track remote branch 'dev' from 'new_origin'. MINGW64 /e/Git_test (master)
$ git checkout dev
Switched to branch 'dev'
Your branch is up to date with 'new_origin/dev'. MINGW64 /e/Git_test (dev)
$ git branch
* dev
master
git删除远程仓库的分支方式
git branch -r -d origin/branch-name
git push origin :branch-name
root@debian:/home/jeff/git_java# git branch -r -d origin/day001
已删除远程跟踪分支 origin/day001(曾为 6f9e621)。
root@debian:/home/jeff/git_java# git push origin :day001
To github.com:jefflike/java_coding.git
- [deleted] day001
Git开发必知必会的更多相关文章
- .NET程序员项目开发必知必会—Dev环境中的集成测试用例执行时上下文环境检查(实战)
Microsoft.NET 解决方案,项目开发必知必会. 从这篇文章开始我将分享一系列我认为在实际工作中很有必要的一些.NET项目开发的核心技术点,所以我称为必知必会.尽管这一系列是使用.NET/C# ...
- 2015 前端[JS]工程师必知必会
2015 前端[JS]工程师必知必会 本文摘自:http://zhuanlan.zhihu.com/FrontendMagazine/20002850 ,因为好东东西暂时没看懂,所以暂时保留下来,供以 ...
- [ 学习路线 ] 2015 前端(JS)工程师必知必会 (2)
http://segmentfault.com/a/1190000002678515?utm_source=Weibo&utm_medium=shareLink&utm_campaig ...
- 读书笔记--SQL必知必会--建立练习环境
书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL in 10 Minutes - Fourth Edition> MyS ...
- SQL 必知必会
本文介绍基本的 SQL 语句,包括查询.过滤.排序.分组.联结.视图.插入数据.创建操纵表等.入门系列,不足颇多,望诸君指点. 注意本文某些例子只能在特定的DBMS中实现(有的已标明,有的未标明),不 ...
- mysql必知必会
春节放假没事,找了本电子书mysql必知必会敲了下.用的工具是有道笔记的markdown文档类型. 下面是根据大纲已经敲完的章节,可复制到有道笔记的查看,更美观. # 第一章 了解SQL## 什么是S ...
- Android程序员必知必会的网络通信传输层协议——UDP和TCP
1.点评 互联网发展至今已经高度发达,而对于互联网应用(尤其即时通讯技术这一块)的开发者来说,网络编程是基础中的基础,只有更好地理解相关基础知识,对于应用层的开发才能做到游刃有余. 对于Android ...
- 《MySQL必知必会》整理
目录 第1章 了解数据库 1.1 数据库基础 1.1.1 什么是数据库 1.1.2 表 1.1.3 列和数据类型 1.1.4 行 1.1.5 主键 1.2 什么是SQL 第2章 MySQL简介 2.1 ...
- 迈向高阶:优秀Android程序员必知必会的网络基础
1.前言 网络通信一直是Android项目里比较重要的一个模块,Android开源项目上出现过很多优秀的网络框架,从一开始只是一些对HttpClient和HttpUrlConnection简易封装使用 ...
- 脑残式网络编程入门(三):HTTP协议必知必会的一些知识
本文原作者:“竹千代”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.前言 无论是即时通讯应用还是传统的信息系统,Http协议都是我们最常打交 ...
随机推荐
- logging console not work
配置 log 信息传输到控制台 参考官网:https://docs.djangoproject.com/en/2.1/topics/logging/ By default, this config o ...
- ubuntu 16.04 + 中文输入法
在桌面右上角设置图标中找到"System Setting",双击打开. 在打开的窗口里找到"Language Support",双击打开. 可能打开会说没有安装 ...
- deque 用法
引用博客:https://blog.csdn.net/zyq522376829/article/details/46801973 下面是那位大佬写的的笔记整理~~~~ deque - 双向队列 1.构 ...
- node 文件下载到本地 (支持中文文件名)
downloadfile:function(req,res,next){ var name= encodeURI(req.query.name); var path= req.query.url; v ...
- linux常用命令(配置查看,定时任务)
1.查看所有待挂载设备信息 fdisk -l # fdisk -l Disk /dev/sda: bytes heads, sectors/track, cylinders, total sector ...
- C语言中的32个关键字
C语言中的32个关键字 数据类型关键字(12个) (1) char:声明字符型变量或函数 (2) double:声明双精度变量或函数 (3) enum:声明美剧类型 (4) ...
- Hadoop4.2HDFS测试报告之四
第二组:文件存储读过程记录 测试系统组成 存储类型 测试程序或命令 测试文件大小(Mb) 文件个数(个) 客户端并发数(个) 读速率 (M/s) NameNode:1 DataNode:1 本地存储 ...
- 对java多线程的一些浅浅的理解
作为一名JAVA初学者,前几天刚刚接触多线程这个东西,有了些微微的理解想写下来(不对的地方请多多包涵并指教哈). 多线程怎么写代码就不说了,一搜一大堆.说说多线程我认为最难搞的地方,就是来回释放锁以及 ...
- C语言的文件处理
所谓“文件”一般指存储在外部介质上数据的集合.根据数据的组织形式,可分为ASCII文件和二进制文件.ASCII文件,又称为文本文件,它的每一个字节存放一个ASCII代码,代表一个字符.二进制文件是把内 ...
- 【NOIP2013】货车运输 最大生成树+LCA
题目描述 AA国有nn座城市,编号从 1到n,城市之间有m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重 ...