Git 版本管理
应用情景1:添加文件(单个、多个、目录)到Git版本库,提交一个版本快照。
应用情景2:穿越历史回到过去,版本回退,从当前版本回退到之前提交过的某个版本上。
应用情景3:穿越历史过头了,版本回退多了,目的时间是2000年,结果硬是穿到了1900年,没办法,又得从1900年穿越到"未来"的2000年。
情景1:
假设有一个目录 work ,里面三个文件:file1、file2、file3:
git add work/file1 # 添加单个文件到版本库
git add work/file1 work/file2 work/file3 # 添加多个文件到版本库
git add work/ # 添加整个目录到版本库
git add . # 添加所有文件到版本库(.gitignore忽略的文件除外)
git commit -m "add file1 file2 file3" # 提交版本快照
情景2:
假设从项目开发到现在,一共提交了3个版本快照到Git版本库(3次有效的 git commit),分别是
git commit -m "first commit"
git commit -m "second commit"
git commit -m "third commit"
当前我们便是在最新版本(也就是最后一次提交的版本 "third commit")上进行开发,假设突然发现 "third commit" 版本存在重大问题,需要回退到"之前某个版本"上重新开发:
# 第一步:找到之前提交的某个版本的 commit id
git log # 查看历史提交记录,里面有 commit id 信息
git log --pretty=oneline # 简化版的历史提交记录 # commit id类似于 "5c6c438396bd9db4f24d299fc68f3150ec81b2f8" 这样的字符串 # 根据 commit id 回退到指定版本
git reset --hard
git reset --hard 5c6c438396bd9db4f24d299fc68f3150ec81b2f8 # 没必要写全,写前几位即可,但是要保证Git能够根据你提供的信息找到唯一的 commit id
回退版本的另外一种方法:Git中有一个特殊的指针HEAD,永远指向当前版本,所以,可以用HEAD表示上一个版本HEAD^,上上个版本HEAD^^,向上几个版本就在HEAD后面加写几个^,当然,写太多的^不现实,所以向上100个版本可简写为HEAD~100,其它可依此类推。
git reset --hard HEAD^ # 回退到上个版本
git reset --hard HEAD^^ # 回退到上上个版本
git reset --hard HEAD~ # 回退到100个版本之前
当前版本(third commit)回退到某个版本 (first commit)后,当前版本就是 first commit。查看历史提交记录,只会有 first commit 及之前的提交记录,就仿佛是 second commit 版本和 third commit 版本是一种幻觉,从来就没有提交过一样。
情景3:
在情景2中,回退到了 first commit 版本上后发现回退多了,此时想要再回到 "未来 second commit 版本" 或是 "未来 third commit 版本"
# 版本可以自由回退穿越,但是所有的git操作都会被git按顺序记录下来,必然有某个命令可以查看历史操作。
git reflog # 查看历史操作记录,从中可以找到所有真实提交过的 commit id # 假设 second commit 版本 id 是 6w59a45,third commit 版本 id 是 8m334k2
git reset --hard 6w59a45 # 从 first commit 版本穿越到"未来" second commit 版本
git reset --hard 8m334k2 # 从 first commit 版本穿越到"未来" third commit 版本
总结:所有提交过的版本都会被Git如实的记录下来并分配独一无二的 commit id,在版本间来回穿越的关键就是想方设法找到目的版本的 commit id。
Git 版本管理的更多相关文章
- Git 版本管理的简单理解
来源:百度知道 现在使用Git版本管理代码的项目非常多.但是Git本身是一条复杂的系统.我从几个简单的点来说明Git的基本功能.希望能帮助初学者快速入门. 工具/原料 Git code dot j ...
- GIT版本管理工具
原文:http://blog.csdn.net/ithomer/article/details/7527877 Git 是一个分布式版本控制工具,它的作者 Linus Torvalds 是这样给我们介 ...
- git学习——<四>git版本管理
一.git版本管理的优势 都说git比svn强大,强大在哪呢? 首先,从部署上说:svn.cvs都是集中式的,一台服务器上部署服务,所有客户端编写的代码都要提交到该服务器上.git是分布式的,所有人都 ...
- Git——版本管理工具(一)
Git 是一个分布式版本控制工具,它的作者 Linus Torvalds 是这样给我们介绍 Git —— The stupid content tracker(傻瓜式的内容跟踪器) 1. Git 背 ...
- Git 版本管理工具(一)
转自:http://blog.csdn.net/ithomer/article/details/7527877 Git 是一个分布式版本控制工具,它的作者 Linus Torvalds 是这样给我们介 ...
- GIT版本管理工具教程
目录 GIT版本管理工具教程 一 Git初始化 二 简单指令使用 基本操作 简单总结 三 Git进阶 Git三大区域 Git回滚 Git分支 Git工作流 四 Github代码管理仓库 第一步:注册G ...
- [工具] Git版本管理(知识总结)
对以下文档进行了简要总结,方面复习: [工具] Git版本管理(一)(基本操作) [工具] Git版本管理(二)(分支) [工具] Git版本管理(三)(工作流) [工具] Git版本管理(四)(贡献 ...
- [工具] Git版本管理(四)(贡献开源代码、git配置、git免密、gitignore)
一.开源项目贡献代码 1.fork项目代码 例如,我们想向tornado框架贡献代码,首先搜索tornado. 然后,将tornado的代码fork到我们的仓库中. 2.clone到本地进行开发 克隆 ...
- 开启我的python之路,第一节,git版本管理工具
git版本管理工具 一.git功能与结构 1.Git是分布式管理系统,服务端和客户端都有版本控制功能,都能进行代码的提交,合并 2.git分为工作区,暂存区,本地仓库和远程仓库 二.git安装与查看 ...
- git版本管理策略及相关技巧(A)
公司几乎所有的项目都是使用 git 仓库来管理代码,以前对 git 只有些肤浅的了解,每次提交代码或者上线的时候总是会提心吊胆,生怕出现一些未知的问题.经过三个月的踩坑和填坑, git 操作颇显成熟. ...
随机推荐
- android: 多线程编程基础
9.1 服务是什么 服务(Service)是 Android 中实现程序后台运行的解决方案,它非常适合用于去执行那 些不需要和用户交互而且还要求长期运行的任务.服务的运行不依赖于任何用户界面,即使 ...
- Knockout.Js官网学习(系列)
1.Knockout.Js官网学习(简介) 2.Knockout.Js官网学习(监控属性Observables) Knockout.Js官网学习(数组observable) 3.Knockout.Js ...
- Backbone.js Wine Cellar 教程
中文版: http://rd.189works.com/article-74541-1.html http://www.189works.com/article-74542-1.html http:/ ...
- Windows 系统下设置Nodejs NPM全局路径
Windows下的Nodejs npm路径是appdata,很不爽,想改回来,但是在cmd下执行以下命令也无效 npm config set cache "D:\nodejs\node_ca ...
- linux上挂载windows共享文件夹
linux上挂载windows共享文件夹 1.共享windows目录 挂载之前得创建一个有password的用户(当前用户也能够),并将你要挂载的目录进行共享,并赋予读写权限 如图. watermar ...
- [aaronyang]WPF4.5 - AyTabControlBase样式分享,绝对好看
样式代码如下: 对于博客园将文章移除首页的做法:我就迁移了.文章已经迁移:http://www.ayjs.net/post/75.html 由于例子比较简单,你只要指定Style即可,难点,透明区域的 ...
- 关于VS2010出现“此方法显式使用的 CAS 策略已被 .NET Framework 弃用... ...请使用 NetFx40_LegacySecurityPolicy 配置开关”解决办法
有时候VS会出现“此方法显式使用的 CAS 策略已被 .NET Framework 弃用.若要出于兼容性原因而启用 CAS 策略,请使用 NetFx40_LegacySecurityPolicy 配置 ...
- 笔记 - 本地拦截genymotion或者Android模拟器的网络请求
我们在主机上面运行了Burp或者fiddler,那么代理已经监听在本机的8080端口了. 那么我们需要在模拟器中进行如下设置: 1.在设置中,长按当前连接的wifi网络,弹出如下: 2. 点击修改网络 ...
- WPF操作ini 文件的读写示例
/// <summary> /// IniFiles 的摘要说明. /// 示例文件路径:C:\file.ini /// [Server] //[*] 表示缓存区 /// name=loc ...
- 自定义 scrapy 爬虫的 requests
之前使用 scrapy 抓取数据的时候 ,默认是在逻辑中判断是否执行下一次请求 def parse(self): # 获取所有的url,例如获取到urls中 for url in urls: yiel ...