zoukankan      html  css  js  c++  java
  • 版本管理工具git与svn简介

    版本管理工具

    版本管理工具简介

    • 常见版本管理工具
      • cvs(Concurrent Versions System)
      • vss(Visual SourceSafe)
      • svn 常用的版本管理工具
      • git 流行的版本管理工具(分支管理强于svn)
      • bitkeeper
      • hg
      • cc(ClearCase)

    SVN

    • 常用指令
      • checkout 下载代码
      • update 从服务器更新本地代码代码
      • add 向服务器添加文件
      • commit 提交本地的更改到服务器
      • showlog 查看版本日志

    GIT

    • git init

      • 新建仓库(即:git目录)
    • git add

      • git add * 向仓库中添加所有文件
      • git add stc/ 向仓库中添加文件夹
      • .gitignore 哪些文件忽略掉
        • 一般这些文件忽略掉
          • *.config
          • *.creator.user
          • *.includes
          • *.files
          • *.bin
          • *.so
          • *.o
      • git add -A 除了.gitignore之外的文件都加入
    • git status

      • 显示工作目录与暂存区状态, 会看到工作区与仓库代码的异同
      • 不显示已经commit过的文件
    • git commit

      • git commit -m "add xxx" -m表示附加代码提交log信息
    • git checkout

      • git checkout xxx checkout xxx目录
    • git log

      • 看历史更新信息
      • 会看到提交点唯一编号, 提交者, 提交时间等
    • git revert

      • git revert +提交点唯一编号 恢复到该提交点
        • 实际没有删除之后的分支, 而是将提交点的代码重新提交一次.
    • git --help

      • git 帮助
    • git branch

      • git branch 1.0 分支1.0
        • 用于控制项目里分支和程碑意义的版本, 避免commit的杂乱
      • git branch -a 查看分支版本
    • git checkout

      • git checkout 1.0 切换到分支1.0
      • git checkout master 切换回主干

    git版本彻底回退

    • git checkout 1.0 先切换分支
    • git branch -d master 删除主干代码提示(若为活动分支则提示)
      • git branch -D master 删除分支不提示
    • git branch master 重建空白主干

    回退到本分支历史提交点

    git log
    git reset --hard 8fcf0d63c0b2c7fc87b3974ebc04157cd310115e
    # 以下命令谨慎使用
    git push -f origin branch1:branch1 #将本地branch1分支推送到远端branch1分支. 注意加-f命令后, 该还原点之后的所有记录也将被删除. 
    

    如分支为master时, 可能会出现权限问题, 错误提示如下(所push的分支权限为protected导致的):

    ! [remote rejected] master -> master (pre-receive hook declined)
    

    此时, 可用管理员账户修改master分支的权限:

    点击Settings->Repository->Protected Branches->unprotected 将master分支权限修改即可.
    

    单文件回退到之前的版本

    • 查看某文件的版本历史, 获取hash值(假如为:8fcf0d63c0b2c7fc87b3974ebc04157cd310115e)
      git log helloWorld.cpp  
      
    • 还原文件到指定的hash值版本
      git checkout 8fcf0d63c0b2c7fc87b3974ebc04157cd310115e helloWorld.cpp
      
    • 提交(略)

    修改上次提交记录(message)

    git commit --amend
    

    git多人合作开发

    单分支开发

    • 项目经理或管理人员在服务器创建代码库
      • git init test-project --bare
    • 张三从服务器地址xxx克隆代码
      • git clone xxx
    • 张三在本地test-project中写代码
      • 可以git add和git commit到本地仓库
    • 张三最终写好后, 先上传到服务器
      • git push origin master:master
        • 将本地的master分支上传到服务器的master分支, 如果服务器没有该分支则自动创建
        • 李四如果在张三后向master提交代码, 则必须先将本地代码与master同步后才能提交
    • 李四后提交代码
      • git pull 先同步服务器上前人的代码
      • git push origin master:master 再上传自己的代码

    多分支开发

    • 张三李四分别在test-project建立自己的分支并开发, push到自己的分支上
    • 管理人员进行分支合并
      • git merge origin/zhangsan ^o, ^s 保存修改
      • git merge origin/lisi 合并lisi代码到当前分支
    • merge冲突
      • 张三李四同时修改同一个地方的代码, 会出现冲突
      • 此时需要沟通保留谁的代码, 并手动处理冲突
    • 遇到里程碑版本则建立版本分支
      • git branch v2.0
      • git push origin v2.0:v2.0
    • 张三李四则在里程碑版本上再修改
      • git merge origin/v2.0
    • 缺点
      • 分支多了以后, 管理混乱
      • 注意: 管理中应明确分支的意义

    多分支开发之部分同步

    • 情景: lisi分支的某个功能实现需要同步到zhangsan分支
      • 单个提交
      git cherry-pick  [commitid]
      
      • 多个提交(不包含commitid1, 包含commitid100)
      git cherry-pick [commitid1..commitid100]
      
      • 多个提交(包含commitid1, 包含commitid100)
      git cherry-pick [commitid1^..commitid100]
      

    打标签

    • 查看标签:

      git tag 列出所有已有标签
      git show v1.0.0 查看v1.0.0标签信息
      
    • 添加标签:

       # 格式: git tag -a 标签名 -m "附注信息"
      
       git tag -a v1.1.0 -m "完成了Win版发布"
      
    • 将本地标签推送到远程仓库分支(加参数--tags)

      # 格式: git push <远程主机名> <本地分支名>:<远程分支名> --tags
      
      git push origin develop:develop --tags
      
    • 删除本地标签

      git tag -d v1.1.0
      
    • 将删除push到服务器

      git push origin master:master --delete v1.1.0
      

    git 从主分支历史提交点创建分支

    • 拉取主分支
    git clone http://xxxx.git
    git log 
    
    • 从提交点建立分支
    # git checkout -b <branch name> <SHA1> 
    git checkout -b shenzhen1 c4fbf631011e3e6083738433a3faef853e8ffe09 # 从该sha1值新建一个shenzhen1分支
    
    • 修改代码并提交

    • 推送新分支和修改到服务器

    git push origin shenzhen1:shenzhen1 # 将本地shenzhen1分支推送到服务器shenzhen1分支, 由于服务器没有shenzhen1分支, 会自动创建该分支.
    
    • 添加分支的日志跟踪功能
    git branch --set-upstream-to=origin/shenzhen1 shenzhen1
    git push origin shenzhen1:shenzhen1
    

    撤销操作

    • 有时commit到错误的分支且没有push, 想取消此次commit并保持本地文件不修改, 经过以下操作, 已提交的修改又会回到本地修改(未提交列表)中.

      git reset HEAD~
      
    • 有时我们提交了错误的文件, 但未push, 我们想要恢复之前的状态, 可以采用reset操作

      • 找到之前提交的git commit的id
      git log 
      
      • 找到想要撤销的id
      git reset --hard id 
      
      • 完成撤销,同时将代码恢复到前一commit_id 对应的版本
      git reset id 
      

    完成Commit命令的撤销,但是不对代码修改进行撤销,可以直接通过git commit 重新提交对本地代码的修改

    彻底删除文件或文件夹(不小心上传的隐私文件/本地大文件/项目生成文件等)及其历史记录

    • 清理本地git中该文件及其记录(文件夹用rm --cached -r)

      git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch your-file-name' --prune-empty --tag-name-filter cat -- --all
      
    • 强制推送到远端服务器

      git push origin master --force
      
    • 回收空间

      rm -rf .git/refs/original/
      git reflog expire --expire=now
      git gc --prune=now
      git gc --aggressive --prune=now
      

    git其他命令

    • 多仓库保存
      git remote add myserver http://xxx.com    #添加一个仓库服务器
      git remote del myserver                   #删除一个仓库服务器myserver
      
    • 删除服务器分支
      git push origin :v2.0                     #将一个空分支push到v2.0覆盖掉
      
    • 切换git服务器(有时服务器的地址会变更, 我们需要切换远程服务器)
      git remote set-url origin http://192.168.1.168:6060/git_test.git        或者直接编辑.git/config文件中url地址, 或者使用第三方git工具直接修改
      
    • 查看git配置信息
      git config --list
      
    • 查看git用户名
      git config user.name
      
    • 查看邮箱配置
      git config user.email
      
    • 全局配置用户名
      git config --global user.name "nameVal"
      
    • 全局配置邮箱
      git config --global user.email "eamil@qq.com"
      

    git的一些坑

    • 跨平台时要配置好行尾符自动转换设置
      • 如果想Unix和Win同时都能编译运行, 最好设置好行尾符转换配置
      • 在全局.gitconfig里设置如下

    Linux/Unix下
    [core] autocrlf = false #关闭自动行尾转换或者autocrlf = input
    Win下
    [core] autocrlf = true #开启自动行尾转换

    技巧:

    • 文件或文件夹改名不要本地操作, 防止Git丢失跟踪日志, 应使用git mv进行操作
    git mv -f oldfolder newfolder
    
    • 添加文件夹使用git add -u会自动过滤掉不跟踪的文件
     git add -u newfolder
    

    技巧(屏蔽跟踪部分本地文件修改)

    • 应用场景, 很多Linux下可执行文件或脚本, git到win下面, 可执行属性丢失了, 并且git会提示为可提交. 可以编写个bat脚本, 阻止git跟踪Windows上的部分文件(以auto-make.sh文件为例).
    @echo off
    @cd /d %~dp0
    echo=
    echo ==================================帮助====================================
    echo git update-index --assume-unchanged file_path 仓库有但本地需忽略其更改
    echo git update-index --no-assume-unchanged file_path 取消本地忽略
    echo ==========================================================================
    echo=
    echo 开始设置项目Git本地配置
    @echo on
    git update-index --assume-unchanged ./auto-make.sh
    @echo off
    echo=
    echo 设置完毕
    
    @pause	
    
    • 设置本地永久保存git用户名和密码

      • 方法1: 执行如下命令
      git config --global credential.helper store
      
      • 方法2: 修改.gitconfig文件, 加入如下配置
      [credential]
          helper=store
      
    • Ubuntu安装git GUI工具

      $ sudo apt-get install gitk
      $ sudo apt-get install git-gui
    
    - 在工程目录运行gitk 或者git gui 即可.
  • 相关阅读:
    Building workspace has encountered a proble
    Eclipse异常关闭,IDE Exception Handler has encountered a problem An internal error has occurred
    jsp中写java代码的方法
    如何在jsp里面写java代码
    jsp中在java里面怎么调文本框里面的值?
    Typescript基本认识
    运行flutter run 报错Could not determine the dependencies of task ':app:compileDebugJavaWithJavac'.
    H5+原生webview实现APP的JavascriptBridge的使用
    vue mounted里使用window.onresize报错问题
    关于elmentui 抽屉 el-drawer 的slot插入的内容无法通过ref访问的问题
  • 原文地址:https://www.cnblogs.com/linkyip/p/8924271.html
Copyright © 2011-2022 走看看