平凡也就两个字: 懒和惰;
成功也就两个字: 苦和勤;
优秀也就两个字: 你和我。
跟着我从0学习JAVA、spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美!
关注微信公众号【 IT特靠谱 】,每天都会分享技术心得~
git版本控制操作教程:撤销/回退
在使用git提交代码的整个过程中,难免会出现失误,而补救的方法便是撤销,而常用的撤销无非就两个命令:reset和revert。先上一张图片:
在提交代码的过程中(无非就是add、commit和push步骤),但不管是哪一步都有可能出现提交错误或后悔的情况,因此需要对各个步骤的提交进行撤销,下面将介绍不同步骤的撤销操作。
1 丢弃未add 的修改的代码(不能丢弃新建的文件)
git checkout命令。用法:
(1)丢弃单个文件修改,注意不要忘记中间的"--",不写就成了检出/切换分支了。
git checkout -- fileFullName
(2)丢弃所有的文件修改
git checkout .
此命令用来丢弃掉所有还没有加入到缓存区(git add 命令会将本地修改添加到缓存区)的代码修改,但是此命令不会删除刚新建的文件(新建的文件,即untrack的文件)。因为刚新建的文件还没已有加入到 git 的管理系统中。所以对于git是未知的。丢弃/删除新建的文件有2种方式:
(1)手动删除。
(2)git clean命令丢弃新建的文件。
2 删除untrack的新建的文件(不能丢弃修改的代码)
git clean命令:用来从你的工作目录中删除所有没有tracked过的文件或目录。
说明:git clean经常和git reset --hard一起结合使用。git reset只影响已经被track过的文件, 所以需要git clean来删除没有track过的文件。结合使用这两个命令能让你的工作目录完全回到一个指定的<commit>的状态
用法:
(1)是一次clean的演习, 告诉你哪些文件会被删除。记住他不会真正的删除文件, 只是一个提醒。
git clean -n
(2)删除当前目录下所有没有track过的文件。他不会删除.gitignore文件里面指定的文件。
git clean -f
(3)删除指定路径下的没有被track过的文件。
git clean -f fileFullName
(4)删除当前目录下没有被track过的文件和文件夹。
git clean -df
(5)删除当前目录下所有没有track过的文件。不管他是否是.gitignore文件里面指定的文件夹和文件。
git clean -xf
3 回退已add,但未commit的代码
* soft – 缓存区和工作目录都不会被改变。
* mixed – 默认选项。回退缓存区和你指定的提交同步,但工作目录不受影响
* hard – 缓存区和工作目录都回退(同步)到你指定的提交
(1)将暂存区和工作区的修改保留在工作区
git reset HEAD 或 git reset --mixed HEAD
也就是将暂存区的内容清空并保存到工作区中,原工作区的修改仍然在工作区中。不会丢失代码。
(2)将暂存区的修改保留在暂存区
git reset --soft HEAD
也就是将暂存区的内容保留在暂存区(即:不进行任何回退),原工作区的修改内容仍然在工作区中。不会丢失代码。
(3)将暂存区和工作区的修改丢掉
git reset --hard HEAD
也就是将暂存区和工作区的修改丢掉(也就是回退到了上一次commit的版本),会丢失代码!如果不想丢失代码可以git stash起来。
4 回退已commit,但未push的代码
* soft – 缓存区和工作目录都不会被改变。
* mixed – 默认选项。回退缓存区和你指定的提交同步,但工作目录不受影响
* hard – 缓存区和工作目录都回退(同步)到你指定的提交
(1)从本地仓库--》撤销/回退指定commitId-->工作区
git reset commitId/HEAD~n 或 git reset --mixed commitId/HEAD~n
该命令只会将已commit,但未push的提交撤回(或来回切换),被回退版本的代码变更不会丢失,而是在工作区中(也就是add之前的状态)。当n等于1,表示回退到上一个commit;当n=2,表示回退到上一个上一个commit...
(2)从本地仓库--》撤销/回退指定commitId--》暂存区
git reset --soft commitId/HEAD~n
该命令只会将已commit,但未push的提交撤回(或来回切换),被回退版本的代码变更不会丢失,而是在暂存区中(也就是add之后的状态)。当n等于1,表示回退到上一个commit;当n=2,表示回退到上一个上一个commit...
(3)从本地仓库--》撤销/回退指定commitId--》代码丢失
git reset --hard commitId/HEAD~n
该命令只会将已commit,但未push的提交撤回(或来回切换),被回退版本的代码变更直接丢失,而不是在暂存区中,也不再工作区中!。因此这种操作要小心!当n等于1,表示回退到上一个commit;当n=2,表示回退到上一个上一个commit...
5 回退已push的代码
(1)回退远程仓库的某一次提交。用一次新的revert提交来抵消commitId那次提交。
git revert commitId
说明1:commitId就是要撤销掉的提交。
说明:2:如果revert回退时存在代码冲突,那么需要在本地手动解决代码冲突后再执行“git add 冲突文件”表示我们手动解决了冲突代码,然后commit和push操作,将回退后切解决了冲突的代码推送到远程仓库。
说明3:如果“git revert commitId”执行没有冲突,那么会生成一次新的提交commit,如果发现revert错了,需要将生成的新的提交回退,那么就可以使用“git reset --hard 新提交的前一次提交commitId”来回退到revert之前的状态,也就是新的提交commit被回退了!
说明4:如果“git revert commitId”执行有代码冲突,那么需要手动解决代码冲突(注意:解决代码冲突(merge)的时候需要相关开发人员一起,防止其它开发人员的代码被覆盖了),如果发现revert错了,需要将工作区merge修改的代码废弃掉,那么可以执行“git reset --hard HEAD”命令丢弃掉工作区和暂存区的代码变更,也就是回到了revert前的那个提交commit了。因为merge完还没提交commit,也就意味着还没生成新的提交。如果merge完了,且提交了commit一个新的版本,那么执行“说明2”所示的“git reset --hard 新提交的前一次提交commitId”命令来回退生成的新提交commit。
说明5:如果发现revert掉的代码还有用,但是已经push了revert的代码,则需要将这次revert撤销掉,那么对revert的这次提交再次revert一下就可以了。
6 暂存当前分支未提交的修改,供后面恢复
如果你在dev分支开发了一个功能,但是代码仍然在本地(没有git add)或缓存中(没有git commit),但是你想checkout切换到master分支去查看一些代码。这时你会发现会提示你存在没有commit的代码,需要你提交dev分支代码后才允许你切换到master分支。但是由于dev分支的功能还没开发完,暂时还不想提交代码,有什么办法可以"暂存"一下吗?答案是有的:git stash命令完美解决!
(1)暂时将未提交(commit)的变化移除,稍后再移入
1)移除未提交的变化并保存到堆栈中:git stash 或 git stash save '注释信息',会通过stash信息记录下来,供后面恢复。
2) 查看当前分支所有stash的记录:git stash list
3)将最新的一次stash的内容恢复到工作区:git stash pop,不管git stash之前的代码在工作区还是缓存区,git stash pop后都只存在于工作区!
git stash常用在不同分支切换之前,将当前分支未提交的变化stash起来,等切换到其他分支并更改其他分支代码后,切换到当前分支后将刚刚stash的变化恢复出来。防止不同分支切换导致当前未提交的变更丢失了!当然stash中的内容不仅仅可以恢复到原先开发的分支,也可以恢复到其他任意指定的分支上。
7 “挑拣”其他分支某次commit提交的代码到当前分支
命令:git cherry-pick commitId
可以理解为“挑拣”提交,它会获取某一个分支的单次提交commit,并作为一个新的提交引入到你当前分支上。 当我们需要在本地合入其他分支的提交时,如果我们不想对整个分支进行合并,而是只想将某一次提交合入到本地当前分支上,那么就要使用git cherry-pick了。
【使用场景】:dev开发分支上有很多次提交,但是这次只想发布其中一次提交的功能到生产环境,因此我们只需要将那次commit提交合并到master生产分支上,则可以使用git cherry-pick高效完成。
【用法】:分支dev上有1个commit是需要合并到分支master上,则进行下面操作:
1)将dev分支上的1个commit的id记录下来;
2)切换到master分支上,然后git pull最新的代码下来;
3)在master分支上执行git cherry-pick commitID,将dev分支上commitID对应的提交“挑拣”到当前master分支上;
如果在执行git cherry-pick commitID命令时,提示如下图,表示pick的时候出现代码冲突了,需要我们手动解决冲突之后执行git add xxx后,再执行第4步;
4)“挑拣”到master分支上后执行git push,即可将“挑拣”到master分支的代码push到远程仓库;
5)到此,将指定的其他分支dev的某次commit提交代码就被“挑拣”到了master分支上了。
(1) 商务合作微信号:M9392W
(2) 购物商城: 扫码即可进入博主开发的小程序购物商城,享超大优惠购物,支持一下博主吧~
(3) 博主微信公众号:IT特靠谱,学习更多开发实战技巧!