• GIT学习笔记.


    Git 的工作就是创建和保存你项目的快照及与之后的快照进行对比

     
    Git 与 SVN 区别
    GIT不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。
    如果你是一个具有使用SVN背景的人,你需要做一定的思想转换,来适应GIT提供的一些概念和特征。
     
    Git 与 SVN 区别点:
    1、GIT是分布式的,SVN不是:这是GIT和其它非分布式的版本控制系统,例如SVN,CVS等,最核心的区别。
    2、GIT把内容按元数据方式存储,而SVN是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn,.cvs等的文件夹里。
    3、GIT分支和SVN的分支不同:分支在SVN中一点不特别,就是版本库中的另外的一个目录。
    4、GIT没有一个全局的版本号,而SVN有:目前为止这是跟SVN相比GIT缺少的最大的一个特征。
    5、GIT的内容完整性要优于SVN:GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
     
    一般工作流程如下:
    • 克隆 Git 资源作为工作目录。
    • 在克隆的资源上添加或修改文件。
    • 如果其他人修改了,你可以更新资源。
    • 在提交前查看修改。
    • 提交修改。
    • 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。

     
    常用命令:
             git add    暂存区的目录树被更新,将工作区的目录写入暂存区
             git add .  添加当前项目的所有文件
             git add –i [path]   查看这个目录下所有修改和删除但没有提交的文件。执行这个命令
            
              git commit –m ‘提交代码并注释’:将暂存区的目录树提交到版本库中
              git commit –am ‘第一次版本修改’:直接将工作区的代码提交到版本库
     
              git remote 查看当前远程库 
              git remote rm [别名] :删除远程仓库
              git clone [url]  复制对应地址的仓库下来
              git remote –v  可以看到每个别名的实际链接地址
              
              git pull   拉取最新的代码,若有冲突,则修改冲突的文件 ,不加参数的话 只是针对当前分支与远程自己分支进行同步更新
              git push   拉最新代码推到代码仓库。
              git pull origin next:master :取回origin主机的next分支,与本地的master分支合并。
              git push origin local_branch:remote_branch :将本地分支推送到远程仓库
     
              git reset head:暂存区的目录树被版本库中的代码重写,但是工作区不受影响
              git reset --hard:将版本回退到上一次提交的版本
              git rm –cached<file>  会直接从暂存区删除文件,工作区则不做出改变
              git rm file  会将文件从缓存区和工作区删除
              git reset --soft HEAD^  提交从 commit 状态退回到 add 状态
           
              git checkout--<file>  将暂存区的代码写入工作区(可能会误删工作区未提交的代码)
              git checked HEAD:将版本库中的所有代码替代工作区的代码,同时更新暂存区的代码
              touch:新建一个新的文件
              ls:显示当前目录下的所有文件
              git status –s:查看项目的当前状态
              git diff  显示你上次提交更新后的更改或者写入缓存的改动
     
              git config --global user.name '用户名':设置用户名
              git config --global user.email 邮箱地址:设置邮箱
                   
     
    密钥管理:
    1、cd ~/.ssh  是否存在主目录密钥的目录
    2、ls 看下是否存在密钥文件
    3、ssh-keygen -t rsa  生成密钥
    4、cat ~/.ssh/id_rsa.pub 查看公钥
    5、添加公钥到远程仓库
    文件的几种状态:
    A:工作区中存在,提交到暂存区,且工作区和暂存区的代码一致
    AM:文件提交到暂存区后又有改动
    AD:暂存区中有文件,而工作区中没有
    ??:代码值存在工作区,未提交到暂存区
    M:提交到版本库后代码仍然有改动、
     
     
    分支管理:
    创建分支:git branch (branchname)
    切换分支:git checkout(branchname)
    合并分支到当前分支上(在更新过程中也行会因为冲突出现报错,本地解决冲突后提交代码):git merge (branchname)
    合并分支的某个文件到当前分支上: git checkout --patch A分支 f 文件  
    创建新分支并立即到该目录下:git checkout –b(branchname)
    删除分支:git branch –d(branchname)
    重命名分支:git branch -m devel develop
     
    (创建分支用来备份代码)
     
    查看远程分支:git branch –a
    删除远程分支:git push origin --delete (branchname)
    强推覆盖代码:git push -f
    推送本地分支到远程:git push origin (branchname)
    跟踪远程分支并推送:git push --set-upstream origin (branchname)
    重命名本地分支:git branch -m (old) (new)
     
     
    查看提交历史:  
    列出历史记录:git log
    列出前两次提交记录:git log -2
    查看某个作者的日志: git log --author="John"
    历史记录简洁版本:git log --oneline --decorate
    什么时候出现了分支、合并:git log –-oneline –grash
    逆向显示所有日志:git log --reverse --oneline
    回退到某个版本:git reset --hard 版本号
    回退到某个版本并保存工作区修改:git reset --soft 版本号
     

    删除未监视的文件untracked files

    # 删除 untracked files
    git clean -f

    # 连 untracked 的目录也一起删掉
    git clean -fd

    # 连 gitignore 的untrack 文件/目录也一起删掉 (慎用,一般这个是用来删掉编译出来的 .o之类的文件用的)
    git clean -xfd

    # 在用上述 git clean 前,墙裂建议加上 -n 参数来先看看会删掉哪些文件,防止重要文件被误删
    git clean -nxfd
    git clean -nf
    git clean -nfd

     

    GIT 标签(tag)操作

          # 查看标签
            git tag 或者 git tag -l
           # 查看标签版本信息
            git show [tagname]
     
            # 打标签(当前分支的当前版本)
            git tag -a 'V1.0.0' -m '1.0版本'
            # 打标签(当前分支的某个历史提交版本)
            git tag -a 'V1.0.0' 4f96b167c52a858492bf65be3635d970727c0316 -m '1.0版本' 
            --参数a即annotated的缩写,指定标签类型,后附标签名。参数m指定标签说明,说明信息会保存在标签对象中。
     
            # 删除标签
             git tag -d V1.0.0
             git push origin :refs/tags/v1.01    # 删除远程标签(就像git push origin :branch_1 可以删除远程仓库的分支branch_1一样, 冒号前为空表示删除远程仓库的tag)
     
            # 切换标签
            git checkout [tagname]
     
            # 标签发布
           git push origin [tagname]
           git push origin tags    # 将本地的标签一次性提交到 git 服务器
     
    GIT cherry-pick 用法
     
    cherry-pick:会重演某些commit, 即把某些commit的更改重新执行一遍。
    案例:比如 A 是一个项目的版本分支,B 是另一个项目的版本分支。这时候想要把 B分支 的某个功能合并到 A 分支上,又不想全部合并,就要用到 cherry-pick 了。
    用法:git cherry-pick [某个提交的id号]
    tips:id 号可以通过 git log -2 获得,获取上两次的提交记录。

    cherry-pick 不仅可以用在不同分支之间, 还可以用在同一个分支上。
    同一分支用法也是一样的, 同一分支使用情形:比如说你在某一个向某个分支中添加了一个功能, 后来处于某种原因把它给删除了,然而后来某一天你又要添加上这个功能了, 这时候就可以使用cherry-pick把添加那个功能的commit, 再重演一遍.

     
    GIT解决 pull 冲突情况
    冲突情况:本地进行了修改,想要 push 或 pull  的时候,别人已经提交,导致内容冲突,push 或者 pull 失败。
     
    解决方法1(常见):
    利用一些工具,比如 小乌龟、IDEA 等,打开冲突的文件。先要了解,冲突的产生是因为你和别人修改了同一行的代码,导致 git 无法识别到底认可谁的代码,导致冲突。所以,解决冲突的途径无非三种:要你的代码;要他的代码;你们两个的代码都要!之后,把修正后的代码。重新提交。然后再 pull 或者 push 就好了。
     
    解决方法2:
    通过git stash
     git stash
     git pull
     git stash pop
    通过git stash将工作区恢复到上次提交的内容,同时备份本地所做的修改,之后就可以正常git pull了,git pull完成后,执行git stash pop将之前本地做的修改应用到当前工作区。
    git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中。
    git stash pop: 从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复。
    git stash list: 显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复。
    git stash clear: 清空Git栈。此时使用gitg等图形化工具会发现,原来stash的哪些节点都消失了。
     
    解决方法3:
    放弃本地修改
    git reset --hard
    git pull
  • 相关阅读:
    Plotagraph软件五分钟光速速成傻瓜教程
    QT插件+ROS 2 新建项目
    QT插件+ROS 1 安装配置
    GitHub 优秀的 Android 开源项目 (精品)
    ROS的launch文件
    编写第一个 Shell 脚本
    CMake 入门实战
    ROS 创建服务和请求
    ROS 小乌龟测试
    【转】C++中的虚函数的实现
  • 原文地址:https://www.cnblogs.com/jmcui/p/6895917.html
Copyright © 2020-2023  润新知