一直在网上寻找git的介绍,因为自己本人也用git用的少,一直只是只会git的三板斧操作,等到真正项目中要用的时候,自己还是什么都不会,所以下定决心整理一下,为了自己也为了他人。截图都是来源于网络自己只是加以总结和整理
协同修改:
就是,在一个工程中,两个人同时对一个版本进行修改,在两个人提交之后,并不会存在覆盖,
也就是说支持,协同修改。
数据备份:
在我们使用很多代码的时候,并不是仅仅保存上一个修改后的版本就是好的,而是将之前一步一步修改
的每一个版本都是有的,这样的好处就是,无论是回退还是修改每一个版本都是很方便的。
版本管理:
SVN采用的是增量式,也就是说你每次提交的代码,我就和之前的你已经提交的代码进行比较,
只保存增加的,等到你再从我服务器获取的时候,我就把这两部分整合在一起返回给你。这一切都是SVN
自己做的。而git采用的是文件快照,接下来再说
版本控制,分支里面Git做的是绝无仅有,非常的流程
上面介绍的都是版本控制工具应该具备的功能,接着说说什么是版本控制,版本控制是一种思想,版本开发工具是对思想的一种体现
版本控制分为两种思想,一种是集中式的开发工具,代表就是SVN,另一个就是分布式的控制工具,
代表的就是Git。
集中式的开发工具就是将所有的版本信息,存储在服务器,服务器宕机便会造成所有的信息丢失,而Git在每个人的电脑上就有一个完整的版本代码。
总而言之就是分布式的Git比集中式的更好一些,好就好在,集中式的容易发生单点故障
用你拿到的文件做哈希,和人家版本库里面的哈希值作比较,只要一致就说明文件内容没问题,
通过这样保证代码的完整性
代码在git中就跟串珠一样,被保存着,很容易地拿到任何一个版本,便于修改,和大胆的改造
Github就是Git的代码托管中心
如果你在局域网作用下,可以自己搭建一个Gitlab,代码管理中心
如果在外网就可以直接访问Github和码云
代码托管中心,主要目的就是帮我们维护远程库。
团队内协作就是,假如左边的这个人A在自己的电脑上有一个本地代码库,里面存的都是自己之前写的
很多个版本的代码,他自己在远程代码托管中心,创建了一个远程库,A可以通过push操作将自己本地的代码上
传到远程库,接着他的团队有了右边这个人B,它可以通过clone将A远程库的代码克隆下来到自己的本地,以及代
码结构然后B对代码进行了修改,然后想要把自己修改后的代码也上传到A的远程代码库,但是不可以,这也就是
Git的权限控制,必须A运行B加入他们之后,B才可以将自己的代码上传到,远程的代码库,然后加入A的团队之
后,B也就可push代码到A的远程库了,然后A也可以把B修改之后的代码pull拉到自己的本地进行查看,修改,
只要是加入团队的都可以进行pull,只要加入团队就类似于有了权限。
跨团队远程协作,就是C可以先fork,A的库,然后自己将库复制下来,接着进行修改,再push到自己的远程
库,然后发起审核merge,然后A同意之后,就可以把C的库中的代码合并到自己的库。也就是说C并没有直接对A
的库进行修改的权限,这就是跨团队远程协作。
接着就是我们下载好Git这个工具在自己的电脑上,接着就可以进行如下的操作了。
首先我们要在自己的本地建立一个文件夹,这个文件夹就模仿的是你的一个仓库,也就是你的本地库,现在
我建好了一个名叫MyGitHome的仓库,进入我刚建立的仓库,刚进来这个仓库底下什么都没有,接着给仓库里面
再新建一个文件夹,取名为Wechat,也就是说未来我就是要给这个目录下存真真正的代码了,然后再次进入
Wechat这个文件夹,右击,因为已经安装了Git所以就会出来一个git bash here 接着点这个,就会看到自己
现在所在的目录了,
接着在命令行进行 git init初始化本地库操作,然会会提示你初始化了一个空的Git仓库,在你现在所在
的路径下,会有一个.git目录,我们可以查看到这个目录中有很多的文件的其他的目录,一个config文件后续
会用来进行一些信息的配置,还有其他的文件。需要注意的就是.git文件中存的都是一些和本地库相关的目录和
文件,不要删除也不要修改。
什么是设置签名,说的通俗一点就是我们绑定我们的用户名和邮箱,需要注意的是,在Git本地界面设置的
用户名和密码和我们登录到远程的代码管理中心的用户名和密码不是一个东西,这里的用户名和邮箱只是为了区
分我们不同开发人员的身份,因为都需要往远程库提交代码。
接着就是讲一下,就是我们在我们自己的Wechat这个目录里面使用命令创建的签名,只在当前这个目录有
效,或者说只在这个库有效。这里需要说的是,签名分为项目级别,或者说仓库级别,也就是我刚才说的仅在当
前仓库下生效,还有一个就是系统级别,也就是当前这个电脑,这个操作系统都有效的。
在设置项目级别的签名的时候使用的命令是
git config user.name "用户名"
git config user.email "邮箱"
在设置系统级别的用户的时候使用的命令是
git config --global user.name "用户名"
git config --global user.email "邮箱"
当我们设置的项目级别的用户名和邮箱就存储在我们上面说的那个config文件里面
而使用系统级别设置的用户名和密码就存储在~下的./gitconfig里面
这里说一下,如果使用git commit "文件名"将需要每次都进入到编辑器,为了方便起见可以直接输入git commit -m "文件名"
还有一个需要注意的是,假如我们的文件叫XXX,我们将文件通过git add "XXX"加入暂存区,当我们要上传到本地库的时候使用git commit -m “ZZZ”(ZZZ指的是,这里我们可以按照我们的需求对我们上传到本地库文件的名字进行修改)
接着继续在我们的Wechat这个目录下,我们使用git status来查看一下当前的这个库的状态
他会输出下面的信息
on branch master //你现在在master这个分支上,也就是主分支上
No commits yet //没有什么已经提交的东西,意思就是你现在还没有给本地库提交代码
nothing to commit (creat/copy file and use "git add" to track) //也没有什么去提交,
//就是意味着你的暂存区也没有代码,可以被提交,我们每次提交代码之前都需要,先把代码放到暂存区,
//你只能从暂存区提交代码到远程库。
接着我们可以在Wechar这个目录下自己创建文件或者文件夹,或者讲其他目录的文件,文件夹拖到当前目
录,然后进行git add "文件名",首先讲文件添加到暂存区。我们要是后悔了也可以使用,git rm --cached
"文件名"将你已经上传到暂存区的代码,从暂存区移除。接着git commit "文件名",将代码存到本地库。其实
上传的文件的目录一直都变,我们这里所说的暂存区,本地库,只是我们自己说的。
接着我们对已经到了本地库的代码进行,修改操作,然后再次使用git statue 操作就可以看到提示说,文
件已经被更新,但是不在暂存区,我们可以使用git add "文件名"将他加入到暂存区。然后再使用
git commit "文件名"将他上传到本地库。
查看历史记录使用
git log
git log --pretty=oneline
git log --oneline
git reflog
假如说我们现在要回退到以前的版本,先来查看一下现在都包含哪些版本
git reflog
接着使用git reset --hard + 你要回退的索引
我们会发现HEAD指到了你现在回退的版本。此时查看文件也回退到了这个版本,但是你看图片可以知道,虽然我们回退了,但是最新版本到回退到现在的之间的版本其实也都在本地库存储着。
其他的回退方法
我们说过,使用Git来管理的好处就是,可以很自由的回退到以前的每个版本,
现在假如本地库有一个文件A,我是用rm A将A文件从工作区(就是你现在在那个目录下写这个git)删除了,然后使用git status 就可以发现,此时需要将文件删除的操作添加到暂存区,接着使用git add A,将你刚才的删除操作提交到暂存区,接着再查看状态git status,可以发现此时我们删除A文件的动作将要被提交,我们进行提交操作git commit -m “A”,接着我们就把删除A文件的操作提交到了本地库,但是需要注意的是,现在所说的删除之是将现在的这个一个版本中的A文件删除,你使用上面的回退操作依旧可以在之前的版本中,从工作台找到A文件。但是我们在版本库里面删除这个文件的记录是永远也删不掉的,就好像你每次进行一步提交或者其他的操作,版本库都会给你记录下来一样。
现在存在另外一种情况就是,我们将一个文件进行了rm 操作,但是我们并没有像上面一样git add将这个这个操作提交到暂存库,现在要是后悔了怎么把文件拿回来?只需要进行git reset --hard HEAD意思就是回退到现在HEAD指针指的位置,也就是将暂存区,本地库和工作区保持重新刷新。
使用git branch -v就可以查看当前所有的分支
使用git branch +分支名 可以创建一个新的分支
接着使用git checkout +分支名 来切换当前所在的分支
git merger +合并的分支名
合并之后,就会将hot_fix这个分支上代码的修改和master分支上的代码修改合并在一起。
这里补充一下,我们在使用git commit -m “文件名”,其实也可以这样写git commit -m “日志名称” "文件名"
为什么会产生分支冲突呢?首先一个项目都会有很多的分支,假如在两个不同的分支,对同一个文件的同一个位置进行了修改,那么如果此时要合并,Git就拿不定主意,不知道你到底保留哪一个分支的修改。此时就会以冲突的形式给我们自己体现出来,然后让我们自己去拿主意。
此时产生了冲突需要我们自己去解决,此时我们打开冲突的文件,然后我们可以发现,此时Git在文件中给我们已经做好了标记,标记中间便是两个文件中冲突的内容,接着我们选择在Git给的标记中保留一个,也就是编辑冲突文件,接着保存退出,然后再次git add ,git commit -m “取一个日志的名字”具体操作如下
SVN的管理哥哥版本就是把每个版本的新做的需修改保存下来,然后等到用户需要的时候,再把他做的修改合在一起返回给用户
而Git是通过一种快照的方式来保存的
主要总结就是git主要是同故宫类似于链表和指针的方式将我的文件都串联在一起。管理起来的,所以无论是版本的回退还是分支的合并都是很迅速的。
1.首先注册Github的账号,登录到Github的官网,填写用户名邮箱和密码,创建一个账户,需要注意的是这里的用户名密码账户,不需要和我们在本地的git config 这个命令里面的用户名邮箱有什么关系。
2.创建一个新的仓库。
提示我们需要验证邮箱地址
邮箱就是注册Github账号时候的邮箱,打开邮箱点击验证即可
此时再次点击New repository,新建一个仓库。
3.建仓的具体细节
刚创建好的空仓库,只是有一些提示没有具体的内容
1.复制地址
入果是第一次的话还需要输入密码,输入你Github的账号和密码。
为了证明我还专门今天新建了一个仓库,并且提交了代码,不过有一点还是需要注意就是git的版本问题
warning: push.default is unset的解决方案
1.假如自己现在什么都没有就只是在自己的电脑上安装了git,
2.在一个文件夹下git clone + http地址就可以将这个http地址上的代码拷贝下来,如果是和项目的话,有很多文件他们都会给你把目录结构什么的全部拷贝下来。
刚克隆下来的库我们可以查看一下
很多东西都帮我们做好了
如何解决冲突:
首先两个人同时从远程库拉下来代码,然后同时修改,A修改后先提交了,此时远程库已经发生修改,此时B再给远程库推送,假如两个人修改的是同一个位置,此时就会发生冲突,提交不上去。这个时候就应该B先把远程库拉下来,然后解决完冲突,再提交上到远程库,此时解决冲突的方法上面都说了。