http://blog.csdn.net/pipisorry/article/details/47867097
查看文件的修改历史
git log --pretty=oneline 文件名 # 显示修改历史[Git高级教程:git log与git reflog]
git show 356f6def9d3fb7f3b9032ff5aa4b9110d4cca87e # 查看更改
历史版本对比
查看日志git log
查看某一历史版本的提交内容git show 4ebd4bbc3ed321d01484a4ed206f18ce2ebde5ca,这里能看到版本的详细修改代码。
对比不同版本git diff c0f28a2ec490236caa13dec0e8ea826583b49b7a 2e476412c34a63b213b735e5a6d90cd05b014c33
push之前可以使用git diff origin/dev...HEAD --name-status查看要push的内容有没有改变。
[Git高级教程git log与git relog]
git reset命令参数
包括 --mixed,--soft --hard等,其中--mixed为默认方式,他们之间的区别如下
git reset –mixed:此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息
git reset –soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可
git reset –hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容
git reset -soft :取消了commit
git reset --mixed(默认) :取消了commit ,取消了add。Your branch is ahead of 'origin/master' by 1 commit.不小心commit大文件,但是push失败,使用git log找到上一次的版本号,再使用git reset --mixed 版本号就可以了。
git reset -hard :取消了commit ,取消了add,取消源文件修改。
重置文件
在git中,有3种类型的重置。重置是让文件回到git历史中的一个特定版本。
- git reset –hard {{some-commit-hash}} —— 回退到一个特定的历史版本。丢弃这次提交之后的所有变更。
- git reset {{some-commit-hash}}—— 回滚到一个特定的历史版本。将这个版本之后的所有变更移动到“未暂存”的阶段。这也就意味着你需要运行 git add . 和 git commit 才能把这些变更提交到仓库.
- git reset –soft {{some-commit-hash}} ——回滚到一个特定的历史版本。将这次提交之后所有的变更移动到暂存并准备提交阶段。意味着你只需要运行 git commit 就可以把这些变更提交到仓库。
这些命令似乎并没有什么用处,但当你尝试着将文件在不同版本间移动时,使用它们会非常方便。
使用重置的一些用例如下:
- 如果想清除变更记录,可以使用清理命令——git reset –hard HEAD (最常用)
- 如果想编辑,以不同的顺序,重新暂存,重新提交文件—— git reset {{some-start-point-hash}}
- git reset –soft {{some-start-point-hash}}如果想把之前3次的提交,作为一次提交 git reset –soft {{some-start-point-hash}}
git单个文件删除和恢复
{针对文件删除及恢复}
删除文件跟踪并且删除文件系统中的文件file git rm file
提交刚才的删除动作,之后git不再管理该文件git commit
删除文件跟踪但不删除文件系统中的文件file git rm --cached file
Note:--cached Use this option to unstage and remove paths only from the index.Working tree files, whether modified or not, will beleft alone.只是将文件从暂存区去除(不影响工作区对应的文件)。
[git-rm - Remove files from the working tree and from the index]
提交刚才的删除动作,之后git不再管理该文件。但是文件系统中还是有file。 git commit
[Git版本控制教程 - Git本地仓库:删除文件]
本地文件被旧的远程文件覆盖怎么撤销修改
git reflog ,找到同步前的提交,git reset 就可以了
git rm 之后的文件如何还原
执行$git rm createGraph.py删除文件createGraph.py后,发现删除错了。
解决方案1:
$git status
...
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: createGraph.py
可以看到提示先使用git reset HEAD <file>...来unstage文件
$git reset HEAD createGraph.py
Unstaged changes after reset:
D createGraph.py
再查看一下
$git status
...
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: createGraph.py
可以看到提示先使用git checkout -- <file>...来丢弃文件的修改
$git checkout -- createGraph.py
这样就恢复了rm了的文件
$ls
createGraph.py
解决方案2:
git rm README
git status
$ git stash list
stash@{0}: WIP on master: bfcdf14 test git
#拿出来使用 git stash pop
git stash pop
[Git高级教程:git stash]
解决方案3:
这时可以直接使用git log; git reset --hard "commit id"恢复到上一个commit,但是这样不好,我只想恢复删除的那一个文件,要是commit之间做了很多改动,恢复到上一个commit会将其它文件的修改都恢复了。要对单个文件修改。
首先查看该文件的历史版本信息:git log Default@2x.png
记录下需要恢复的commit版本号:如 9aa51d89799716aa68cff3f30c26f8815408e926
恢复该文件:git reset 9aa51d89799716aa68cff3f30c26f8815408e926 Default@2x.png提交git:git commit -m "revert old file"
测试了一下,发现文件根本没有改动,只是有unstaged commit的提示(说明一下,我是在windows环境下使用git客户端,linux不知道是不是同样的问题),并且,一旦执行“git add .”,所有暂存区中的变化全都消失了。
尝试执行git checkout命令,因为这个命令平时只适应于将文件恢复到上次递交的状态,而不能选择递交的版本。
虽然执行完毕后什么提示都没,但是查看文件可以看到,文件已经被修改为历史版本了。
总结:git将单个文件恢复到历史版本的正确方法如下:
git reset commit_id 文件路径
git checkout -- 文件路径
[ GIT 恢复单个文件到历史版本]
版本回退-撤销文件修改
{针对文件修改恢复}
工作区修改一个文件后,又想回到修改前(git add前)
1. 当然可以直接手动再在工作区中将文件修改回去
2. 修改后,通过命令git status查看
$ 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: readme.txt # no changes added to commit (use "git add" and/or "git commit -a")
这时Git会告诉你,git checkout -- file可以丢弃工作区的修改:
$ git checkout -- readme.txt
Note:
1. git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout命令。
2. 命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。总之,就是让这个文件回到最近一次git commit或git add时的状态。
3. 工作区、暂存区的概念不清楚的可见于Git版本控制教程 - Git本地仓库
如果在工作区中修改了文件还git add到暂存区(但是在commit之前)
用git status查看一下,修改只是添加到了暂存区,还没有提交:
$ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: readme.txt #
Git同样告诉我们,用命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区:
$ git reset HEAD readme.txt Unstaged changes after reset: M readme.txt
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
再用git status查看一下,现在暂存区是干净的,工作区有修改。
然后丢弃工作区的修改
$ git checkout -- readme.txt $ git status # On branch master nothing to commit (working directory clean)
不但修改了文件还从暂存区提交commit到了版本库 - 版本回退
版本回退可以回退到上一个版本。不过,这是有条件的,就是你还没有把自己的本地版本库推送到远程。Git是分布式版本控制系统。
在工作中对某个文件(如readme.txt)进行多次修改交commit。
可以通过版本控制系统命令告诉我们提交的历史记录,在Git中,我们用git log命令查看:
$ git log commit 3628164fb26d48395383f8f31179f24e0882e1e0 Author: Michael Liao <askxuefeng@gmail.com> Date: Tue Aug 20 15:11:49 2013 +0800 append GPL commit ea34578d5496d7dd233c827ed32a8cd576c5ee85 Author: Michael Liao <askxuefeng@gmail.com> Date: Tue Aug 20 14:53:12 2013 +0800 add distributed commit cb926e7ea50ad11b8f9e909c05226233bf755030 Author: Michael Liao <askxuefeng@gmail.com> Date: Mon Aug 19 17:51:55 2013 +0800 wrote a readme file
Note:
1. git log命令显示从最近到最远的提交日志,我们可以看到3次提交,最近的一次是append GPL,上一次是add distributed,最早的一次是wrote a readme file。
2. 如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数:
$ git log --pretty=oneline 3628164fb26d48395383f8f31179f24e0882e1e0 append GPL ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file
3. 你看到的一大串类似3628164...882e1e0的是commit id(版本号),和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到的commit id和我的肯定不一样,以你自己的为准。为什么commit id需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。
4. 每提交一个新版本,实际上Git就会把它们自动串成一条时间线。如果使用可视化工具(如GitX、github的客户端、pycharm)查看Git历史,就可以更清楚地看到提交历史的时间线。0
现在我们想要把readme.txt回退到上一个版本
如“add distributed”的那个版本,怎么做呢?首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
现在,我们要把当前版本“append GPL”回退到上一个版本“add distributed”,就可以使用git reset命令:
$ git reset --hard HEAD^
HEAD is now at ea34578 add distributed
这时readme.txt的内容就成了版本add distributed
$ git log commit ea34578d5496d7dd233c827ed32a8cd576c5ee85 Author: Michael Liao <askxuefeng@gmail.com> Date: Tue Aug 20 14:53:12 2013 +0800 add distributed commit cb926e7ea50ad11b8f9e909c05226233bf755030 Author: Michael Liao <askxuefeng@gmail.com> Date: Mon Aug 19 17:51:55 2013 +0800 wrote a readme file
最新的那个版本append GPL已经看不到了!
恢复文件后,要是我们又想回到修改后的文件呢?(命令行窗口还没有被关掉)
{这个是git reset --hard后,又反悔了,想回到修改后的状态}
只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个append GPL的commit id是3628164...,于是就可以指定回到未来的某个版本:
$ HEAD is now at 3628164 append GPL
版本号没必要写全,前几位就可以了,Git会自动去找。
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL:
改为指向add distributed:
然后顺便把工作区的文件更新了。所以你让HEAD指向哪个版本号,你就把当前版本定位在哪。
恢复文件后,要是我们又想回到修改后的文件呢?(命令行窗口早就关掉了)
{这个是git reset --hard后,又反悔了,想回到修改后的状态}
想恢复到新版本怎么办?找不到新版本的commit id怎么办?当你用$ git reset --hard HEAD^回退到add distributed版本时,再想恢复到append GPL,就必须找到append GPL的commit id。
Git提供了一个命令git reflog用来记录你的每一次命令:[Git高级教程:git log与git reflog]
$ git reflog ea34578 HEAD@{0}: reset: moving to HEAD^ 3628164 HEAD@{1}: commit: append GPL ea34578 HEAD@{2}: commit: add distributed cb926e7 HEAD@{3}: commit (initial): wrote a readme file
第二行显示append GPL的commit id是3628164,现在,你又可以乘坐时光机回到未来了。
git 撤销文件追踪
git忽略已经被提交的文件/文件夹
问题
终极解决方案1
适用于这个文件是最近一次commit的,并且git commit的其它内容(如小文件)也回退。
一旦发现git push了大文件失败了,就使用下面命令回退这次commit,再添加.gitignore再add 和 commit。
git reset --mixed(默认) :取消了commit ,取消了add。Your branch is ahead of 'origin/master' by 1 commit.不小心commit大文件,但是push失败,使用git log找到上一次的版本号,再使用git reset --mixed 版本号就可以了。
终极解决方案2
git当push100M以上文件,就直接拒绝你的push,要想push必须把该文件从本地仓库和远程仓库全部移除到commit外。
注意此方法适用于这个文件是最近一次commit的{包括已经push到github了(所以要先git pull)}并且希望git commit的其它内容(如小文件)不回退。
git rm --cached /XXX/XXX/libbaiduNaviSDK.a(加下划线部分是你自己的要移除的文件的路径)
find . -size +100M ! -path "*git*" | xargs git rm --cached
git commit --amend -CHEAD
find . -size +100M ! -path "*git*" | mv /tmp/tmpgit
git pull
git push
下次再add时
先添加大文件到.gitignore
mv /tmp/tmpgit .
再git add .
git commit -m 'del -size +100M'
git push
Note:
第一步:将文件从暂存区去除;
第二步:是修改提交,也就是用这次删除了大文件的暂存区的新的commit覆盖上次大文件的commit;
第三步:移除之前的大文件(或者是想删除之前commit上的文件);
第四步:如果不执行干什么都会提示:On branch master Your branch and 'origin/master' have diverged,and have 1 and 1 different commits each, respectively. (use "git pull" to merge the remote branch into yours)nothing to commit, working tree clean
第五步:添加大文件不加入git版本控制
第七步:commit
执行完这步后,这个大文件将会从你的commit记录里和add移除(也就是不会再出现在stage暂存区或者master中,这些大于100M的文件会回到git add .之前的状态,相当于没有git add,成为untracked files),这时候就可以git push把本地代码push到github上了。
记得加.ignore或者回到git lfs中来上传大文件![Git版本控制:Git高级教程]
[Removing a file added in the most recent unpushed commit]
[Working with large files]
如果是前几次提交的git commit了大文件,这时上面的修改可能包含了对大文件的处理过程(这样就可逆对大文件的commit了?),还是会上传对大文件的修改。如:
$ git diff origin/master --name-statusA JIM/business_result.json #并没有大文件会push
A JIM/yelp_academic_dataset_business.json
A JIM/yelp_academic_dataset_tip.json
但是git push时怎么还是上传的这个大文件,这难道是因为git diff比较的只是当前commit和远程,而本地实际有两个commit版本,大文件存在于前一个版本中,所以只要有就会上传
remote: error: Trace: 4cbb68625000edd0054cf593be3f7058
remote: error: See http://git.io/iEPt8g for more information.
remote: error: File JIM/test_candidate.dat is 188.52 MB; this exceeds GitHub's file size limit of 100.00 MB
这时只能使用下面的终极解决方案2了,前本地commit所有版本中的大文件都del掉。
终极解决方案3
此方法适用于这个文件是前几次commit的
git filter-branch --tree-filter
$git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch 大文件目录或名字 -r' --prune-empty --tag-name-filter cat -- --all
Rewrite 44a7e4ad5e52ff26306338fbba9a890c50ba9ba7 (1/1) (0 seconds passed, remaining 0 predicted)
rm 'EpipeCpu/ipch/algorithms-5512fb35/algorithms-c0d91126.ipch'
rm 'EpipeCpu/ipch/epipecpu-63fefe78/epipecpu-e9527547.ipch'
Ref 'refs/heads/master' was rewritten
再使用git push就不会上传那个目录下的文件了
当然lz也将这个目录加入到了exclude中(之前git commit忘了加的)。
不过此方法有可能会带来一些问题
一定要尽可能少用这个功能,虽然他可以减少我们 git 目录的大小,但是这会对其他协作者产生极大的影响。所有受到影响的 commit 的 ID 都会被重写,另外如果 commit 像我这样有 GPG 签名的话,就无法执行这个操作了。
[从 git commit 中永久删除某个文件]
使用git reset回滚commit操作
使用git rm --cached
{这个删除了还是要上传的,不知道为嘛,可能是因为:git rm --cached will add the delete action of the file to the index, just like git add will add an add action.也就是说还是会添加这个文件到远程,然后再删除,不是坑吗...不过lz觉得这个方法只能用在git add .后并且在git commit之前}
Git取消跟踪某个文件:git commit某个文件后又不想跟踪它了(比如取消已经commit的大文件,不想push到远程),可以通过下面的方法解决
$git rm --cached FILENAME
如果后面跟的是目录就加上个 -r 就行,(这个操作不会删除这个文件)git rm -r --cached DIR_NAME
然后更新info/exclude或者.gitignore忽略掉目标文件,不知道怎么操作的可参见[Git版本控制教程 - Git本地仓库:忽略指定文件]
最后 git commit -m "dont track" 还是 git commit --amend -CHEAD ?
究极解决方案:本地重建并取代远程
修改最后一次提交git commit --amend
$ git commit --amend
此命令将使用当前的暂存区域快照提交。如果刚才提交完没有作任何改动,直接运行此命令的话,相当于有机会重新编辑提交说明,但将要提交的文件快照和之前的一样。
启动文本编辑器后,会看到上次提交时的说明,编辑它确认没问题后保存退出,就会使用新的提交说明覆盖刚才失误的提交。
如果刚才提交时忘了暂存某些修改,可以先补上暂存操作,然后再运行 --amend 提交:
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
上面的三条命令最终只是产生一个提交,第二个提交命令修正了第一个的提交内容。
git update-index
Git版本控制:Git查阅、撤销文件修改和撤销文件追踪的更多相关文章
-
VS2015如何另存解决方案文件-修改解决方案sln文件的路径
原文:VS2005如何另存解决方案文件-修改解决方案sln文件的路径 修改解决方案sln文件的路径 方法一:工具→选项→项目和解决方案,可设置项目的默认保存位置.方法二:"解决方案资源管理器 ...
-
长连接锁服务优化实践 C10K问题 nodejs的内部构造 limits.conf文件修改 sysctl.conf文件修改
小结: 1. 当文件句柄数目超过 10 之后,epoll 性能将优于 select 和 poll:当文件句柄数目达到 10K 的时候,epoll 已经超过 select 和 poll 两个数量级. 2 ...
-
find命令的基础用法以及按文件修改时间查找文件
一般文件查找方法: find 命令学好是一件很有趣的事情,也可以帮你在查找系统文件的时候事倍功半,还可以与正则表达式结合使用,功能强大,是一个很好的查找工具.可以整体提高你的系统管理能力. 基础用法 ...
-
git常用命令速查:创建,修改提交,撤销,切换分支,合并分支,变基解决冲突
创建 $ git init #在当前目录下创建一个空的本地仓库 $ rm -rf .git #删除本地仓库 $ git add . #把当前目录下的所有文件添加到暂存区 $ git commi ...
-
Git版本控制 Git、github,gitlab相关操作
目录 关于版本控制 版本管理工具 集中式管理 分布式管理 git版本管理 git介绍 软件安装 Git工作状态 原理流程步骤 git基本操作 对文件进行修改 分支 共享仓库 创建共享仓库: 共享仓库上 ...
-
Git查看两个版本之间修改了哪些文件
gdiff 63e3b647d55fcc643e793e650c893be8601719b1 548cdaf01dbc2f08d1ca0b697a24afe512b75a2f --stat git l ...
-
GIT版本控制 — GIT与SVN的相互转换 (三)
git-svn git-svn用于Git和SVN的转换,可以把Git仓库迁移成SVN仓库,反之亦可. 详细介绍可见[1],或者命令行输入git-svn. Bidirectional operation ...
-
014_编写批量修改扩展名脚本,如批量将 txt 文件修改为 doc 文件
#!/bin/bash#执行脚本时,需要给脚本添加位置参数 带参for i in "ls *.$1"do #去尾 mv $i ${i%.*}.$2done
-
git使用,Git的skil-map,git配置http/https/socks5代理
. 检出.克隆库: git clone git://git.openwrt.org/openwrt.git 2. git查看某个文件的修改历史 git log --pretty=oneline 文件名 ...
随机推荐
-
host Object和native Object的区别
Native Object: JavaScript语言提供的不依赖于执行宿主的对象,其中一些是内建对象,如:Global.Math:一些是在脚本运行环境中创建来使用的,如:Array.Boolean. ...
-
[CareerCup] 16.3 Dining Philosophers 哲学家聚餐问题
16.3 In the famous dining philosophers problem, a bunch of philosophers are sitting around a circula ...
-
高仿bootstrap的layout效果(一)
公司研发一个新的cms,为了减少以后的修改和尽可能大程度的满足客户对cms的灵活需求,我的经理安排我去做一个与bootstrap的layout差不多的效果,这叫什么,锻炼的时候来了,加油,这个急不得一 ...
-
LAMP环境的搭建(一)----Apache安装
centos是Linux发行版RedHat的一个分支,因此可以很方便的使用yum安装并管理各种软件包. 本文使用的系统环境为:阿里云Centos7.2. Apache的安装: 输入命令: yum –y ...
-
webservice服务器端获取request对象的三种方式
有的时候在webservice里我们需要获取request对象和response对象,比如想要获得客户端的访问ip的时候就需要这么做,下面说三种方式,当然三种方式可能是针对不同方式部署webservi ...
-
JDK10安装配置详解
JDK10安装配置详解 1. 下载jdk10 1.1 官网下载jdk7的软件包: 地址:http://www.oracle.com/technetwork/java/javase/dow ...
-
net core EF 链接mysql 数据库
这个主要是一个demo.就在一个工程里面写的 安装MySql.Data.EntityFrameworkCore 增加DbContext 相当于程序与数据库的中间层 public class Ident ...
-
SCOPE_IDENTITY() 和 @@identity
@@IDENTITY 和SCOPE_IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值.但是,SCOPE_IDENTITY 只返回插入到当前作用域中的值:@@IDENTITY 不受限于 ...
-
vue-使用keep-alive优化网页性能
export default{ name: 'Home', data () { return { iconList: [], recommendList: [], swiperList: [], we ...
-
解决 配置springmvc拦截所有请求后请求静态资源404的问题
<servlet-mapping> <servlet-name>spring-servlet</servlet-name> <url-pattern>/ ...