Git常规操作学习
Posted Zephyr丶J
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git常规操作学习相关的知识,希望对你有一定的参考价值。
Git
因为课题需要,师兄让我下个git,写代码传到gitee,结果发现自己git也不会用 /捂脸
所以这里来简单学习一下怎么使用
参考:https://mp.weixin.qq.com/s/Bf7uVhGiu47uOELjmC5uXQ
idea集成git操作
在看教程文件中教程走的时候,发现创建了spring项目,并且把从gitee中clone的文件复制到项目中去以后,在idea中文件没有变色,并且在终端输入git的命令时,显示:
这里首先要配置系统的环境变量(一般安装的时候就默认配置好了)
电脑,属性,点击这里的高级系统设置
点击环境变量
在下面系统变量中,双击Path
然后新建,把你的git安装位置添加进去
我这里安装git时默认配置的这个。但是我看很多都是让配置Git\\bin
我试了一下,都可以,我这里就用默认的了
然后回到idea中执行git命令,发现还是不行
还应该在idea中设置一下
然后如下图选Git目录添加Git\\bin\\git.exe
同样,如下图,在Terminal中配置Git\\git-cmd.exe
OK,去看idea中,发现有的文件已经变成红褐色了,并且命令也能执行了
这里补充一下颜色的含义:
红褐色:创建之后没有add,没提交,不在Git版本控制范围之内,这时候文件是红褐色的,需要先add文件;
绿色:add之后是文件绿色的,没有提交(commit);
蓝色:原本有一个文件,改动过后没有提交(commit)是蓝色的,提交之后,变成正常颜色。
可能因为idea的版本不同(我用的是2020.2),与教程里还有一个不同的地方就是,idea下面没有version control了,而是只有一个git,其实是一个意思
点右上角的commit按钮,也不一样,如下图
pycharm集成git操作
基本上也是和idea一样的。也需要在pycharm中进行相同的配置,才能使用git
学习git的操作
可以在gitee的个人主页下面,点击git命令学习,可以以闯关的形式来学习命令。主要看一下分支
点击右下角的第一个图标可以选择关卡,查看答案等
git分支常用操作
首先:创建分支git branch
但是执行git branch newImage,创建了newImage分支,但是还是指向master分支(*号所在)
此时提交commit,master多了一个节点,但是创建的分支还在原地
需要切换到newImage分支上,然后提交
git checkout newImage, git commit
创建分支并切换到新的分支
git checkout -b newbranch
远程操作分支
先clone一个项目到本地,会形成这样一个结果,其中右边部分(虚线)是远程,左边是本地,而o代表的是origin
远程分支有一个特别的属性,在你检出时自动进入分离 HEAD 状态
此时如果执行git checkout,git commit
Git 变成了分离 HEAD 状态,当添加新的提交时 origin/master 也不会更新。这是因为origin/master 只有在远程仓库中相应的分支更新了以后才会更新。
git fetch
会将远程仓库的更新下载下来,但是不会对你本地的文件进行修改
git fetch有以下两个操作:
从远程仓库下载本地仓库中缺失的提交记录
更新远程分支指针(如 o/master)
实际上将本地仓库中的远程分支更新成了远程仓库相应分支最新的状态,远程分支反映了远程仓库在你最后一次与它通信时的状态,git fetch 就是与远程仓库通信的方式了!
git fetch 并不会改变本地仓库的状态。它不会更新 master 分支,也不会修改磁盘上的文件。
理解这一点很重要,因为许多开发人员误以为执行了 git fetch 以后,他们本地仓库就与远程仓库同步了。它可能已经将进行这一操作所需的所有数据都下载了下来,但是并没有修改你本地的文件
例如在执行git fetch之前:
执行git fetch之后:
可以看到,master和bugFix并没有移动,而是指将远程分支的指针移动了
git pull
开始状态如下:
如果执行了git fetch,即先下载c3到本地,o/master指向它
然后再执行 git merge o/master,将本地和远程合并
而git pull就等于这两个操作
git push
开始状态如下
执行git push以后,上传了本地创建的分支,然后将master和o/master同时移动
常见实际场景
很常见的一个情况
就是你克隆了一个仓库,然后在这个基础上修改。但是在这个过程中,别人修改了并且也提交了,此时,不能直接Git push,git会让你强制合并远程最新的代码,然后才能分享工作
如图,在远程仓库里,master指向的是c2,而在本地你也修改了c3,如果执行git push是不能成功的
那么该如何做呢?第一种办法:
用 git fetch 更新了本地仓库中的远程分支,然后用 git rebase o/master 将我们的工作移动到最新的提交记录下,最后再用 git push 推送到远程仓库
第二种办法:
用 git fetch 更新了本地仓库中的远程分支,然后gti merge o/master合并了新变更到我们的本地分支(为了包含远程仓库的变更),最后我们用 git push 把工作推送到远程仓库
第三种:
前面已经介绍过 git pull 就是 fetch 和 merge 的简写,类似的 git pull --rebase 就是 fetch 和 rebase 的简写!
第四种:直接git pull,然后git push
案例
按顺序将side1,side2,side3推送到远程仓库中,如第二张图所示:
首先,git fetch将远程仓库中的更新下载到本地
然后,将side1移动到o/master下面,git rebase o/master side1
同理,移动side2和side3,git rebase side1 side2;git rebase side2 side3
然后将,master移动到side3,git rebase side3 master
最后git push完成
当然也可以用git merge做
远程跟踪
当你克隆时, Git 会为远程仓库中的每个分支在本地仓库中创建一个远程分支(比如 o/master)。然后再创建一个跟踪远程仓库中活动分支的本地分支,默认情况下这个本地分支会被命名为 master。
克隆完成后,你会得到一个本地分支(如果没有这个本地分支的话,你的目录就是“空白”的),但是可以查看远程仓库中所有的分支(如果你好奇心很强的话)。这样做对于本地仓库和远程仓库来说,都是最佳选择。
你可以让任意分支跟踪 o/master, 然后该分支会像 master 分支一样得到隐含的 push 目的地以及 merge 的目标。 这意味着你可以在分支 totallyNotMaster 上执行 git push,将工作推送到远程仓库的 master 分支上。
有两种方法设置这个属性,第一种就是通过远程分支检出一个新的分支,执行:
git checkout -b totallyNotMaster o/master
就可以创建一个名为 totallyNotMaster 的分支,它跟踪远程分支 o/master。
第二种方法:
另一种设置远程追踪分支的方法就是使用:git branch -u 命令,执行:
git branch -u o/master foo
这样 foo 就会跟踪 o/master 了。如果当前就在 foo 分支上, 还可以省略 foo:
git branch -u o/master
push参数
git push origin master
把这个命令翻译过来就是:
切到本地仓库中的“master”分支,获取所有的提交,再到远程仓库“origin”中找到“master”分支,将远程仓库中没有的提交记录都添加上去,搞定之后告诉我。
我们通过“place”参数来告诉 Git 提交记录来自于 master, 要推送到远程仓库中的 master。它实际就是要同步的两个仓库的位置。
需要注意的是,因为通过指定参数告诉了 Git 所有它需要的信息, 所以它就忽略了我们所检出的分支的属性!
更新远程仓库中的foo和master
git push origin master
git push origin foo
如果将本地foo分支推送到bar分支上,该怎么操作呢?
git push origin <source>:<destination>
这个参数实际的值是个 refspec,“refspec” 是一个自造的词,意思是 Git 能识别的位置(比如分支 foo 或者 HEAD~1)
如果分支不存在
实际操作一下(重点)
首先,我在gitee上创建了一个项目,并且创建了一个分支newbranch:
然后在本地clone这个项目
然后克隆下来发现,只有一个主分支,然后-a查看远程分支,发现其他分支是红色的,或者理解为这些分支是隐藏的
如果想要将远程分支与本地分支联系起来,则执行
此时我切换到master分支,然后创建了一个文件:
然后git add . ; git commit; git push
此时远程仓库的master分支下多了这个文件:
然后在本地创建一个新的分支
推送到远程仓库
此时仓库中多了一个分支
然后在当前otherbranch中,提交了两次(每次分别创建了一个文件),还没有push
然后呢,模拟此时有一个同学在master上完成了一次更新
在本地切换到master分支,然后拉取远程仓库中的提交,发现本地readme文件已经更新
此时,如果要将刚刚otherbranch分支的提交推送到远程仓库中,就可以使用刚刚我们学到的两种操作,一种是merge,一种是rebase。具体看上面的操作吧
也可以看这个文章(不过还是要先看教程): https://www.jianshu.com/p/6960811ac89c
这里我是想把当前otherbranch的提交,提交到远程仓库的otherbranch下,这个怎么操作呢?按照刚刚使用的push加参数的办法,然后可以看到已经提交到远程仓库中了
然后再切换回master分支,新建两个文件
我想推送到newbranch分支,因为newbranch分支已经存在,所以我认为可以将这两个文件推送过去
执行以下操作后 git push origin master : newbranch
我发现推送的这两个文件在master分支下,而不是在newbranch分支下
为什么会失败呢,我又写了一个b.txt 文件,然后重新和刚刚一样操作了一下,这次成功了
区别就是这次我在git push origin master:newbranch 的冒号两边没有加空格!!!!!
为了防止偶然发生,再去尝试了一下,也成功了
然后我又去看了下上面的教程
这次我在master下创建了一个a.txt,并将其推送到一个不存在的分支new下,这次成功了
在远程仓库中,新加了一个new分支,且a.txt文件只在这个分支中存在
总结
之所以又回来学这个操作,是因为在和同学共同做项目的过程中遇到了这个问题:我在本地修改的时候,他完成了提交,然后我就不知道该怎么办了,直接pull或者直接push都是不可取的,因为可能修改的文件有冲突
所以这时候需要新建一个分支,然后将提交推送到新的分支上去
或者在将项目拉取下来的时候,就新建一个分支,然后再当前分支上修改,最后将分支推送到远程仓库中
以上是关于Git常规操作学习的主要内容,如果未能解决你的问题,请参考以下文章