一、git简介
- 版本控制:可以解决多人同时开发的代码问题,也可以解决找回历史代码的问题。
- 分布式:Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。首先找一台电脑充当服务器的角色,每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。可以自己搭建这台服务器,也可以使用GitHub网站
二、安装与配置
(1)安装命令如下:
- sudo apt-get install git
(2)安装成功后,运行如下命令,可以获取到各种场合常见的git命令:
- git
三、创建版本库:
(1)新建一个目录yuanma,在yuanma目录下创建一个版本库,命令如下:
- git init
- 可以看到在yuanma目录下创建了一个.git隐藏目录,这就是版本库目录。
四、版本的创建于回退
4.1使用:
-
在yuanma目录下创建一个文件code.txt:
-
使用如下两条命令可以创建一个版本:
git add code.txt
git commit –m '版本1'
-
使用如下命令可以查看版本记录:
git log
-
继续编辑code.txt,在里面增加一行。
-
创建一个版本后再查看版本记录:
-
现在若想回到某一个版本,可以使用如下命令:
git reset --hard HEAD~1
(回到上一个版本)
其中HEAD表示当前最新版本,HEAD^表示当前版本的前一个版本,HEAD^^表示当前版本的前前个版本;
也可以使用HEAD~1表示当前版本的前一个版本,HEAD~100表示当前版本的前100版本。
-
假如我们现在又想回到版本2,这个时候怎么办?
(1)可以使用如下命令:git reset --hard 版本号
从之前的git log
中,可以看到版本2的版本号为:
-
在终端执行如下命令:
现在发现版本2又回来了。可以查看 code.txt 里面的内容如下:
-
下面把终端关了,然后再打开终端,发现之前版本2的版本号看不到了。 那么怎么再回到版本2呢?
git reflog
命令可以查看我们的操作记录。
可以看到版本2的版本号,我们再使用如下命令进行版本回退,git reset --hard
版本重新回到了版本2。
4.2、工作区和暂存区
4.2.1、 工作区(Working Directory)
- 电脑中的目录,比如我们的yuanma,就是一个工作区。
4.2.2、 版本库(Repository)
-
工作区有一个隐藏目录.git,这个不是工作区,而是git的版本库。
-
git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
-
因为我们创建git版本库时,git自动为我们创建了唯一一个master分支,所以,现在,git
commit就是往master分支上提交更改。 -
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
-
前面讲了我们把文件往git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区; 第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
-
使用如下命令查看当前工作树的状态:
git status
当工作区文件和暂存区不一致时
如果文件都被提交到了版本库
4.3、管理修改
- git管理的文件的修改,它只会提交暂存区的修改来创建版本
4.4、撤销修改
- 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout – file。
- 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD
file,就回到了场景1,第二步按场景1操作。 - 场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节。
4.5、对比文件不同
- 现在要对比工作区中code.txt和HEAD版本中code.txt的不同。使用如下命令:
4.6、删除文件
- 删除code.txt
rm code.txt
- 命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容
五、分支管理
5.1、创建和合并分支
-
git把我们之前每次提交的版本串成一条时间线,这条时间线就是一个分支。截止到目前只有一条时间线,在git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支
-
一开始的时候,master分支是一条线,git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:
每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。 -
当我们创建新的分支,例如dev时,git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:
git创建一个分支很快,因为除了增加一个dev指针,改变HEAD的指向,工作区的文件都没有任何变化。 -
不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:
-
假如我们在dev上的工作完成了,就可以把dev合并到master上。git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:
git合并分支也很快,就改改指针,工作区内容也不变。 -
合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:
举例说明: -
执行如下命令可以查看当前有几个分支并且看到在哪个分支下工作
git branch
-
创建一个分支dev并切换到其上进行工作
-
修改code.txt内容,在里面添加一行,并进行提交
-
切换回master分支
git checkout master
查看code.txt,发现添加的内容没有了。因为那个提交是在dev分支上,而master分支此刻的提交点并没有变
- 把dev分支的工作成果合并到master分支上
git merge 分支名称
再查看code.txt的内容,就可以看到,和dev分支的最新提交是完全一样的
注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快
- 合并完成后,就可以放心地删除dev分支了,删除后,查看branch,就只剩下master分支了
总结:
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
5.2、解决冲突
- master分支和dev分支各自都分别有新的提交:
- 执行如下命令尝试将dev分支合并到master分支上来
- git status也可以告诉我们冲突的文件
- 查看code.txt的内容
- git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改如下后保存
- 再提交
- 现在,master分支和dev分支变成了下图所示
- 用带参数的git log也可以看到分支的合并情况
5.3、分支管理策略
通常,合并分支时,如果可能,git会用fast forward模式,但是有些快速合并不能成而且合并时没有冲突,这个时候会合并之后并做一次新的提交。但这种模式下,删除分支后,会丢掉分支信息
- 创建切换到dev分支下;
- 新建一个文件code3.txt编辑内容,并提交一个commit;
- 切换回master分支,编辑code.txt并进行一个提交;
- 合并dev分支的内容到master分支;
- 出现如下提示,这是因为这次不能进行快速合并,所以git提示输入合并说明信息,输入合并内容之后git会自动创建一次新的提交
如果要强制禁用fast forward模式,git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息
- 创建并切换到dev分支;
- 修改code.txt内容,并提交一个commit;
- 切换回master分支;
- 准备合并dev分支,请注意–no-ff参数,表示禁用Fast forward;
因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去 - 合并后,我们用git log看看分支历史
5.4、bug分支
每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除
- 修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除; 当手头工作没有完成时,先把工作现场
git stash
一下,然后去修复bug,修复后,再git stash pop
,恢复工作现场
六、使用github
6.1、创建仓库
-
注册github账户,登录后,点击"New respository "
-
在新页面中,输入项目的名称,勾选’readme.md’,点击’create repository’
-
添加成功后,转到文件列表页面
6.2、添加ssh账户
-
点击账户头像后的下拉三角,选择’settings’(如果某台机器需要与github上的仓库交互,那么就要把这台机器的ssh公钥添加到这个github账户上);
-
点击’SSH and GPG keys’,添加ssh公钥。
-
编辑文件.gitconfig,修改某台机器的git配置
-
修改为注册github时的邮箱,填写用户名
-
使用如下命令生成ssh密钥
ssh-keygen -t rsa -C "邮箱地址"
-
进入主目录下的.ssh文件件,下面有两个文件
公钥为id_rsa.pub 私钥为id_rsa
-
查看并复制公钥内容
-
回到浏览器中,填写标题,粘贴公钥
6.3、克隆项目
- 复制git地址
6.4、推送项目
- 推送分支,就是把该分支上的所有本地提交推送到远程库,推送时要指定本地分支,这样,git就会把该分支推送到远程库对应的远程分支上
git push origin 分支名称
例:
git push origin smart
6.5、将本地分支跟踪服务器分支
git branch --set-upstream-to=origin/远程分支名称 本地分支名称
例:
git branch --set-upstream-to=origin/smart smart
6.6、从远程分支上拉取代码
git pull orgin 分支名称
例:
git pull orgin smart
注:参考网络上文档编写,部分内容并非原创!!!