写点什么

Git 的实战教学 | 从 0 到 1

用户头像
卢卡多多
关注
发布于: 18 小时前
Git的实战教学 | 从0到1

“接上上文 Git 的基础操作“: https://xie.infoq.cn/article/0385f0718b67da57cb8017c69


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

git 实战教学


1.背景:

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

问题 1:

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


git init 目录初始化仓库



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


实例: git clone https://gitee.com/lucasweb/testdemo1.git 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 的,我们直接是将期变化成撤销;


https://www.baidu.com/index.php?tn=monline_3_dg


--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 的基础操作“: https://xie.infoq.cn/article/0385f0718b67da57cb8017c69

发布于: 18 小时前阅读数: 3
用户头像

卢卡多多

关注

努力寻找生活答案的旅途者 2020.04.12 加入

公众号:卢卡多多,欢迎一起交流学习

评论

发布
暂无评论
Git的实战教学 | 从0到1