Bootstrap

Git的实战教学 | 从0到1

“接上上文Git的基础操作“:

"八月更文第二天",本月第二篇,加油

git实战教学

1.背景:

今天在我使用git作为提交的时候,一不小心提交了79个文件,但是我改的文件事2个,以至于多个commit的,都被我直接提交了远程仓库----(好多日志的文件,老大估计又得发飙),还好是我自己的分支,可以回退版本,但是远程的代码怎么办呢;今天问题:

问题1:

当我修改了多个文件,但是我只想提交其中的一个文件进行commit ,然后进行push?标准的流程是怎么样的;(如何避免日志的提交)开始新建仓库,直接在目录中拉取代码:

git init 目录初始化仓库

git clone 拿到具体的链接地址,开始使用

实例: git clone  testdemo01

表示克隆---》原地址---》现在的目录名进入具体的源码目录,记住是要进入git管理的目录;开始新建一个分支(切换分支,因为拉取代码的都是master分支)

上述可以找到具体的git 中有许多的分支,我们开始自己新建一个;

开始利用idea直接将git管理的数据打开:

C:\Users\web\Desktop\testgit\testdemo01

这是地址, 桌面的地址web/deskTop\

打开是这样的表示,默认是master分支,但是我们还具体的还没开始,我们创建了几个包名,供我们开始测试

我们先是写一个素材,放入master的分支中:\

红色的代表:没有被Git管理的文件;

绿色的代表已经被Git管理的文件

,我们来看看,绿色的文件直接提交,master2文件提交到master2远程分支上\

需要远程push的\

提交之后,我们看看远程\

明明我选择的是一个,但是他提交的就是两个,也就是说,push会把之前没有push的从commit的,直接提交过去;

为了解决疑惑,我有开始了提交了两个commit,看一下我这次push:\

只提交了一个commit;

但是;\

显示直接全部提交;

事实证明,push一次会把之前所有的commi都提交的;

怎么避免每次都提交一个commit,也就是我可以失效commit(撤销提交的commit)来使用

已经蒙了????

2.新建分支切换去合并代码

由于之前是在master开发,有很大的风险,然后我们就开始在新的分支上开发然后合并或者是review导master上面

git checkout -b lucas 新建一个分支并且跳过去;

或者是IDEA,右下角\

开始切换成功;\

,因为自己新建的分支---,可以将master的代码直接合并到新建的lucas上面;

合并master代码:

(我们分支A需要master的最新的代码,可以直接Git merge 分支名);\

本地开发lucas\

问题2:

当我本地的数据要更新master的代码,如何算是标准的merge到合并到自己的分支(如果是多余的文件,或者说是已经删除的代码信息呢)

然后master改造完毕;

我们直接跳回去lucas,看已经commit的代码能否保存(但是没有push)\

master中commit的所有集合都合并过来了,包括新增和修改;\

虽然说已经是可以的数据,但是,突然发现master本地提交的代码有问题,我想撤销之前提交的commit;

git reset --soft HEAD~n

可以将之前已经提交的commit撤销回来,(保存本地代码不变,add也不变)

问题3:

如果说我提交了一个commit ,而且已经push了,但是我发现数据是错的,我要重新退回本地---重新修改;(也就是撤销远程仓库的代码已经push的代码);

本地开发lucas;

但是我们开始了我们的创作之旅,首先是分支,在lucas上,我们创建了两个commit,一个push之后,数据直接将全部提交了,但是,注意,我提交的文件多了,错误了(“和上午一样一下子日志也给提交了”),但是现在,lucas上的提交记录

上述的图片中有很多的干货:git reflog 显示所有的提交;

我们能看到左侧是 commitId(版本号),可以直接回退版本;提交了两次,还有一次是合并到lucas

现在是lucas 的提交记录

怎么样撤回远程仓库的代码已经push的代码两次commit的代码;\

reset;revert我们先来测试git reset 是干嘛的;

git reset

由于近期的护网行动,我们公司使用的是一个外网的地址,我提交的文件还有错误,所以这里我就开始讲版本回退,重新提交commit ,然后是将数据直接变成--

强制push

git push --force

就可以成功\

修改仓库地址

因为提交的时候要修改仓库地址,外网的地址和内网的地址是不一样的,所以我们直接使用,\

git remote 查看仓库信息 显示 出的结果“orgin”

git remote set-url orgin 新的地址

首先搜索一下:(百度需要你的信息)\

我们测试的是 soft

版本穿越:

本地代码会找回来,;

@#请求版本号;

git reflog

git log

git rest --hard 版本号

目前已经删除的最近的commit的显示;-然后我们穿越回去;\

通过版本穿越:我们找到之前删除文件--本地数据中;\

比如说我们本地代码已经退回来了,现在从最初的版本号(肯定比现在的commit低),我们重新提交代码,看看会发生什么事情》

会因为版本号低而变化吗;\

果然:人家拒绝了;\

然而不行的:

我直接是将本地开始的数据变成强制提交

git push --force

所以,对于开发

提交异常的commit,如何解决:

第一种方法

本地分支拿到所有的版本号:

git reflog 左侧的就是

开始版本穿越:

git reset --hard 版本号(要提交之前最近的版本号)

穿越完成之后,本地代码显示提交之前的,开始进行开发

开发完毕直接将文件commit file,由于版本号的低肯定会push失败;

我们强制push就可以成功;

git push --force

然后就会成功的;

第二种方法:

但是也可以直接重新拉取master代码,从新开发,要是开发量比较细就可以的;\

revert:表示当前一个提交是作废的,我们直接可以将再次提交作废;\

会使得本地的提交commit失效,然后我们呢直接将数据push到远端,就可以将之前的数据改变了;\

问题4:

标准的如果,我现在在开发,领导让我改一个bug,但是我又想保存我现在的已经写好的代码,又不想丢掉对吧;(暂存代码)git stash 暂存起来

git stash pop 捞出来\

实例:

我们开始写一点数据参数;然后给它放到暂存区域;

1.新增需求的我,正在加急的写代码中;\

但是这时候一个满脸清纯的程序媛走过来说,可能帮我调个bug吗,(乐于助人,怎么能拒绝呢),哈哈,但我已经写了一上午的代码,还没能开始调试,我又不想提交,怎么办呢,(又不能直接拒绝,结束单身的机会,怎么能不把握好),幸好,卢卡我知道;

IDEA 有代码输入行,就是类似于cmd

git stash //将代码放入暂存区域\

然后发现我的工作空间里面现在,没有了我之前的代码了,不会丢了吧(不用担心,是被保存起来了);

然后我们切换分支,给他解决一下问题;

然后我们来本地lucas的代码中看看

关于已经提交的commit的,我们直接是将期变化成撤销;

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

关于参数:

–mixed

意思是:不删除工作空间改动代码,撤销commit,并且撤销git add . 操作

这个为默认参数,git reset --mixed HEAD^ 和 git reset HEAD^ 效果是一样的。

–soft

不删除工作空间改动代码,撤销commit,不撤销git add .

–hard

删除工作空间改动代码,撤销commit,撤销git add .

注意完成这个操作后,就恢复到了上一次的commit状态。

git reset --mixed HEAD~1 或者是n

顺便说一下,如果commit注释写错了,只是想改一下注释,只需要:

git commit --amend

1

此时会进入默认vim编辑器,修改注释完毕后保存就好了。\

问题5:

如果说master的版本特殊号是1.0.0,但是我使用的本地分支lucas版本是3.0.0,

但是每次我要从master拉取最新的代码,肯定会遇到的问题就是冲突;

有什么好的方法呢;

首先是我将lucas的文件版本号改变成3.0.0.,如图所示;\

但是master的已经有了新的文件,所有我需要更新;

第一种方式:

我们开始保存本地,然后直接切换分支开始进行

但是出现问题弹框了;\

就是我们之前的版本号差异造成的,force checkout会导致新增的版本号直接丢失的,

所以,我们将数据直接试一下smart checkout\

类似于:

git stash 暂存改变

git stash pop 显示\

一般会出现三个展示的代码框;\

然后我们选择保存就可以,一般就是选择自己本地的呗,哈哈第二种方法:

暂存本地所有的stash 哈哈;

git -->repository-->stash changes

给一个message标识--->然后切换分支master开始拉去最新的数据;

然后开始合并,到lucas,记住这里肯定会出现conflicts ,(合并之后,我们将之前修改的代码还原,也就是暂存区域中取出);\

这是已经将master的新增代码合并到lucas的开发分支上;

我们将数据直接变成-----开始还原暂存区的;\

view :\

直接回复之前的stash;

没有冲突,庆幸一点;\

lucas的开始作妖了:

将本地的代码继续改变,然后保存看能否发生冲突;\

切换分支到master然后开始拉去master最新的代码

(因为lucas的代码我没有提交,合并的master的来源,所有直接切换就可以)\

这是新改变好的数据--lucas,然后我们还原看一下;\

还原失败了;\

Please move or remove them before you merge.

开始疯狂的尝试;\

细心的我准备了很多干活命令行;\

master分支\

版本号是1.0.0,

目前有两个分支,一个master分支,一个lucas的分支,master已经有了新的代码,我自己目前使用的是lucas的分支,第一版本号(常量)已经改了为3.0.0(master的版本号为1.0.0),而且我对lucas的分支已经有了整改(暂存起来Git stash)没有提交commit, 现在需要保存之后跳转到master分支上去拉取代码合并到lucas的分支上,合并之后,lucas的分支上已经有了最新的master分支的代码,但是,想要恢复之前暂存区里的代码(git stash pop)恢复一直是失败,提示是\

只能丢掉代码了吗;我之前写的好多;

git reset --hard 版本号;

切换到之前的版本再合并哈哈

合并之前必须先要提交本地的commit的整改;

master分支有数据之后我们保存本地的修改commit开始数据整理;

然后合并的时候;;\

workspace.xml的文件----怎么忽略这些文件不被git管理;

IDEA git 忽略文件的几种方式\

不合适,idea取消git标记管理;\

然后关闭IDEA重启;git log\

如何本地修改代码之后,本地提交commit,然后提交的本地commit,但是提交了多余的文件,(本地提交了commit)---我们撤回本地commit怎么做呢;

git log 查看具体的提交记录;

git reset --soft commitId版本号;

(取消你本地的提的commit,但是本地的代码不会变动,需要你重新修改后提交)\

本地提交的记录也会消失,

总结:

本地修改了代码,但是现在需要我们开发新需求所以,切换分支,但是为了避免我们写的代码失效(我们本地提交一个commit,然后拥有了一个commit的ID,)

然后我们再去干别的事情;

等到切回我们的分支的时候,我们将之前本地提交 的commit还原回来;接着开发,先备份一下,因为还原的时候,(本地代码不会发生改变,也就是会保存之前已经存在的;)

具体操作:

比如我们现在提交了三次本地commit;分别是1,2,3;

类似于这样的;\

然后我们要撤销3的commit提交,回退到2;

git log

git reset --soft 2的commidId ;

本地代码没有改变,但是本地的commit已经撤销了;

如何解决已经提交到远程的commit,已经push远程的呢;\

一次push,将本地所有的commit都提交到远程的分支了;\

如何撤回呢;

git log 查看具体的提交记录

git reset --hard 记录id

切换版本到提交前的一个版本,

特殊的,这里的-- hard ,会直接将回退到之前的版本(本地的代码也会修改,--soft的本地不会被修改);

然后\

将数据版本直接回退了,然后我们重新提交,看一下远程的记录;\

版本比较低的原因,肯定提交不成功;

所有强制提交;

git push --force\

终于圆满结束了;

git实操:

如果说已经被变化的数据,和已经改变好了的数据你没有及时的拉取,

但是当你push到远程的时候已经就会push不成功:\

Your local changes to the following files would be overwritten by merge:

你本地的分支需要覆盖,因为之前有变动,版本号已经低了;(你现在提交的版本号很低)

解决方式:

先提交好你的文件,或者说是commit你的文件;\

git stash 暂存已经修改;

然后就会回到之前的一个版本号,git pull 文件

然后在git stash pop 还原文件,会有冲突解决就好了;

哈哈

然后准备提交git push

但是一般提交会有两个的;\

卢卡寄语

这篇Git的实战,根据上文Git的基础来,适合新手小白进行开发时候的一些问题, 希望我们都在研发的道路上越走越远,加油

“接上上文Git的基础操作“: