1.简介
Git是目前世界上最先进的分布式版本控制系统(没有之一)。在一个多人合作的工作中,想删除一个段落,又怕将来想恢复找不回来怎么办?于是不得不对同一个文件建立多个不一样的副本;好不容易完成了自己需要编辑的部分,又需要再多个同事之间对协作完成的文件进行传输。使用Git就可以结束手动管理多个版本的刀工火种的时代,进入版本控制的新时代…
2.git仓库基础

- 工作区(work directory):就是你在电脑上看见的目录,出了.git以外的区域
- 版本库(repository):在工作区中有一个隐藏目录.git,这个不属于工作区,这是版本库.
- 缓存区(stage)
- master分支以及指向master的一个指针HEAD.
- add 实际上就是把工作区的文件修改添加到了缓存区。
- commit就是把缓存区的内容提交到了当前分支,并清空了缓存区。
常用操作:
ls // 查看目录下的所有文件
ls -ah // 可以查看文件夹下的隐藏文件。
ls -al // 查看文件夹下的所有文件,并列表显示
pwd//查看当前路径
cd path//访问路径文件
mkdir folder//创建路径文件
cat xxx // 查看文件内容
vi xxx // 对xxx文件进行编辑,i 进入编辑模式,dd 删除编辑模式中光标所在行,esc退出编辑模式 :wq 退出编辑模式后退出vi的编辑环境
git config –global user.name “Pis”
git config –global user.email “email@163.com“
git config –list //查看git配置
git push origin –delete xxx //删除远程xxx分支
git branch -d xxx //删除本地xxx分支
git branch -D xxx //强制删除本地xxx分支
git tag //查看tag
git tag -a tagName -m"tag description" commitId // 给版本的commit打tag
git push origin tagName // 推送tag到远程仓库
git push origin --tags // 推送所有的tag
3.本地初始化一个git仓库

3-1.Desktop/web/git文件下创建git_test版本库
1 | cd Desktop/web/git |
3-2.初始化版本库
1 | git init //这时候git_test版本库下多了一个.git的目录,这个目录是git用来跟踪管理版本的。 |
3-3.手动把文件添加到版本库中
注:
所有的版本控制系统,只能跟踪文本文件的改动,比如txt,网页和所有的代码等。
3-4.把文件从工作区添加仓库的缓存区里面去
每当文件被修改之后,都需要重新add和commit
1 | git add readMe.md |
3-5.把文件提交到仓库当前分支上
git commit -m"commit description"
可以使用git status查看状态信息
可以使用git diff查看工作区和仓库文件的区别,也就是对比不一样的内容
可以使用git log查看历史纪录
如果感觉日志内容太多,可以git log --pretty=oneline
可以使用git reflog查看所有的历史操作
可以使用cat file查看file的内容
可以使用vi file查看文件的详细信息
- 当使用vi fileName的方式创建文件的时候,就进入写入模式,可以编辑文件内容,然后编辑结束按esc,再:wp就可以退出了。
可以使用:wq退出当前文件的查看状态
4.版本回退
commit到master分支想要撤回到之前版本:
在git中,用HEAD表示当前版本。
git reset --hard HEAD^//回到上一个版本
git reset --hard HEAD^^//回到上上一个版本
git reset --hard HEAD~100//回到100个版本以前
git reset --hard commit_id//回到commit_id的版本
控制台不关闭,可以使用git log查看所有的commit版本记录;
控制台关闭过了,可以使用git reflog查看所有历史纪录的版本。
Git撤销修改和删除文件操作
修改了文件发现文件的修改有误需要撤销修改
1. 手动在文件中删除做出的修改 (原始的做法,改错了直接手动该回去)
2. 使用git reset --hard HEAD^回到上一个版本 (已经add了,并且commit到本地的分支上)
3. 使用git checkout --file丢弃在工作区中的修改 (在工作区或者缓存区的修改)
1>修改了文件还没有添加到缓存区,这就回到了版本库中的状态。(修改在工作区,还没有add)
2>修改了文件并提交到了缓存区,回到了版本库缓存区的状态。 (修改在缓存区,已经add还没有commit)
总之就是让这个文件会到最近一次git commit或者git add的状态。
总结:
只要没有commit,都可以使用git checkout --file恢复
commit了只能使用git reset --hard commit_id恢复到commit
5.远程仓库
本地Git仓库和远程代码仓库之间的传输是通过SSH加密的
创建SSH Key
1>如果在用户主目录下有.ssh目录,查看有没有id_rsa和id_rsa.pub这两个文件
2>没有的话,执行ssh-keygen -t rsa -C "email@example.com",按照向导填写信息。
3>id_rsa是私钥,不能泄漏出去;id_rsa.pub是公钥,可以放心的告诉别人。
4>登陆远程代码仓库,在settings中SSH_Keys页面点击Add SSH Key,填上title在key文本里面粘贴id_rsa.pub文件的内容。
5>这样远程代码仓库就可以识别出你推送的提交确实是你自己推送的,而不是别人冒充的,而git支持ssh协议。所以,远程代码仓库只要知道了你的公钥,就可以确定只有你自己才能推送。
6>远程代码仓库允许添加多个key,这样如果你有多个电脑,比如一会在公司,一会在家提交,只需要把每台电脑的key都添加带远程代码仓库上,这样就好了。
本地Git仓库添加远程仓库
已经在本地创建好了Git仓库,想在github,coding或者gitee,gitlab等远程代码托管仓库上搭建一个远程Git仓库,希望这两个仓库远程同步,这样远程仓库可以作为备份,又可以其他人进行仓库来协作
---------在本地创建仓库-->托管到远程仓库-----------
1.在github上创建一个git仓库git_test
2.在本地创建git仓库
mkdir Desktop/web/git/git_test
pwd //可以确认是否已经进入git—_test
git init//创建git_test的版本库.git文件
3.添加项目需要的文件在git_test文件夹里面
4.提交到本地master分支
git add file
git commit -m"file init"
5.创建远程origin的git仓库
git remote add origin git@gitbub.com:unclepis/git_test.git
git remote -v // 查看本地仓库和远程仓库的关系
git remote set-url origin git@gitbub.com:unclepis/git_test.git // 重新设置本地和远程仓库的关系
6.把本地git仓库master分支的内容推送到远程仓库
git push -u origin master//第一次
git push origin master//以后推送
从远程库克隆项目到本地
如果先有远程库,需要克隆到本地
1.登陆github创建一个新的仓库git_test
2.克隆到本地
git clone git@github.com:unclepis/git_test.git
git clone git@github.com:unclepis/git_test.git newRepoName // 可以修改克隆下来的项目名称为newRepoName
创建与合并分支
git checkout -b dev//创建并切换到dev分支
git branch //查看分支信息,当前分支前会有一个*
git checkout dev //切换到dev分支
git merge dev //把dev分支合并到当前分支
git branch -d dev//删除dev分支
6.发生冲突
- 本地发生冲突
git status
cat file//查看发生冲突的文件
修改冲突的代码信息
add并commit
- 远程仓库push后冲突,最好将冲突的分支拉到本地解决冲突
git fetch origin
git merge origin/xxx // xxx冲突的分支
修改冲突的代码信息
add并commit
分支管理模式
Fast forward:快速模式,删除分支后会丢掉分支信息
-no-ff:禁用ff模式
分支管理流程
1.git checkout -b dev//创建一个dev分支。
2.修改readme.txt内容。
3.git add file
git commit -m"change file"//添加到暂存区。
4.git checkout master//切换回主分支(master)。
5.git merge -no-ff -m"merge with no ff"dev//
合并dev分支
使用命令 git merge –no-ff -m “注释” dev
6.git branch -d dev//删除dev分支
7.git log//查看历史记录
分支管理策略
master主分支比较稳定,一般是用于发布新版本(release版本,一般master分支写保护了,不允许直接从本地master往远程的master分支推送)
干活在dev分支,完成后合并到master上发布。(开发dev分支)
- 多人协作的项目,可以基于dev分支,建立每个人的xxxDev分支,然后合入到dev分支在测试环境进行测试
bug分支
临时保存没有提交到版本库的手头工作dev,修复bug分支。
git stash//临时保存dev分支的工作
git checkout -b bug//创建并切换到bug分支
修改bug文件并add/commit
git checkout master//切换到master分支
git merge -no-ff -m"fix bug" bug//把bug分支合并到master上
git branch -d bug//修复完bug删除bug分支
git checkout dev //回到dev分支继续干活
git stash list//查看stash list
git stash apply //恢复stash内容并不删除
git stash drop//强制删除
git stash pop //恢复并删除stash内容
多人协作
当从远程库克隆的时候,git会自动把本地的master分支和远程的master分支对应起来,并且默认的远程库是origin。
git remote //产看远程库的信息
git remote -v查看远程库的详细信息
git push origin master//推送本地master到远程master
git push origin dev//推送本地的dev到远程的dev
多人协作流程
1.克隆git仓库到本地
git clone git@github.com:unclepis/git_test.git
2.进入本地库
cd git_test
3.创建分支开发dev
git checkout -b dev origin/dev // 基于远程的dev分支建立一个dev,如果不指定,会基于当前所在分支建立本地分支
4.修改项目文件
git add file
git commit -m"modify file"
5.合并dev到本地的master
git checkout master// 切换到master
git pull origin master // 更新本地的master
git checkout dev
git merge master
git push origin dev
6.删除dev分支
git branch -d dev//删除dev分支
7.如果pull的时候没有建立本地和远程库的关系,需要先建立联系
git branch --set-upstream master origin/master // 旧的写法
git branch --set-upstream-to=origin/master master // 新的写法
git branch -u origin/feature feature // 或者写成这样
git branch --track feature origin/feature // 或者写成这样
git pull origin master --allow-unrelated-histories // 提示unrelated histories的强制做法
//例子:建立本地master和远程master的联系
8.提交文件然后再push
git add file
git comit -m"fix conflict"
git push origin master
忽略特殊文件
把不想提交的在git版本库目录下的文件隐藏到.gitingore下。