刚开始尝试使用git的时候,简直是被弄得生不如死啊,写了半天的代码一下子被删了,那时候的心情简直想SHI,后来没办法,抽了点时间学习了一下git的原理,其实就是你的文件现在到底在什么状态,这么一个问题,由于只是了解,所以不知道具体的操作,具体操作还是需要GitKraken这个GUI工具来实现。
使用git管理版本的文件在本地会有下面三个过程:
注意上面的英文,因为在一些版本管理软件的GUI界面中就会显示这些的,所以注意一下。
上面讲的这些状态都在GitKraken的最右边部分有显示:
从上到下分别是modified、staged、commit。
本地基本不怎么会被作死,但是远程,特别是使用命令行来操作远程的时候,加上分支,分分钟想SHI。。。。。。
回到原题,这里也先介绍一些基础知识,注意其中各部分的默认名称,在不熟悉git命令的情况下会经常看见这些默认名称。
//原始版本,就是保存在你远程仓库中的部分:
public function showName(){
return 'hello world';
}
//新版本,就是你本次committed的内容:
public function showName(){
return 'hello php';
}
你没有在原始的内容上添加,而是做了修改,这个时候,git要选择保存哪一个版本?最新的版本?git会抛出错误,显示无法push,然后让你选择要保存哪一个版本,选择好后再push。但是这个时候又有一个问题,别人在远程更新了Develop(假设你也在Develop分支),这个时候请问你想push的话会怎么样呢?这个时候最保险的做法是:先pull,再push。如果你使用GitKraken的话,那么他会自动更新远程跟踪分支,如果你在这种情况下push,那么他会问你是强制push,还是先pull,再push,当然,前提是pull没有冲突。
这里是我后面新建的内容,主要是描述git命令,虽然GUI界面很好,但是我还是喜欢敲命令行,总感觉很屌。
先来说两个常量:
origin是默认的仓库名,master是默认的分支名,注意这两者的差别以及其含义,接下来的命令中经常会看见这两个家伙。
这里的$url就是一般给的github超链接
查看远程仓库名,注意是仓库名,不是分支名,一般情况下是origin
原来使用git remote查看的时候只看到一个远程仓库origin,现在使用git remote add之后就新建了一个newRepetory的新仓库。
这里再加几个相关的操作命令:
重命名远程仓库
git remote rename origin_name new_name
删除远程仓库
git remote rm repetoryName
查看是否还有修改过,但是没有commited的文件,下面分别演示有和没有的显示情况:
查看修改的内容,可以加文件名或者不加。
将文件添加到Staged状态,就是缓存起来,但是还有没有commit。
将staged文件(就是git add)之后的文件,commit。
远程仓库默认是origin
这里穿插一点,如果有矛盾的话,则使用git add 冲突文件文件名,会在冲突部分显示特殊情况,具体的可能需要百度了,我本来想演示的,结果发现我居然还没有弄懂。。。。。。。
下面是一个额外的发现:
未冲突前原始文件
在github官网将文件内容进行修改
接着我再在本地的文件中新增加内容:
接着使用git pull 命令,就可以看见冲突了。
麻烦了这么久,就是为了看到这么一个冲突,心好类。注意看这里的冲突显示部分:
<<<<<<< HEAD
我是本地原始文件内容
这里是未起冲突,并且新添加的部分
=======
我是本地原始文件内容,其实只要git push之前,本地落后远程,则会显示错误。
HEAD部分表示本地的原始内容,而==============下面的则是远程的内容(后来出了一点状况,所以与上面的图片显示有点出入),接着你要干的事情就是解决这个冲突了。
至于如何解决这个冲突,我倒还真没怎么尝试过,因为之前一直在学git的命令,自己一个人编程,也很少遇到过冲突的情况,所以这个可能还需要额外学习吧,这里先是介绍原理。
上面我们知道,我们创建冲突的方式是:
假设这里我们就要保留本地最新修改的,就是HEAD后面的部分。
那么我们就只要把git添加的删除掉:
<<<<<<< HEAD 删除掉这一行
我是本地原始文件内容
这里是未起冲突,并且新添加的部分
======= 删除掉这一行
我是本地原始文件内容,其实只要git push之前,本地落后远程,则会显示错误。 删除掉这一行
之后再使用git push,就可以将本地的修改同步到远端仓库了。
最后解决冲突后结果:
这里介绍一个可能是错误的观点,但是这个观点很重要,因为它可以一瞬之间毁掉你写了半天的代码:
git好像是使用版本进行判断的,如果你的版本落后远程,则需要先进行git pull来同步,如果有冲突,无论你解没解决,之后你运行:
git push 这个时候,git默认你已经作出了选择,无论这个选择你是队的还是错误的,git所执行的操作就是把你的本地文件,同步到远程去,原封不动哦。即使其中还保留着起冲突时加在文件内部的:
<<<<<<< HEAD
============
这样的内容。所以在你不熟悉git的情况下,推荐使用GUI软件,否则你真的很有可能给别人造成很多麻烦。
提示是要我用这样的结构,不过每次写起来好麻烦啊,如果能正确执行,则会让你输入用户名和密码。验证都通过之后就会将本地的修改同步到远端了。
如果本地版本落后远端版本,则会提示错误,就要先运行git pull,解决完冲突,或者没有冲突之后,再来git push。
查看远程仓库具体信息
更新本地关于远程仓库的信息
git pull 的第一步,省略了合并(merge)的过程。可以说:
git pull = git fetch + git merge
切换分支
查看历史提交记录
这个好像还有点问题。我再试试。