Git 单机版


简介:

Git 是一款开源的分布式版本控制系统,是当今最流行、先进的版本控制软件,没有之一。
Git 是一个分布式的版本控制系统,相反 SVN 就是一个集中式的版本控制系统了。SVN 每修改完一个文件要提交到服务端进行保存,而 Git 在本地有一个完整的版本库。

一、安装 Git

1、Linux( CentOS )

shell > yum -y install git

## 没错,已经安装完成了

2、Windows( WIN7 )

下载地址:https://github-windows.s3.amazonaws.com/GitHubSetup.exe
> 双击图标,选择 install( 会自动下载程序包 )
> 选择 skip ,如果你有 github 用户,也可以登陆哦
> 点击左上角的 "+" ,添加自己的版本库,输入版本库名、选择版本库路径,最后点击创建
> 然后就可以添加文件到版本库了,可以使用 Git Shell 命令行操作哟

二、Git( CentOS )

1、创建版本库

shell > git config --global user.name "wang"
shell > git config --global user.email "wang@163.com"
shell > git config --global color.ui true

## 第一、二条是设置自己的用户名、邮件地址,分布式版本控制系统嘛,用来证明你是你。由于是全局配置,本地所有的版本库都是这个名,也可以单独为某个版本库设置( 这是必须设置的 )
## 第三条是智能颜色显示,输出的结果有颜色区分,看着方便、显着高大上,对就是这个意思

shell > mkdir -p /git/gitdb ; cd /git/gitdb
shell > git init
Initialized empty Git repository in /git/gitdb/.git/
shell > ls .git/
branches config description HEAD hooks info objects refs

## 使用 git init 初始化版本库( 在哪个目录下执行,哪个目录就是版本库目录 )
## 这样就创建好了一个 gitdb 的版本库了,版本库的相关文件全保存在隐藏目录 .git 下,一般不要手动去修改里面的东西,否则会把版本库玩坏

2、向版本库中添加文件

## 关于 Git 的操作,没有特殊说明情况下,操作目录都是 /git/gitdb/ 这里

shell > head -5 /etc/passwd | tee passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

## 把 /etc/passwd 文件中的前 5 行数据重定向到了 /git/gitdb/passwd 文件中,内容如上

shell > git status
# On branch master
#
# Initial commit
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# passwd
nothing added to commit but untracked files present (use "git add" to track)

## 这时通过 git status 指令可以看到,工作区有一个名为 passwd 的文件,还没有提交( 提交前要使用 git add <file> 指令将文件添加到暂存区 )
## 工作区:版本库目录即为工作区( 在版本库目录中创建一个文件,就是在工作区创建一个文件 )
## 暂存区:使用 git add 指令时,实际上就是把文件从工作区添加到暂存区的过程
## 分支:创建版本库时,git 会自动创建一个 master 分支,使用 git commit 指令时,实际上就是把暂存区的所有文件提交到 master 分支
## 所以这三者之间的关系是:工作区-->暂存区-->分支
## git add 可以多次添加、也可以一次添加多个文件到暂存区,git commit 会一次性把暂存区的所有修改提交到分支

shell > git add passwd
shell > git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: passwd
#

## 添加完成后,发现暂存区有一个名为 passwd 的文件还没有提交( 可以使用 git rm --cached <file> 指令将暂存区的文件删除,注意:不是工作区的文件 )

shell > git rm --cached passwd
rm 'passwd'

## 删除后,你会发现:工作区的 passwd 文件还在,当使用 git status 指令时,状态又变回了没有 git add 时的状态

shell > git add passwd
shell > git commit passwd -m "one"
git commit -m "one"
[master (root-commit) 7af25e2] one
1 files changed, 5 insertions(+), 0 deletions(-)
create mode 100644 passwd

## 提交时,-m 参数用来做个标记,你可以标注一些有意思的东西,例如你做了什么修改之类的...

shell > git status
# On branch master
nothing to commit (working directory clean)

## 这时使用 git status 指令发现工作区已经没有东西了( 提交完成 )

3、恢复到上个版本或某个版本

shell > sed -i 's/nologin/login/g' passwd
shell > git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: passwd
#
no changes added to commit (use "git add" and/or "git commit -a")

## 由于把文件中 nologin 字段修改成了 login ,git status 发现 passwd 文件被修改了,但是还没有更新( git checkout -- <file> 待会说 )

shell > git diff HEAD -- passwd
diff --git a/passwd b/passwd
index 03dab68..96635c1 100644
--- a/passwd
+++ b/passwd
@@ -1,5 +1,5 @@
root:x:0:0:root:/root:/bin/bash
-bin:x:1:1:bin:/bin:/sbin/nologin
-daemon:x:2:2:daemon:/sbin:/sbin/nologin
-adm:x:3:4:adm:/var/adm:/sbin/nologin
-lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
+bin:x:1:1:bin:/bin:/sbin/login
+daemon:x:2:2:daemon:/sbin:/sbin/login
+adm:x:3:4:adm:/var/adm:/sbin/login
+lp:x:4:7:lp:/var/spool/lpd:/sbin/login

## 可以使用 git diff 指令查看工作区跟版本库( 分支 )的文件( 改动 )差异( HEAD 代表分支中( 版本库 )当前版本,即最新版本 )

shell > git add passwd
shell > git commit -m "two"
[master 6fd5803] two
1 files changed, 4 insertions(+), 4 deletions(-)
shell > git status
# On branch master
nothing to commit (working directory clean)

## 将修改后的文件提交到了版本库中,搞了个标记叫 two ,呃,代表第二次提交
## 提交完成后,工作区就没有东西了

shell > sed -i 's/bash/python/' passwd
shell > git add passwd
shell > git commit -m "three"
[master 4cba143] three
1 files changed, 1 insertions(+), 1 deletions(-)
shell > git status
# On branch master
nothing to commit (working directory clean)
shell > git diff HEAD -- passwd

## 第三次提交完成,使用 git diff 指令发现版本库中最新版本跟工作区文件完全相同

shell > git log
git log
commit 4cba14306c482080f442043b33f1dd640352a3f9
Author: wang <wang@163.com>
Date: Tue Jul 21 19:51:30 2015 +0200threecommit 6fd5803a3fc2d3039ceaf6fc0b9c4fb8f0dfc67a
Author: wang <wang@163.com>
Date: Tue Jul 21 19:43:17 2015 +0200twocommit 7af25e23a89ba16e5ff14a8da305542bc9cc6062
Author: wang <wang@163.com>
Date: Tue Jul 21 18:54:41 2015 +0200one

## 通过 git log 指令可以清楚的看到总共有三次提交,标记为 one 、two 、three ,现在想回到上次版本( two )怎么办 ?

shell > git reset --hard HEAD^
HEAD is now at 6fd5803 two
shell > cat passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/login
daemon:x:2:2:daemon:/sbin:/sbin/login
adm:x:3:4:adm:/var/adm:/sbin/login
lp:x:4:7:lp:/var/spool/lpd:/sbin/login

## 使用 git reset 指令,HEAD^ 代表上个版本,HEAD^^ 代表上两个版本,现在已经回到了 two 版本了( three 版本的 bash 变为 python 已经又恢复成 bash 了 )

shell > git log
commit 6fd5803a3fc2d3039ceaf6fc0b9c4fb8f0dfc67a
Author: wang <wang@163.com>
Date: Tue Jul 21 19:43:17 2015 +0200twocommit 7af25e23a89ba16e5ff14a8da305542bc9cc6062
Author: wang <wang@163.com>
Date: Tue Jul 21 18:54:41 2015 +0200one

## 现在就剩两个版本了,最上面 two 为最新版本,即当前版本
## 恢复到某个版本,假设有好多好多个版本,使用 HEAD^^^^ 或 HEAD~[number] 的方式就很不方便了( 都要数 )
## 既然 HEAD 代表版本号,那么恢复时直接输入版本号不就可以了?非常方便,git log 指令输出的 commit 字段( 7af25e23a89ba16e5ff14a8da305542bc9cc6062 )就是版本号

shell > git reset --hard 7af25e2
HEAD is now at 7af25e2 one
shell > cat passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

## 使用 git reset 指令时,只需输出版本号的前几位即可,可以看到已经恢复到了第一版,文件内容也变回了最初的状态

shell > git log
commit 7af25e23a89ba16e5ff14a8da305542bc9cc6062
Author: wang <wang@163.com>
Date: Tue Jul 21 18:54:41 2015 +0200one

## 这时使用 git log 指令发现只有第一次提交的版本了,那么现在想回到 two 或 three 版本该怎么办?( 版本号没有了 )

shell > git reflog
7af25e2 HEAD@{0}: 7af25e2: updating HEAD
6fd5803 HEAD@{1}: HEAD^: updating HEAD
4cba143 HEAD@{2}: commit: three
6fd5803 HEAD@{3}: commit: two
shell > git reset --hard 4cba143
HEAD is now at 4cba143 three

## 使用 git reflog 指令可以看到操作记录,第一列就是我们想要的版本号,再次使用 git reset 指令恢复即可

shell > cat passwd
root:x:0:0:root:/root:/bin/python
bin:x:1:1:bin:/bin:/sbin/login
daemon:x:2:2:daemon:/sbin:/sbin/login
adm:x:3:4:adm:/var/adm:/sbin/login
lp:x:4:7:lp:/var/spool/lpd:/sbin/login
shell > git log
commit 4cba14306c482080f442043b33f1dd640352a3f9
Author: wang <wang@163.com>
Date: Tue Jul 21 19:51:30 2015 +0200threecommit 6fd5803a3fc2d3039ceaf6fc0b9c4fb8f0dfc67a
Author: wang <wang@163.com>
Date: Tue Jul 21 19:43:17 2015 +0200twocommit 7af25e23a89ba16e5ff14a8da305542bc9cc6062
Author: wang <wang@163.com>
Date: Tue Jul 21 18:54:41 2015 +0200one

## 文件内容、版本信息都回来了,现在的版本恢复到了 three 状态

4、git checkout -- <file> :还记得这个不 ?

shell > sed -i '1d' passwd
shell > git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: passwd
#
no changes added to commit (use "git add" and/or "git commit -a")

## 当修改了工作区文件内容后,使用 git status 指令可以看到这样的提示( git checkout -- <file> 可以撤销工作区文件的修改 )

shell > cat passwd
bin:x:1:1:bin:/bin:/sbin/login
daemon:x:2:2:daemon:/sbin:/sbin/login
adm:x:3:4:adm:/var/adm:/sbin/login
lp:x:4:7:lp:/var/spool/lpd:/sbin/loginshell > git checkout -- passwd

## 使用 git checkout 指令撤销工作区文件的改动( 恢复到跟版本库一样的状态,就是刚才所有的修改全部被撤回 )

shell > sed -i '1d' passwd
shell > git add passwd
shell > sed -i '1d' passwd
shell > git status
shell > git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: passwd
#
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: passwd
#

## 现在是一个什么情况呢 ?首先删除了文件第一行,执行了 git add 指令( 文件的修改被添加到了暂存区 ),接着又删除了一次,那么现在执行 git checkout 指令文件被恢复成什么样 ?

shell > git checkout -- passwd

## 实践证明:文件被恢复到了暂存区的状态,也就是删除一次的状态

shell > git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: passwd
#

## 这是暂存区的状态,怎么恢复暂存区的状态,也就是把第一次的删除也撤销( 注意:这已经 git add 了 )

shell > git reset HEAD passwd
Unstaged changes after reset:
M passwd

## 还记得 git reset 这个指令不,没错用来恢复文件到上个版本的,也可以用来将暂存区的改动回退到工作区

shell > git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: passwd
#
no changes added to commit (use "git add" and/or "git commit -a")

## 再次查看状态,提示工作区有改动,可以使用 git checkout -- <file> 将工作区的改动也撤销

## git reset 将文件回退到上一次版本 / 将暂存区的改动回退到工作区
## git checkout 将工作区的改动撤销 / 将工作区的改动回退到暂存区

5、删除文件

shell > git rm passwd
rm 'passwd'
shell > git commit -m "delete passwd"
[master 3be8d7a] delete passwd
1 files changed, 0 insertions(+), 5 deletions(-)
delete mode 100644 passwd

## 使用 git rm 指令将版本库中的文件删除,然后提交删除( 文件就被删除了,版本库目录下也没有了 )

shell > git log
commit 3be8d7a3ade6f8947135843832bb6cfa075638a4
Author: wang <wang@163.com>
Date: Wed Jul 22 13:18:23 2015 +0200delete passwdcommit 4cba14306c482080f442043b33f1dd640352a3f9
Author: wang <wang@163.com>
Date: Tue Jul 21 19:51:30 2015 +0200threecommit 6fd5803a3fc2d3039ceaf6fc0b9c4fb8f0dfc67a
Author: wang <wang@163.com>
Date: Tue Jul 21 19:43:17 2015 +0200twocommit 7af25e23a89ba16e5ff14a8da305542bc9cc6062
Author: wang <wang@163.com>
Date: Tue Jul 21 18:54:41 2015 +0200oneshell > git reset --hard 4cba14
HEAD is now at 4cba143 three

## ... 好不容易删除了,结果又给恢复了 ^_^ ,不要高兴太早,如果修改完文件,没有提交就删除了文件,那么刚才的修改就真的丢失了..

shell > rm -rf passwd
shell > git reset --hard 4cba14
HEAD is now at 4cba143 three

## 是不是再也不用担心误删除文件了 ^_^ ( 单机情况下你别物理磁盘爆炸了,那就真的啥也没有了 )
## 参考教程:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

转载于:https://www.cnblogs.com/wangxiaoqiangs/p/5336347.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/543517.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java中的Attribute类_java培训技术ModelAttribute注解修饰POJO类型的入参

RequestMapping(“/testModelAttribute”)//public String testModelAttribute(User user){public String testModelAttribute(ModelAttribute(“abc”) User user){System.out.println(“修改 user”user);return “success”;}/*** ModelAttribute 注解也可以来修饰目标方法 …

php a链接怎么传id_PHP函数参数的传递

PHP 支持两种参数传递方式&#xff0c;分别是按值传递(默认)和按引用传递。另外&#xff0c;PHP 还支持默认参数和可变长度参数列表。参数传递方式在调用函数时需要向函数传递参数&#xff0c;被传入的参数称作实参&#xff0c;而函数定义的参数为形参。PHP 中函数参数传递有 2…

VMware converte报错记录

物理机&#xff1a;centos7.2虚拟化&#xff1a;esxi6.0在进行P2V的时候&#xff0c;尝试了最新的VMware converte6.1及5.5均失败告终。最后在VMware converte6.0中解决迁移问题。转载于:https://blog.51cto.com/bigpi/1758352

php时区问题,PHP中遇到的时区问题解决方法

最近在学习PHP过程中发现PHP中的格式化时间戳比北京时间晚了8个小时&#xff0c;上网搜索发现原来是时区不对&#xff0c;解决办法是&#xff1a;1、永久修改更改php.ini文件中的data.timezone PRC 这是中国时间。重启Apache服务后生效。2、临时修改在使用格式化输入时间之前…

OSG开发概览

1 OSG基础知识 OSG是Open Scene Graphic 的缩写&#xff0c;OSG于1997年诞生于以为滑翔机爱好者之手&#xff0c;Don burns 为了对滑翔机的飞行进行模拟&#xff0c;对openGL的库进行了封装&#xff0c;osg的雏形就这样诞生了&#xff0c;1998年Don burns 遇到了同样喜欢滑翔…

hbuilder php xdebug,Hbuilder使用xdebug配置php断点调试

2019独角兽企业重金招聘Python工程师标准>>>##1. 背景不得不说Hbuilder是免费的前端开发工具中比较好用的&#xff0c;而且配合aptana开发php也马马虎虎(毕竟写前端的时候多些)。本人原是搞java的&#xff0c;后来打算用php做些个人项目(因为服务器成本低)&#xff0c…

iwpriv工具通过ioctl动态获取相应无线网卡驱动的private_args所有扩展参数

iwpriv工具通过ioctl动态获取相应无线网卡驱动的private_args所有扩展参数iwpriv是处理下面的wlan_private_args的所有扩展命令,iwpriv的实现上,是这样的,>main>set_private>iw_get_priv_info获取wireless网卡所能处理的所有wlan_private_args类型.dev_ioctl>wext_…

PHP登录表单提交前端验证,form表单提交前先用ajax进行验证(前端)

确 定var csrfToken Yii::$app->request->csrfToken?>;var reg /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;var regNum /^\d{6}$/;function check_form() {n false;//全局变量&#xff0c;以便下面做判断var dirversNum $(#dirversNum).val();var archivesNu…

用鼠标去控制物体移动的方法

using UnityEngine; using System.Collections;public class hero : MonoBehaviour {private bool isMouseDown false;private Vector3 lastMousePositionVector3.zero;void Update () {PlayerControler();}public void PlayerControler(){//将像素位置转换成世界坐标轴的位置…

php获取flash上传视频文件大小,如何获取flash文件(.swf文件)的长度和宽度

Flash文件一般是可以缩放的&#xff0c;但缩放显示会一影响flash的效果&#xff0c;比如动作变慢或变快。要想以最佳状态显示&#xff0c;就需要获取flash文件的长度和宽度&#xff0c;因此要使用方法&#xff1a;引入该文件Require(‘swfheader.class.php’);创建一个类的实例…

mx播放器有没有投屏功能_无线投屏、即插即用,投影仪其实可以更智能:明基 E580T...

无论是简单的办公室会议还是小型的线下活动&#xff0c;投影仪都是必不可少的利器&#xff1a;既能有不错的显示效果&#xff0c;也不用受屏幕尺寸的约束。尽管越来越多的智能电视可供电脑连接&#xff0c;但真正派上用场的时候&#xff0c;拎箱就走的投影仪显然是最佳选择。很…

特殊矩阵-对角矩阵

2019独角兽企业重金招聘Python工程师标准>>> 挖坑。 转载于:https://my.oschina.net/aslanjia/blog/651503

php常见漏洞修复,phpstudy漏洞修复方法

一.通过修改服务器环境内php.ini文件&#xff0c;将“expose_php On”修改成“expose_php Off”然后重启php即可。二.若无需要可以将一些php的危险函数禁用&#xff0c;打开/etc/php.ini文件&#xff0c;查找到 disable_functions&#xff0c;添加需禁用的以下函数名&#xf…

vs运行时候冒了这个错:无法启动IIS Express Web 服务器~Win10

后期会在博客首发更新&#xff1a;http://dnt.dkill.net 异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 网上的方法多种&#xff0c;有让安装扩展插件的&#xff0c;有让在程序里面添加Http系列的组件&#xff0c;有其它其它的&#xff0c;可是。。。…

matlab脚本 定时停止_一触即发是什么软件?它是手机上极其强大的一款脚本辅助精灵...

一触即发app是手机上极其强大的一款免root的脚本辅助软件&#xff0c;堪称一键秒杀脚本精灵&#xff0c;除自动化、运行、管理外&#xff0c;还提供了脚本制作文字教程/视频教程&#xff0c;学习社区和图色处理、定时执行、王者荣耀、变量等命令参数和多点找色、多点找图、京东…

php无限极,php实现无限极分类 - MyClassPHP-Colin主页 - OSCHINA - 中文开源技术交流社区...

/*** 无限分类* param [type] $model 一个模型对象* param integer $pid 上级ID* param array &$categorys 一个保存结果的数组* param integer $spac 空格循环次数* return [type] array*/function data2array($model null , $pid 0 , &$categorys array() , $spac…

Graph(2014辽宁ACM省赛)

问题 F: Graph 时间限制: 1 Sec 内存限制: 128 MB提交: 30 解决: 5[提交][状态][论坛]题目描写叙述 Your task is to judge whether a regular polygon can be drawn only by straightedge and compass. The length of the straightedge is infinite. The width of the compa…

笔记本电脑处理器_高通提示低成本5G芯片更强大的笔记本电脑处理器

高通公司总裁克里斯蒂亚诺阿蒙(Cristiano Amon)在今天的柏林IFA贸易展览会的虚拟主题演讲中说&#xff0c;我们将很快看到更便宜的5G手机&#xff0c;以及更多具有更好应用兼容性的Windows-on-Snapdragon笔记本电脑。欧洲主要的电子产品展览会IFA今年被分成​​几个小组活动&am…

php分布式的锁,laravel分布式并发锁

环境要求1.PHP > 72.composer3.redis(必须支持lua)4.prediscomposer 安装redis 安装predis 安装composer require predis/predislock 安装第一步, 安装alravel-lockcomposer require nabao/laravel-lock第二步, 生成配置文件php artisan vendor:publish --provider"Loc…

linux 标准 GPIO 操作

Linux 提供了GPIO 操作的 API&#xff0c;具体初始化及注册函数在 driver/gpio/lib_gpio.c 中实现。#include int gpio_request(unsigned gpio, const char *label);获得并占有 GPIO port 的使用权&#xff0c;由参数 gpio 指定具体 port。非空的label指针有助于诊断。主要告…