git

一、引入

  • 分布式版本控制系统
    • 分布式对应集中式
    • svn是典型的集中式版本控制系统,版本库集中存放在中央服务器,中央服务器连接各开发机,工作时需从中央服务器拉取最新代码,开发完成后再推送给中央服务器
      svn
    • git是分布式版本控制系统,开发机各自维护自己一套版本库,自行完成开发后进行代码合并,并推送保存至远程代码仓库
      git
  • 工作区
    • 在开发电脑能看到的目录,比如你在/home/project下开发,这个目录就是工作区
  • 版本库
    • 在工作区的.git目录中
    • 版本库可分为两个部分,暂存区(stage)和分支(branch)。主(master)分支默认自动创建。 一般代码是从工作区add到暂存区,再从暂存区commit到指定分支上
      workspace stage

二、git操作

  • 创建版本库
//创建普通版本库
git init

//创建裸仓库
git init --bare
  • 提交工作区修改到暂存区
//添加工作区指定文件到暂存区
git add <file>

//添加工作区全部修改到暂存区
git add .

//提交工作区所有修改到暂存区,包括删除文件
git add --all

//删除文件,并提交到暂存区
git rm <file>

//修改文件名,并提交到暂存区
git mv <file_a> <file_b>
  • 撤销工作区修改
//撤销工作区指定文件修改
git checkout -- <file>
  • 撤销暂存区修改
撤销暂存区指定文件修改提交
git reset HEAD <file>
  • 提交暂存区的文件到分支
//暂存区内容到当前分支
git commit -m 'blabla...'

//提交当前暂存区内容,并合并到最新一次commit中,支持修改提交说明
git commit --amend
  • 分支处理
//查看分支
git branch

//查看已合并的分支
git branch --merged

//查看未合并分支
git branch --no-merged

//新建分支
git branch <branch_name>

//新建分支并切换到新分支
git checkout -b <branch_name>

//删除分支
git branch -d <branch_name>

//强制删除分支
git branch -D <branch_name>

//切换分支
git checkout <branch_name>

//合并分支
git merge <branch_name>

//隐藏当前分支修改内容(用于解决突发bug)
git stash
git stash pop
git stash apply
git stash drop

//调整HEAD指向的分支上的提交点
git reset --hard 版本号
  • 查看提交日志
//查看提交日志
git log

//查看简化版提交日志
git log --oneline

//查看最近n条提交日志,n为数字
git log -n

//查看commit提交轨迹
git log --graph

//查看commit涉及变动文件
git log --name-only

//查看commit涉及变动文件以及文件变动类型
git log name-status

//查看提交详情
git log -p

//经常使用(可定义别名)
git log --oneline --graph -10

//查看全部提交版本信息(手动回退版本后git log显示将隐藏版本号在回退版本号之后的记录)
git reflog
  • 远程仓库操作
//关联本地仓库和远程裸仓库
git remote add origin git@github.com:xxx/xxx.git

//推送本地master分支到远程裸仓库master分支
git push -u origin master //-u参数可以关联本地分支和远程分支
git push origin master

//推送本地其他分支到远程仓库对应分支
git push origin dev

//从远程仓库克隆master分支
git clone git@github.com:xxx/xxx.git

//从远程仓库拉取其他分支
git checkout -b dev origin/dev

//从远程仓库拉取更新
git pull
//从远程仓库拉取更新,merge代码时线性排列
git pull --rebase
  • 配置别名
//配置git status简化为git st
git config [--global] alias.st status

//配置git reset HEAD简化为git unstage
git config [--global] alias.unstage 'reset HEAD'

//也通过直接修改家目录下.gitconfig文件实现

特别说明:执行git命令行操作时候,多关注提示内容,一般都会有针对当前操作场景的操作建议

三、git分支

  • 什么是分支
    • 每次commit,git会把提交点串成一条线,这条线可以理解为分支。git默认自动创建master分支,开发者可根据需求创建其他分支
    • HEAD指向当前分支上的提交点
      master
  • 多个分支
    • 开发者创建不同分支完成不同功能模块开发
    • 举例说明
      • 在master分支上创建dev分支,dev分支提交点和master提交点相同
        dev create
      • 在dev分支上修改代码,并提交。dev提交点向后移动
        dev commit
      • 回到master分支合并dev分支代码,在没有冲突情况下,git直接将master提交点指向当前dev最新的提交点
        dev merge
      • 删除已合并的dev分支
        dev delete
  • 分支冲突
    • 参考上面情况,dev分支提交点往后移动,master分支同时也有新的提交(其他开发者提交的更新),情况如下图
      dev merge conflict
    • 两个分支均出现新的提交点且存在对相同文件的修改,在master分支上直接使用 git merge feature1命令,git无法通过前面相同方式实现快速合并,此时需要手动解决分支冲突(根据git提示处理指定文件中的冲突代码,git add 修改后的冲突文件,git commit 再次提交完成)
      dev merge conflict fixed
  • 更清晰的分支合并(rebase = replace base)
    • 使用以上方式处理分支冲突,再次合并后通过git log查看,提交轨迹如图。
      master merge dev
    • 假设分支众多,都通过以上方式合并分支,git提交轨迹会变得很混乱。解决这个问题,需要使用git rebase命令。
      branch develop
    • 回到前面出现分支冲突的情况,两个分支均出现新提交点。
      dev merge conflict
    • 在dev分支中,执行 git rebase master 命令调整dev分支基点(过程可能存在分支冲突,根据提示手动解决即可)。rebase操作实际上,就是把创建dev分支时指向的提交点,移动到master最新的提交点上。这样再回到master分支上执行 git merge dev 命令时就可以避免git提交轨迹的交叉。
      rebase
  • 分支管理策略
    • 实际开发中,master分支是功能最稳定的分支,不会轻易修改。
    • 多人同时开发的情况下,会选择在master功能稳定的提交点上,创建dev分支。可能在dev分支合适的提交点上以功能为单位创建其他分支。
    • 开发者需要手动clone远程仓库代码,同时拉取下自己要开发的对应分支内容,在分支上完成编码后提交,如提交被拒绝,说明远程有新更新,需要git pull拉取更新后再提交。
    • 注意
      • git pull会执行两个动作,拉取远程代码并且和本地代码进行合并,这样就会导致git log提交轨迹出现分叉情况,建议使用 git pull --rebase 便于整理分支提交轨迹
      • 比如在dev分支上执行 git rebase master,当前dev分支无法push到远端仓库会被拒绝,可以在确认该分支无修改提交后使用git push -f 强制刷新到远端仓库

参考源:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值