git版本控制

1.简介

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

2.git仓库基础

gitConcept

  • 工作区(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仓库

initRepo

3-1.Desktop/web/git文件下创建git_test版本库

1
2
cd Desktop/web/git    
mkdir git_test

3-2.初始化版本库

1
git init  //这时候git_test版本库下多了一个.git的目录,这个目录是git用来跟踪管理版本的。

3-3.手动把文件添加到版本库中

注:
所有的版本控制系统,只能跟踪文本文件的改动,比如txt,网页和所有的代码等。

3-4.把文件从工作区添加仓库的缓存区里面去
每当文件被修改之后,都需要重新add和commit

1
2
3
4
      git add readMe.md
可以一次add多个文件,然后一起commit
git add file1.txt file2.txt
git commit -m "upload 2 files"

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加密的
configGit

创建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下。

初到贵宝地,有钱的给个钱场,没钱的挤一挤给个钱场