【Git入门之五】版本管理
2013-10-04 08:13
267 查看
原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12271811
[cpp] view
plaincopy
#总共是4个操作
$ git log --pretty=oneline
c5c83cfcdb25c67a5c66b4fe3844d0ea912830ec remove JackyData03
a25c58804cb3f4045564fc0ec6a4e6eb4dae7072 amend modify JackyData02
cba8800f2daaf4075a506b6d763798ea15ba11cc modify JackyData01
aea0365712908805bc28540b4db9fd2f15360a8b init AddFiles
现在我后悔了,不想移除JackyData03,怎么办?
git reset用于版本回退,首先我们必须先知道当前版本是哪个,git用HEAD来表示当前版本。HEAD^表示上一个版本,HEAD^^表示上上个版本,HEAD~100表示往前100个版本。
[cpp] view
plaincopy
#回退到上一个版本
$ git reset --hard HEAD^
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分支。
以上操作都是属于比较危险的操作,需谨慎处理。
[cpp] view
plaincopy
#只剩3个操作了,移除JackyData03的操作不见了
$ git log --pretty=oneline
a25c58804cb3f4045564fc0ec6a4e6eb4dae7072 amend modify JackyData02
cba8800f2daaf4075a506b6d763798ea15ba11cc modify JackyData01
aea0365712908805bc28540b4db9fd2f15360a8b init AddFiles
现在我又后悔了,想回到JackyData03被移除的状态。
(1)如果git bash没被关掉,向前滚动找到
[cpp] view
plaincopy
#移除JackyData03文件的版本号
c5c83cfcdb25c67a5c66b4fe3844d0ea912830ec remove JackyData03
有了这个版本号,我们就可以这么做
[cpp] view
plaincopy
#还是使用reset,直接选择要切换的版本号
$ git reset --hard c5c83c
HEAD is now at c5c83cf remove JackyData03
当然版本号可用不用完全输入,输入前几个git就会帮你找到,也不能太少,太少可能会找出多个。
可以看到提示HEAD现在处在c5c83c这个版本位置。
(2)如果git bash被关掉了,找不到版本号了怎么办?
git reflog可以显示每一次的操作记录。
[cpp] view
plaincopy
$ git reflog
c5c83cf HEAD@{0}: reset: moving to c5c83c
a25c588 HEAD@{1}: reset: moving to HEAD^
c5c83cf HEAD@{2}: commit: remove JackyData03
a25c588 HEAD@{3}: commit (amend): amend modify JackyData02
a5f6601 HEAD@{4}: commit: modify JackyData02
cba8800 HEAD@{5}: commit: modify JackyData01
aea0365 HEAD@{6}: commit (initial): init AddFiles
然后再使用reset命令,就可以随意选择版本了。
[cpp] view
plaincopy
#修改JackyData01内容
$ echo "GoodBye SVN" > Jackydata01
看一下状态
[cpp] view
plaincopy
#看一下状态,Jackydata01在工作区被修改了(红色高亮)
$ 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: Jackydata01
#
no changes added to commit (use "git add" and/or "git commit -a")
现在我后悔了(最后一次),想要撤销删除怎么办?
git checkout --file可以撤销工作区的修改
[cpp] view
plaincopy
#撤销JAckydata01的改动
$ git checkout -- Jackydata01
#看一下当前Git仓库的状态,干净的
$ git status
# On branch master
nothing to commit, working directory clean
[cpp] view
plaincopy
#修改JackyData01内容
$ echo "GoodBye SVN" > JackyData01
这次手太快了,直接把修改的内容add到暂存区了。
[cpp] view
plaincopy
#修改内容add到暂存区
$ git add Jackydata01
#看一下状态,JackyData01在被修改了,并add到暂存区(绿色高亮)
yf005@yf005 /d/jackygit (master)
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: Jackydata01
#
嗯,没错你猜对了。我后悔了(节操呢?),这时要怎么办?
这时直接使用git checkout --file是无效的。
必须先使用git reset HEAD file把暂存区的修改撤回到工作区的修改。
[cpp] view
plaincopy
#撤回到工作区的修改
$ git reset HEAD Jackydata01
Unstaged changes after reset:
M Jackydata01
#看一下当前状态,未添加到暂存区(红色高亮)
$ 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: Jackydata01
#
no changes added to commit (use "git add" and/or "git commit -a")
这个时候重复3.1.工作区内的撤销修改即可。
1.版本回退
我们先看一下从项目开始到现在做了什么操作。[cpp] view
plaincopy
#总共是4个操作
$ git log --pretty=oneline
c5c83cfcdb25c67a5c66b4fe3844d0ea912830ec remove JackyData03
a25c58804cb3f4045564fc0ec6a4e6eb4dae7072 amend modify JackyData02
cba8800f2daaf4075a506b6d763798ea15ba11cc modify JackyData01
aea0365712908805bc28540b4db9fd2f15360a8b init AddFiles
现在我后悔了,不想移除JackyData03,怎么办?
git reset用于版本回退,首先我们必须先知道当前版本是哪个,git用HEAD来表示当前版本。HEAD^表示上一个版本,HEAD^^表示上上个版本,HEAD~100表示往前100个版本。
[cpp] view
plaincopy
#回退到上一个版本
$ git reset --hard HEAD^
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.版本选择
这时我们再看看操作日记。[cpp] view
plaincopy
#只剩3个操作了,移除JackyData03的操作不见了
$ git log --pretty=oneline
a25c58804cb3f4045564fc0ec6a4e6eb4dae7072 amend modify JackyData02
cba8800f2daaf4075a506b6d763798ea15ba11cc modify JackyData01
aea0365712908805bc28540b4db9fd2f15360a8b init AddFiles
现在我又后悔了,想回到JackyData03被移除的状态。
(1)如果git bash没被关掉,向前滚动找到
[cpp] view
plaincopy
#移除JackyData03文件的版本号
c5c83cfcdb25c67a5c66b4fe3844d0ea912830ec remove JackyData03
有了这个版本号,我们就可以这么做
[cpp] view
plaincopy
#还是使用reset,直接选择要切换的版本号
$ git reset --hard c5c83c
HEAD is now at c5c83cf remove JackyData03
当然版本号可用不用完全输入,输入前几个git就会帮你找到,也不能太少,太少可能会找出多个。
可以看到提示HEAD现在处在c5c83c这个版本位置。
(2)如果git bash被关掉了,找不到版本号了怎么办?
git reflog可以显示每一次的操作记录。
[cpp] view
plaincopy
$ git reflog
c5c83cf HEAD@{0}: reset: moving to c5c83c
a25c588 HEAD@{1}: reset: moving to HEAD^
c5c83cf HEAD@{2}: commit: remove JackyData03
a25c588 HEAD@{3}: commit (amend): amend modify JackyData02
a5f6601 HEAD@{4}: commit: modify JackyData02
cba8800 HEAD@{5}: commit: modify JackyData01
aea0365 HEAD@{6}: commit (initial): init AddFiles
然后再使用reset命令,就可以随意选择版本了。
3.撤销修改
3.1.工作区
再修改点东西。[cpp] view
plaincopy
#修改JackyData01内容
$ echo "GoodBye SVN" > Jackydata01
看一下状态
[cpp] view
plaincopy
#看一下状态,Jackydata01在工作区被修改了(红色高亮)
$ 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: Jackydata01
#
no changes added to commit (use "git add" and/or "git commit -a")
现在我后悔了(最后一次),想要撤销删除怎么办?
git checkout --file可以撤销工作区的修改
[cpp] view
plaincopy
#撤销JAckydata01的改动
$ git checkout -- Jackydata01
#看一下当前Git仓库的状态,干净的
$ git status
# On branch master
nothing to commit, working directory clean
3.2.暂存区
再改Jackydata01的内容。[cpp] view
plaincopy
#修改JackyData01内容
$ echo "GoodBye SVN" > JackyData01
这次手太快了,直接把修改的内容add到暂存区了。
[cpp] view
plaincopy
#修改内容add到暂存区
$ git add Jackydata01
#看一下状态,JackyData01在被修改了,并add到暂存区(绿色高亮)
yf005@yf005 /d/jackygit (master)
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: Jackydata01
#
嗯,没错你猜对了。我后悔了(节操呢?),这时要怎么办?
这时直接使用git checkout --file是无效的。
必须先使用git reset HEAD file把暂存区的修改撤回到工作区的修改。
[cpp] view
plaincopy
#撤回到工作区的修改
$ git reset HEAD Jackydata01
Unstaged changes after reset:
M Jackydata01
#看一下当前状态,未添加到暂存区(红色高亮)
$ 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: Jackydata01
#
no changes added to commit (use "git add" and/or "git commit -a")
这个时候重复3.1.工作区内的撤销修改即可。
3.3.已提交到版本库
如果已经提交到版本库,那么使用1.版本回退功能吧。3.4.其他撤销指令
其他撤销指令诸如git clean和git revert请自行尝试。相关文章推荐
- 【Git入门之五】版本管理
- 【Git入门之五】版本管理
- Git学习笔记--Git入门
- Git 入门
- Git入门介绍-2-git在windows上安装
- Git 版本控制与工作流 - Git入门篇
- 【Git入门之二】基本术语
- Git简单入门教程
- Git入门介绍-3-把本地项目提交到Github
- Git DVCs分布式版本控制工具入门
- Git入门及基本配置
- idea中Git与GitHub的使用入门
- Git - 【Github教程】史上最全github使用方法:github入门到精通
- git快捷入门 常用命令
- Git入门指南七:查看提交历史
- mac os x使用Git简易入门教程
- git快速入门(五)远程仓库以及如何使用github
- Git 入门
- Git入门——本地版本库操作