git使用
区域介绍
当从远程服务器上下载项目之后,在git 使用过程中关于文件的区域可以划分为下面的几个区:
disk 硬盘区(当前的工作目录)
暂存区(git add 之后文件就会被放在暂存区)
本地仓库(git commit之后文件会被放在本地仓库)
远程仓库(git push之后文件会被放在远程仓库)
场景一
编写了一个函数但是却没有写完,别人让修改一个紧急bug,修改完bug需要提交代码,要是注释掉自己写到一半的代码,再提交就造成了代码管理上的不合适,要是删除,那刚才写到一半的函数是不是就白写了(当前修改的文件与bug不在同一个文件)。
针对以上场景一这里有一个方法,git可以解决上述这种情况。
git指令
可以先将自己本地所做的修改使用git stash暂存下来,然后使用git pull来拉取最新的代码,拉取最新的代码之后,接着修改自己的bug,修改完bug,就是提交自己更改的bug了,具体的指令如下:
使用指令:
git stash #先暂存当先的修改
git pull #更新最新的代码
更新完最新的代码后,修改bug,然后将改动的bug所在的文件添加到暂存区,使用指令:
git add 文件名 #添加文件到暂存区
git commit -m "描述" #提到到本地仓库中
git push origin 本地仓库名 #推到远程仓库中
场景二
在本地编辑文件的时候,不小心删除了自己当前分支下的某个文件或者文件夹。
使用下面的git指令来找回:
先执行下面的指令:
git pull
就可以将删除的文件找回来。
场景三
文件修改了之后,发现自己不应该改,这时想要回到自己未修改之前的文件。
git指令
可以执行下面的指令:
git checkout 文件名或者含有文件名的绝对路径(一般都是文件的绝对路径)
这样文件就可以放弃自己的修改,回到没有修改之前的样子了。
场景四
本地所做的修改添加到暂存区,也执行了commit,发现提错了,想撤回。
git指令
git reset --mixed HEAD~1 或者git reset --mixed HEAD^ #表示撤销这次提交,但是工作区之前的修改不会被删除,仅撤销git add添加到暂存区的修改
reset的三种模式:
--soft:不删除工作空间改动代码,撤销commit,不撤销git add .操作,重置位置的同时,保留working Tree工作目录和index暂存区的内容,只让repository中的内容和 reset 目标节点保持一致,因此原节点和reset节点之间的【差异变更集】会放入index暂存区中(Staged files)。所以效果看起来就是工作目录的内容不变,暂存区原有的内容也不变,只是原节点和Reset节点之间的所有差异都会放到暂存区中。
--mixed(默认):不删除工作空间改动代码,撤销commit,并且撤销git add . 操作,重置位置的同时,只保留Working Tree工作目录的內容,但会将 Index暂存区 和 Repository 中的內容更改和reset目标节点一致,因此原节点和Reset节点之间的【差异变更集】会放入Working Tree工作目录中。所以效果看起来就是原节点和Reset节点之间的所有差异都会放到工作目录中。
--hard:删除工作空间改动代码,撤销commit,撤销git add . 操作,重置位置的同时,直接将 working Tree工作目录、 index 暂存区及 repository 都重置成目标Reset节点的內容,所以效果看起来等同于清空暂存区和工作区。
注意完成这个操作后,就恢复到了指定版本的commit状态。
场景五
暂存区添加了多个文件之后,想从暂存区撤销这些文件,即git add之后,想将加入暂存区的文件撤销。
git 指令
执行下面的指令。
git add -i
git status查看文件的状态,发现自己已经加入到暂存区的文件,自己想撤销,这时需要执行git add -i,会出现下面这样一个界面。页面中展示了文件的状态,已经路径,还有每一行前面的数字,我暂且将它认为是文件的编号(1~12),还有指令列表。最后会出现what now>,这时我们需要输入自己要执行的指令,当前我想撤销自己在暂存区的提交,对应指令列表中的3.revert,在what now> 后输入3回车,接下来在出现的what now>后面输入你想撤销的文件对应的编号,回车,文件这行前就会出现*号,撤销多个就执行多次输入编号,回车操作,将需要撤销的文件编号都输入完之后,再次回车,会回到最初的界面,这是选择7.quit,输入7回车便可以退出到命令行了。
备用撤销暂存区的文件的截图。
使用git status查看工作目录下文件的状态,就会显示文件已被撤回到硬盘。
示例
场景七
使用git撤销之前加到暂存区的文件的时候(即commit之后,想撤销到没有add之前,但要保留之前在工作区disk硬盘区所做的修改),回退代码,回退的多了。
git指令
git reflog #查看提交日志,重点关注commitId
git reset -commitid #回退代码到指定版本
示例
下面的例子中我查看了当前分支下自己的提交记录。使用指令git log,然后回车。
第一条日志中,chore(SegmentWgt):左侧列表添加分支位置列表,是我刚提交到本地仓库的,现在我想将它从本地仓库撤销,同时保留我在硬盘上所做的修改,即我的工作目录下所做的修改必须保留。可以使用指令:
git reset commitId #这里的commitId是上图中我第二条日志的id,因为第一条是我想撤销的,当前只能回退到提交前的那个commitId,即下图中所示。
这里默认采用的是–mixed参数,即可以撤销暂存区,同时也可以撤销本地仓库的文件。
执行之后本地目录下执行git status,可以查看当前的工作目录下的文件状态。可以看到之前修改的文件被保存了下来,且文件现在处于未跟踪状态,即暂存区文件也撤销了,当前的修改只存在于硬盘,也就是当前的工作目录。
接下来若是想修改代码,修改完代码之后,就可以进行自己的提交的那一套流程了。
但是git push的时候会出现上图所示的错误,这时候需要强制推送,加上-f就可以推送成功。
记录撤销提交到自己的远程分支的代码
git checkout 文件可以撤销在disk区的更改。新版的git将git restore与git checkout 分开了,新版git也可以使用git restore 文件。
把文件从暂存区撤销,也就是说执行了git add 。 b站说使用git reset 文件,或者使用git restore --staged 文件,不会对disk上的代码造成修改,会保留之前对工作区代码的修改,只是将文件从暂存区移出。若是想撤销disk,即工作区对代码的修改,同时也想从暂存区撤销,可以使用git checkout HEAD 文件。这个指令不会保留之前工作区的修改。
若是执行了commit将代码提交到本地仓库,想单纯的撤销commit可以使用指令git reset --soft HEAD~1,若是想撤销commit的同时将暂存区的文件也撤销,可以使用git reset HEAD~1,或者使用git reset HEAD^,两者是等价的,或者使用git reset --mixed HEAD~1,默认就是–mixed。若是想将disk,暂存区,本地仓库都撤销,可以使用git reset --hard HEAD~1,会将工作目录中的代码返回到没修改前从远端拉下来时的样子,不保留本地修改。
若是代码已经提交到远程分支,即执行了push操作,这时若是自己的个人 远程分支,[git reset --soft 版本id,修改完之后重新提交,push的时候需要加-f,会保留本地原来所做的修改]可以使用git rest --hard HEAD~1,然后使用git push -f来强制推送。这里不清楚时必须使用–hard吗,还是可以使用–mixed的,另外要是推到了共有分支,只能使用git revert HEAD,然后使用git push推送。
使用git更新子模块
git submodule update:
更新子模块的内容,这会使用父项目中的提交ID更新子模块,而不会下载跟踪的远程仓库中的最新提交。
git submodule update --remote:
更新子模块的内容,这会从跟踪的远程仓库中下载最新提交,而不仅仅是使用父项目中的提交ID更新子模块。
场景八
往远程仓库推送的时候发现没有网
当执行完一套提交指令:
git add .
git commit -m "xxxxx"
git push origin 你的当前分支名
发现在执行第三条指令git push origin 你的当前分支名时,显示无法提交,可能是网络连接问题,或者远程仓库被删除。这时当你发现ubuntu界面上没有显示连网图标。则之前提交的内容不能被提交上去。此时,需要连网之后,再次执行第三条语句。
git push origin 你的当前分支名
场景九
提交代码的时候,提交信息编写错误
即git commit -m "xxxxxx"的时候,描述编写错误了,这时可以使用git commit --amend指令回车。
出现下面的界面:
进入后在之前的描述中直接修改描述文本,编辑完成之后,点击ctrl + o按键,写入文件,然后点击enter按键确认文件名,再点击ctrl + x 退出这个编辑器。
在终端输入git log可以看到自己已经修改了提交的描述信息。