处理版本回退
1,有哪些版本,查看日志看我们都做了哪些提交
git log
commitId :
commit xxxxxxxxxxxxxxxxx每次提交生成的唯一代码
author :
xxxxxxx 谁提交的
Date :
xxxxxxxxxxx 提交日期
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上 --pretty=oneline
参数,参数--abbrev-commit
可以缩短commitId
2、版本的回退 前进
git reset --hard commitId
回退 :
还记得上边 git status中的注释吗?
(use "git reset HEAD <file>..." to unstage)
# 从缓存区重置回工作区
HEAD表示当前版本,当一个文件修改到暂存区还没提交时,可以执行 git reset HEAD xxxxx
将该文件在暂存区的内容重置为最新的版本,相当于将修改的退回给工作区,清空暂存区提交的内容。
回退到上一个版本 git reset --hard HEAD^
[root@sf160114 learnGit]# git reset --hard HEAD^
HEAD is now at e215485 只提交redeme。txt的第三次修改
回退到上上个版本 :
git reset --hard HEAD^^
或
git reset --hard HEAD~2
git reset --hard HEAD~N
回退N个版本
git reset --hard 49adedd
回退到版本49adedd
此时,再查看日志就找不到最新的那条日志了,因为所有的版本已经回退了。
前进 :
当我们回退了版本后,后悔了,想把版本恢复回去要怎么办呢??
git reset --hard commitId
commitId:
可以为完整的40位,也可以是不冲突的前边一部分即可
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD
指针,当你回退版本的时候,Git仅仅是改变HEAD的指向:
可是当我们的回退版本后已经看不到最新的版本的日志了,我们想把HEAD指针指向之前的新版本该怎么办呢?
git reflog
可以看到之前的所有的版本 我们要前进的版本为 0b89000
[root@sf160114 learnGit]# git reset --hard 0b89000
HEAD is now at 0b89000 只提交ys.txt的第三次提交
现在总结一下:
- HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令
git reset --hard commit_id
。 - 前进回退前,用
git log
可以查看提交历史,以便确定要回退到哪个版本。 - 要重返未来,用
git reflog
查看命令历史,以便确定要回到未来的哪个版本。
提交只会提交暂存区域的修改,工作区域的不会提交!!
操作回退
撤销修改内容
1,修改尚未提交到暂存区 (丢弃工作区修改)
git checkout -- 文件名
将工作区内容还原
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态
。
2,修改已提交到暂存区,但未提交到版本库(丢弃暂存区修改)
git reset HEAD <file>
把暂存区的修改撤销掉(unstage),重新放回工作区,可以再次丢弃暂存区修改
3,修改已提交到版本库,但未推送到远程版本库
回退版本:git reset -- hard commitId
4,修改已推送到远程版本库
鸡鸡!!!
文件删除与撤销删除
1, 当你要删除某一个文件的时候,执行
git rm xxxxx
该操作将同时删除版本库和本地工作区域的文件xxxxx
该删除操作将同时提交到暂存区
[root@sf160114 learnGit]# git rm test.txt
rm 'test.txt'
[root@sf160114 learnGit]# git status
# On branch master
# Changes to be committed: rm完之后改变就已经进入暂存区可用于提交了
# (use "git reset HEAD <file>..." to unstage)
#
# deleted: test.txt
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# `
我们上边提到,提交到暂存区的修改,可以使用git reset HEAD test.txt
撤销回工作区,然后再从工作区撤销回原始状态。
[root@sf160114 learnGit]# git rm ys.txt
rm 'ys.txt'
[root@sf160114 learnGit]# git status
# 删除之后直接到了暂存区,用于提交
# On branch feature1
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# deleted: ys.txt
#
[root@sf160114 learnGit]# git reset HEAD ys.txt
Unstaged changes after reset:
D ys.txt
[root@sf160114 learnGit]# git status
# 已撤销回工作区
# On branch feature1
# 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: ys.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
[root@sf160114 learnGit]# git checkout -- ys.txt
[root@sf160114 learnGit]# git status
# On branch feature1
nothing to commit, working directory clean
也可以直接找到最后一次提交的commitId,直接将其重置为最后一次提交的状态。
[root@sf160114 learnGit]# git rm ys.txt
rm 'ys.txt'
[root@sf160114 learnGit]# ls
` readme.txt
[root@sf160114 learnGit]# git log --pretty=oneline --abbrev-commit
574d922 x
3116d0c AND simple
1421390 删除一个测试文件
192e348 提交一个测试文件
0b89000 只提交ys.txt的第三次提交
e215485 只提交redeme。txt的第三次修改
ef5ff6c 提交两个文件的修改
49aded3 添加第二个文件
3a755eb wrote a readme file
[root@sf160114 learnGit]# git status
# On branch feature1
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# deleted: ys.txt
#
[root@sf160114 learnGit]# git reset --hard 574d922
HEAD is now at 574d922 x
[root@sf160114 learnGit]# git status
# On branch feature1
nothing to commit, working directory clean