撤销commit文件

前言

①《git commit》的意思为《git提交》,是git系统的一个命令,主要用于将暂存区里的改动内容提交到本地仓库中:语法为 git commit -m [message]

②在日常工作之中经常遇到我们在commit(提交到本地仓库) 中提交多的文件比如将我们自己的配置文件和自己私有的的依赖或者日志文件提交的本地仓库的,这是和不友好的,一旦push(上传git远程仓库)就会影响到其他同学的开发,要么解决冲突,要么更改配置,很浪费时间。

git 工作台回退

1、查看git log日志

两种查看方法:

  1. git log:显示从近到远的日志记录,按向下键来查看更多,按 Q 键退出查看日志。
  2. git log --pretty=oneline

如下图:前五次提交是已经 push 到远程仓库的,第六次是 commit 到本地仓库。

git 查看所有本地仓库_远程分支

2、第一个命令:撤销第六次commit,把HEAD指向第五次提交(reset HEAD)

git reset --hard 提交id

git 查看所有本地仓库_git_02

 注意:工作区间的代码改动同样消失(此时工作空间的代码与第五次提交时相同,所以第六次提交的代码改动都会消失)

3、第二个命令:保留工作空间的代码,只是撤销

git reset --soft HEAD^

HEAD^的意思是上一个版本,等同于HEAD~1(撤销上一次提交的commit的变动代码)。

如果你进行了2次commit,想都撤回,可以使用HEAD~2将两次commit的代码变动进行一次性撤回。

git 查看所有本地仓库_git_03

4、参数含义 

--mixed:不删除工作空间改动代码,撤销commit,并且撤销git add。该参数为默认参数,即 git reset --mixed HEAD^ 等同于git reset HEAD^

--soft:不删除工作空间改动代码,撤销commit,不撤销git add。

--hard:删除工作空间改动代码,撤销commit,撤销git add。(注意完成这个操作后,就恢复到了上一次的commit状态) 

总结

1、git reset --mixed HEAD^
使用 git reset HEAD^ 命令默认的就是mixed模式,此命令表示不删除本地工作空间提交的代码,也即保留对工作区的修改,但是修改未进入暂存区。

2、git reset --soft HEAD^
此命令也表示不删除本地工作空间提交的代码,也即保留对工作区的修改,并且修改已进入暂存区。

3、git reset --hard HEAD^
此命令表示删除本地工作空间提交的代码,也即不保留对工作区的修改,工作区完全回退到上个版本的样子。此命令注意慎用。

三者最大区别
前面两个命令会保留自己在本地的修改(纯撤回提交,如果是提交之后发现有的地方修改错误,可使用这两个命令撤回提交,然后只对错误的地方重新修改,最后再重新提交),而最后一个命令会恢复自己在本地的修改到上一个提交版本。

必备技能
1)HEAD^的意思是上一个版本,也可以写成HEAD~1,如果你进行了2次commit,都想撤回的话,可以使用HEAD~2,以此类推。
2)如果是commit注释写错了,只是想改一下注释,只需要执行命令行:git commit --amend。此时会进入默认Vim编辑器,修改完之后保存即可。
3)浪子回头再回头。意思是我撤回commit后,我又后悔了,我不想撤回了…。此时我们可以通过版本号来回退,先使用 git reflog 命令来获取版本号,再使用 git reset --hard 版本号 命令来恢复。

撤销push文件

前言

①git commit、git push、git pull、 git fetch、git merge 的含义与区别

git commit:是将本地修改过的文件提交到本地库中;
git push:是将本地库中的最新信息发送给远程库;
git pull:是从远程获取最新版本到本地,并自动merge; (git pull 相当于 git fetch + git merge。) 
git fetch:是从远程获取最新版本到本地,不会自动merge; 
git merge:是用于从指定的commit(s)合并到当前分支,用来合并两个分支;

②git push相关知识概览

一、git push的一般形式为 git push <远程主机名> <本地分支名> <远程分支名> ,例如 git push origin master:refs/for/master ,即是将本地的master分支推送到远程主机origin上的对应master分支,origin 是远程主机名,第一个master是本地分支名,第二个master是远程分支名。
二、git push常用命令如下:

1、git push origin master:如果远程分支被省略,如上则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。

2、git push origin :refs/for/master:如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支,等同于 git push origin --delete master

3、git push origin:如果当前分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略,将当前分支推送到origin主机的对应分支

4、git push:如果当前分支只有一个远程分支,那么主机名都可以省略,形如 git push,可以使用git branch -r ,查看远程的分支名

5、git push 的其他命令:

(1) git push -u origin master 如果当前分支与多个主机存在追踪关系,则可以使用 -u 参数指定一个默认主机,这样后面就可以不加任何参数使用git push,

不带任何参数的git push,默认只推送当前分支,这叫做simple方式,还有一种matching方式,会推送所有有对应的远程分支的本地分支, Git 2.0之前默认使用matching,现在改为simple方式

如果想更改设置,可以使用git config命令。git config --global push.default matching OR git config --global push.default simple;可以使用git config -l 查看配置

(2) git push --all origin 当遇到这种情况就是不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机,这时需要 -all 选项

(3) git push --force origin git push的时候需要本地先git pull更新到跟服务器版本一致,如果本地版本库比远程服务器上的低,那么一般会提示你git pull更新,如果一定要提交,那么可以使用这个命令。

(4) git push origin --tags //git push 的时候不会推送分支,如果一定要推送标签的话那么可以使用这个命令

 三、关于 refs/for

// refs/for 的意义在于我们提交代码到服务器之后是需要经过code review 之后才能进行merge的,而refs/heads 不需要

方法一

第一步:查看当前提交的日志

git log --pretty=oneline

第二步:XXX是commitID(d6cdbba417…) 回退当前工作空间的上一个版本,并且保留代码更改

git reset --soft XXX

第三步:再次查看当前提交的日志,确认是否成功撤销。

git log --pretty=oneline

第四步:强制提交当前版本号,以达到撤销版本号的目的。必须添加参数force进行强制提交,否则会提交失败,报错原因:本地项目版本号低于远端仓库版本号。(master 代表分支名称,默认是 master)

git push origin master --force

注意:这种强制提交的方法只有owner的时候可以用

git 查看所有本地仓库_工作空间_04

github上第五次提交被撤回

git 查看所有本地仓库_git_05

方法二

实例:

最后一次提交的备注是:NNNNNN提交

倒数第二次提交的备注是:MMMMM提交

要求:回退最后一次提交 NNNNNN提交,让工作空间的代码回到 MMMMM提交 的状态。

第一步: 查看当前提交的日志

git log --pretty=oneline

第二步:revert你想回退的版本

git revert commitID

第三步:会进入一个新的编辑界面,编写commit的信息

第四步:再次查看当前提交的日志

git log --pretty=oneline

第五步:push 代码

git 查看所有本地仓库_git 查看所有本地仓库_06

查看远程提交信息:

git 查看所有本地仓库_git_07

git reset 和 git revert 的区别

①git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。

②在回滚这一操作上看,效果差不多。但是在日后继续merge以前的老版本时有区别。因为git revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch时,导致这部分改变不会再次出现,但是git reset是之间把某些commit在某个branch上删除,因而和老的branch再次merge时,这些被回滚的commit应该还会被引入。

③git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。

 

  

去期待陌生,去拥抱惊喜。