【Git入门之五】版本管理

原创 2013年10月04日 08:13:47

原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12271811


1.版本回退

我们先看一下从项目开始到现在做了什么操作。

  1. #总共是4个操作  
  2. $ git log --pretty=oneline  
  3. c5c83cfcdb25c67a5c66b4fe3844d0ea912830ec remove JackyData03  
  4. a25c58804cb3f4045564fc0ec6a4e6eb4dae7072 amend modify JackyData02  
  5. cba8800f2daaf4075a506b6d763798ea15ba11cc modify JackyData01  
  6. aea0365712908805bc28540b4db9fd2f15360a8b init AddFiles  
现在我后悔了,不想移除JackyData03,怎么办?

git reset用于版本回退,首先我们必须先知道当前版本是哪个,git用HEAD来表示当前版本。HEAD^表示上一个版本,HEAD^^表示上上个版本,HEAD~100表示往前100个版本。

  1. #回退到上一个版本  
  2. $ git reset --hard HEAD^  
  3. HEAD is now at a25c588 amend modify JackyData02  

现在看看,JackyGit/JackyData03是不是又回来了。

注意:

(1)--hard参数会把源码也给回退到指定版本,如果不用--hard,源码不会修改,只会回退,这时候如果想回退源码,需要再用git checkout<file>命令恢复。

(2)reset只对本地仓库有效,而对远程仓库无效。如果要reset远程版本,可以这么做:

①先不要在本地reset,而是先创建一个分支old_master,并切换到old_master分支。

②push old_master分支到远程仓库。

③在old_master分支上reset版本,并删除本地的master分支和远程的master分支。

④创建本地分支master,推送到远程分支master,此时远程分支会新建master。

⑤删除本地old_master分支和远程old_master分支。

以上操作都是属于比较危险的操作,需谨慎处理。


2.版本选择

这时我们再看看操作日记。

  1. #只剩3个操作了,移除JackyData03的操作不见了  
  2. $ git log --pretty=oneline  
  3. a25c58804cb3f4045564fc0ec6a4e6eb4dae7072 amend modify JackyData02  
  4. cba8800f2daaf4075a506b6d763798ea15ba11cc modify JackyData01  
  5. aea0365712908805bc28540b4db9fd2f15360a8b init AddFiles  
现在我又后悔了,想回到JackyData03被移除的状态。

(1)如果git bash没被关掉,向前滚动找到

  1. #移除JackyData03文件的版本号  
  2. c5c83cfcdb25c67a5c66b4fe3844d0ea912830ec remove JackyData03  
有了这个版本号,我们就可以这么做

  1. #还是使用reset,直接选择要切换的版本号  
  2. $ git reset --hard c5c83c  
  3. HEAD is now at c5c83cf remove JackyData03  
当然版本号可用不用完全输入,输入前几个git就会帮你找到,也不能太少,太少可能会找出多个。

可以看到提示HEAD现在处在c5c83c这个版本位置。

(2)如果git bash被关掉了,找不到版本号了怎么办?

git reflog可以显示每一次的操作记录。

  1. $ git reflog  
  2. c5c83cf HEAD@{0}: reset: moving to c5c83c  
  3. a25c588 HEAD@{1}: reset: moving to HEAD^  
  4. c5c83cf HEAD@{2}: commit: remove JackyData03  
  5. a25c588 HEAD@{3}: commit (amend): amend modify JackyData02  
  6. a5f6601 HEAD@{4}: commit: modify JackyData02  
  7. cba8800 HEAD@{5}: commit: modify JackyData01  
  8. aea0365 HEAD@{6}: commit (initial): init AddFiles  
然后再使用reset命令,就可以随意选择版本了。


3.撤销修改

3.1.工作区

再修改点东西。

  1. #修改JackyData01内容  
  2. $ echo "GoodBye SVN" > Jackydata01  
看一下状态

  1. #看一下状态,Jackydata01在工作区被修改了(红色高亮)  
  2. $ git status  
  3. # On branch master  
  4. # Changes not staged for commit:  
  5. #   (use "git add <file>..." to update what will be committed)  
  6. #   (use "git checkout -- <file>..." to discard changes in working directory)  
  7. #  
  8. #       modified:   Jackydata01  
  9. #  
  10. no changes added to commit (use "git add" and/or "git commit -a")  
现在我后悔了(最后一次),想要撤销删除怎么办?

git checkout --file可以撤销工作区的修改

  1. #撤销JAckydata01的改动  
  2. $ git checkout -- Jackydata01  
  3.   
  4. #看一下当前Git仓库的状态,干净的  
  5. $ git status  
  6. # On branch master  
  7. nothing to commit, working directory clean  

3.2.暂存区

再改Jackydata01的内容。

  1. #修改JackyData01内容  
  2. $ echo "GoodBye SVN" > JackyData01  
这次手太快了,直接把修改的内容add到暂存区了。

  1. #修改内容add到暂存区  
  2. $ git add Jackydata01  
  3.   
  4. #看一下状态,JackyData01在被修改了,并add到暂存区(绿色高亮)  
  5. yf005@yf005 /d/jackygit (master)  
  6. $ git status  
  7. # On branch master  
  8. # Changes to be committed:  
  9. #   (use "git reset HEAD <file>..." to unstage)  
  10. #  
  11. #       modified:   Jackydata01  
  12. #  
嗯,没错你猜对了。我后悔了(节操呢?),这时要怎么办?

这时直接使用git checkout --file是无效的。

必须先使用git reset HEAD file把暂存区的修改撤回到工作区的修改。

  1. #撤回到工作区的修改  
  2. $ git reset HEAD Jackydata01  
  3. Unstaged changes after reset:  
  4. M       Jackydata01  
  5.   
  6. #看一下当前状态,未添加到暂存区(红色高亮)  
  7. $ git status  
  8. # On branch master  
  9. # Changes not staged for commit:  
  10. #   (use "git add <file>..." to update what will be committed)  
  11. #   (use "git checkout -- <file>..." to discard changes in working directory)  
  12. #  
  13. #       modified:   Jackydata01  
  14. #  
  15. no changes added to commit (use "git add" and/or "git commit -a")  
这个时候重复3.1.工作区内的撤销修改即可。

3.3.已提交到版本库

如果已经提交到版本库,那么使用1.版本回退功能吧。


3.4.其他撤销指令

其他撤销指令诸如git clean和git revert请自行尝试。

版权声明:本文为博主原创文章,未经博主允许不得转载。

神经网络入门(连载之五)

游戏编程中的人工智能技术 ( 连载之五 ) 4.5 神经网络的编码(Encoding the Network)    在本书的开始几章中,你已经看到过...
  • hmy1106
  • hmy1106
  • 2015年03月25日 08:42
  • 1402

git干货系列:(五)多人协同工作之分支管理

分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习 Git 的时候,另一个你正在另一个平行宇宙里努力学习 SVN 。如果两个平行宇宙互不干扰,那对现在的你也没啥影响。不过,在某个时间点,两个平行宇...
  • AlbertFly
  • AlbertFly
  • 2017年03月18日 21:52
  • 326

USB入门系列总结

USB是什么呢?一说USB是You SB的意思,即“你傻B”的意思。另一种说法是USB其实是美国的弟弟,因为美国叫USA,USB当然是他的弟弟了。     那么USB到底是什么呢?其实USB是通...
  • u013916997
  • u013916997
  • 2014年05月27日 17:09
  • 839

git版本管理的主要操作

这一篇就来介绍版本管理的主要活动——开发过程中的 git 操作。各种操作都只给出一个简单的例子让大家熟悉怎么使用,至于经验之谈就留待后作了。   首先,演示一下怎么基于 github 进行协同开发。...
  • liuqiaoyu080512
  • liuqiaoyu080512
  • 2013年02月27日 19:17
  • 4299

Spark编程指南入门之Java篇六-RDD持久化介绍

10. RDD持久化 Spark其中一个重要的功能是持久化(或缓存)数据到内存。当持久化一个RDD时,每一个节点会把计算后的分区数据保存在内存里面,然后后续的操作可以直接重用内存里的数据。这样可以提...
  • gangchengzhong
  • gangchengzhong
  • 2017年01月12日 16:47
  • 996

[深度学习基础] 5. 实现细节

在做工程实现时, 除了理论推导要正确外, 还要考虑诸如计算机的数值稳定性, 计算速度, 收敛快慢等问题. 本章将就一些实现细节问题加以讨论. 1 Softmax 的数值稳定性问题 在计...
  • Hao_Zhang_Vision
  • Hao_Zhang_Vision
  • 2016年09月26日 20:07
  • 661

版本管理之gitlab实践教程:基础篇(1)

这几篇文章主要面向对git和gitlab稍有基础,但是又不太会用的使用者,通过这几文章你可以学到如下gitlab的使用方法: sshkey的设定 创建项目 分支操作 用户/权限/组的操作 配置项目可见...
  • liumiaocn
  • liumiaocn
  • 2017年07月04日 17:39
  • 1249

Git版本控制详解

注意:原文地址:http://www.ihref.com/read-16369.html 学习前请先配置好Git客户端 相关文章:Git客户端图文详解如何安装配置GitHub操作流程攻略 官方中...
  • RuingMan
  • RuingMan
  • 2016年05月13日 21:21
  • 12086

代码版本管理软件Git的优势和用法

代码版本管理软件Git的优势和用法 Git是什么 Git 是一款免费的、开源的、分布式的版本控制系统。旨在快速高效地处理无论规模大小的任何软件工程。 每一个 Git克隆 都是一个...
  • liubogod
  • liubogod
  • 2018年01月28日 14:53
  • 13

Git入门(一)——没有版本控制意识的程序员不是一个好的程序员

创建个人GitHub主页以及Git的简单实用
  • u014294166
  • u014294166
  • 2016年06月25日 10:43
  • 3180
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Git入门之五】版本管理
举报原因:
原因补充:

(最多只允许输入30个字)