GIT 知识点总结(2019/3/28)

一、git简介
Git是目前世界上最先进的分布式版本控制系统,是由 linux之父尤纳斯为了更好的管理他自己的开源项目linux系统而花了两周时间用C语言自己开发的一个软件,这个软件可以帮助Linux更好的进行开源开发,名字就叫Git。
特点: 能记录文件每一次的改动
 
二、集中式和分布式
集中式版本控制系统: 版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。
缺点: 集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,这还不得把人给憋死啊。
分布式版本控制系统: 分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,当我们在同一个局域网中工作的时候就不需要联网,在多人写作的时候如果多个人同时修改了同一个文件那么我们只需要把各自的修改推送给对方就可以互相看到对方的修改内容了。一个人的电脑坏了可以从其他人那里复制一份版本库,而集中式版本控制系统的中央服务器要是坏了那所有人都没有办法干活了。
 
三、安装git
在Windows上使用Git,可以从Git官网直接下载安装程序,(网速慢的同学请移步国内镜像),然后按默认选项安装即可。
安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
 
安装完成后,还需要最后一步设置,在命令行输入:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。
 
四、创建版本库(仓库)
    版本库可以简单的理解成一个目录,这个目录中所有的文件都可以被git管理起来, 每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
    ①选择一个合适的地方创建一个空目录(空的文件夹)
    ②在新建的目录中单击右键选择 Git Bash Here 打开一个命令窗口 在窗口中输入 $ git init 命令将这个目录变成git可以管理的仓库 同时在当前目录中会生成一个.git的目录(这个目录是git用来跟踪管理版本库的,一般情况下不要手动修改,而且这是一个隐藏文件夹,可以在文件夹的菜单栏点击查看 然后勾选隐藏的项目 就可以看到它了)
 
 
五、将文件添加到版本库
(这一步我们假设已经在目录中编写了一个文件)
①git add 文件名.后缀   //把文件添加到仓库  注意,可反复多次使用,添加多个文件;(也就是可以git add多次,最后用commit统一提交)
②git commit -m"这里写本次提交的说明"   //把文件提交到仓库
(这两个命令就好比我们传送文件的时候要先选择一个文件,然后提交)
六、掌握仓库当前状态
  • 要随时掌握工作区的状态,使用git status命令。
  • 如果我们修改了某一个文件中的内容但是并没有用git add提交 那么会出现下面的内容
  • 如果git status告诉你有文件被修改过,用git diff可以查看修改内容
如果我们将修改提交完毕后 用git status会就是下面这种情况
 
七、版本回退
如果我们对新做出的修该不满意,那么就可以用到版本回退来返回到之前的某一个版本
①git log 查看历史纪录,命令显示从最近到最远的提交日志
(这里commit之后的一大串字符是commit id,HEAD表示当前版本,上一个版本就是HEAD^,上上个版本是HEAD^^,第一百个可以用HEAD~100表示)
②git reset --hard HEAD^ 回退到上个版本
(那么如果这时候我们后悔了想要回到刚才的那个版本,我们可以通过查找git log中想要返回的那个版本的commit id来实现,只需要写前几位即可)
 
(三)版本找回
 
(但是如果我们关闭了git的命令窗口,查找不到想要找回的版本号,我们可以使用 git reflog来查找)
④ git reflog  查看命令历史,以便确定要回到未来的哪个版本
 
八、工作区和暂存区
 
(我们的文件夹目录就是工作区,工作区中由一个隐藏的目录.git不算工作区,而是git的版本库, Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
    前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。 你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
 
 
九、撤销修改
①当我们在工作区对文件进行了大量修改后想要撤销这些修改 可以用 
git checkout -- filename  //丢弃工作区的修改:
这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
② 用命令git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区:
用git status查看一下,现在暂存区是干净的,工作区有修改
 
(3)( 已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。)
用 git reset --hard HEAD^ 回退到上个版本
十、删除文件
(当我们在工作区删除了文件,git status会告诉我们有文件被删除,这时候我们用git rm 文件名 加 git commit -m 就可以将版本库中的文件一并删除)
git rm 文件名  用于删除一个文件
十一、远程仓库(GitHub)
GitHub网站就是提供Git仓库托管服务的,所以,只要注册一个GitHub账号,就可以免费获得Git远程仓库。
① 创建SSH Key,在window下打开 Git Bash,然后输入  ssh-keygen -t rsa -C "youremail@example.com"
如果一切顺利的话用户主目录中会出现.ssh目录,里面包含 id_rsa(私钥) 和 id_rsa.pub(公钥)两个文件,这两个是SSH的秘钥对
②第2步:登陆GitHub,打开“settings”,“SSH and GpGKeys”页面:
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:
点击 Add SSH Key之后出现如下页面:
设置SSH key的原因是帮助GitHub识别这条推送确实是本人提交的,因为Git支持SSH协议,所以GitHub只要知道了你的公钥就可以确认只有你自己才能推送。
GitHub允许你添加多个Key, 只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。
 
 
十二、添加远程仓库
①登陆GitHub,然后点击Start a project,创建一个新的仓库
 
在 Repository name填入仓库名称,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库
 
(现在Github上的仓库还是空的,我们可以将本地仓库的内容推送到gitHub中去)
①在本地的仓库中运行 git remote add origin git@github.com:github账户名/github仓库名.git (origin是远程仓库的默认叫法)
②git push -u origin master // 把本地库的所有内容推送到远程仓库上 实际上是把当前分支master推送到远程仓库,并且将其与远程仓库的master关联起来
 
( 推送成功后,可以立刻在GitHub页面中看到远程库的内容已经和本地一模一样:再次提交省略-u git push origin master)
图片
 
十三、从远程库克隆
①选择需要克隆的项目,然后复制github给出的地址
 
②用 git clone 命令进行克隆
 
Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议, 但通过ssh支持的原生git协议速度最快
如果有多个人协作开发,那么每个人各自从远程克隆一份就可以了。
 
十四、分支管理
(1)创建与合并分支
git会将我们的每次提交串成一条时间线,一开始的时候master分支是一条线,git用master指向最新的提交, 再用HEAD指向master,就能确定当前分支,以及当前分支的提交点, 每次提交,master分支都会向前移动一步(HEAD指向当前分支)
 
 
我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:
git checkout -b dev //创建并切换到dev分支 基于本地创建分支
git checkout -b dev origin/dev //基于远程分支创建本地分支
 
git branch //查看分支状态,*表示当前分支
 
从这时开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变
 
当我们在dev上的工作完成了,就可以把dev合并到master上, 就是直接把master指向dev的当前提交,就完成了合并
git checkout 分支名 //切换分支
git merge 分支名 // 用于合并指定分支到当前分支
 
合并完分支后,可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支
 
git branch -d 分支名 //删除分支
 
 
(2)解决冲突
当我们的两个分支修改了同一个文件的时候就会出现合并冲突,所以这时候需要手动修改。
(假设我们已经分别在两个分支上修改了同一个文件的内容,那么git merge之后就会提示我们reademe文件存在冲突,需要手动解决)
打开 readme.txt文件 
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改后保存
 
git log --graph  //命令可以看到分支合并图
(3)多人协作
①git remote -v //查看远程库的信息 ,显示可以抓取和推送的origin地址
 
多人协作时,大家都会往master和dev分支上推送各自的修改。
②git push origin 分支名 // 推送分支 把该分支上的所有本地提交推送到远程库
 
 
(3) 
 
如果推送失败,则因为团队中的其他人和你修改了同样的文件并上传到远程分支这个版本比你的本地分支版本更新,需要先用
git pull//把最新的提交抓取下来
然后通过解决冲突的方法解决合并冲突
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>  指定本地dev分支与远程origin/dev分支的链接即可
 
有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功!
 
 
 
 
 
 
 
 
 
 
posted @ 2019-09-12 11:18  zsrTaki  阅读(223)  评论(0编辑  收藏  举报