美文网首页
git 使用注意点

git 使用注意点

作者: 前行的乌龟 | 来源:发表于2019-01-11 00:01 被阅读65次

    平时看高玩们操作 git 时眼花缭乱的,可是非常羡慕的,git 不用工具,用命令行,在外人看来,这可是老高端的了,非常装逼,所以推荐大家学习,熟练掌握 git

    这里我记录 git 中需要注意的部分,基础部分请 baidu

    ps: 19.1.10 重新整理,上一篇已删除


    工作区和版本库

    工作区和版本库用文字描述不容易裂理解,大家看图



    一张图,道尽所有~


    撤销修改

    撤销操作我们时不时会碰上,撤销包括:

    • 撤销工作区的修改 -> 代码改了但是还没 add
    git checkout -- app/src/main/java/com/bloodcrown/bw/screenauto/HeightActivity.kt
    
    • 撤销暂存区的修改 -> add 了但是还没 commit
    git reset HEAD app/src/main/java/com/bloodcrown/bw/screenauto/HeightActivity.kt
    
    • 返回上一次提交 -> commit 了,回滚到上一次 commit
    // 回滚一个版本
    git reset --hard HEAD^
    // 回滚任意个版本
    git reset --hard HEAD~1
    

    需要注意的是啊,撤销工作区和暂存区操作,具体到某一个文件时,该文件必须使用全路径名,我用文件名+后缀的方式,死活也跑步过去

    checkout 还可以用来恢复被删除的文件,但是前提是这个文件得再暂存区或是版本库里面有才行


    文件差异对比

    我们有时会对比某个文件和版本库里面的差异

    git diff HEAD -- app/src/main/java/com/bloodcrown/bw/screenauto/HeightActivity.kt
    

    还是得注意,文件需要使用全路径名
    ![(https://img.haomeiwen.com/i1785445/cd53bd517ab32f70.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

    --- 号:代表 HEAD 版本库中的代码
    +++ 号:代表工作区中的代码


    合并分枝的3种方式

    • fast-forward 快速合并
    • --no-ff 非快速合并
    • --squash 压缩 commit 合并

    下面有张图,解释的比较清楚:


    fast-forward

    git 直接把HEAD指针指向合并分支的头,完成合并。属于“快进方式”,不过这种情况如果删除分支,则会丢失分支信息。因为在这个过程中没有创建 commit

    我们在 2 个分枝中修改是同一个文件,那么默认的 merge 合并就是 fast-forward 类型的

    典型的特征是

    git checkout -b dev后,在dev分支做了修改,提交了好几个commit。git checkout master,然后git merge dev。此时没有冲突,快速合并成功。
    但是:我们在dev分支中的commit记录都没有了!!!

    特别注意的是, fast-forward 方式其实明没有真正的合并代码,而是把一个分枝指向合并分枝的commit 操作,这样的坏处时,若我们再合并后把 dev 分枝删了,那么会影响 master 中的代码

    --no-ff
    git merge --no-ff -m '禁用fast-farword合并' dev
    

    我们再合并时做一个提交,这样代码就在 master 分枝中保存了一份,我们就可以 删除 dev 分枝了,但是会把 dev 分钟的各种 commit 记录带到 master 中,我觉得 master 分枝不关心 dev 分枝中的具体 commit ,关心的是合并 commit ,就像代码封装一样,manage 管理类不必关心其中工具类的具体实现

    squash

    $ git merge --squash another
    $ git commit -m "message here"
    

    squash 方式,不会把 dev 分枝的 commit 记录带到 master 分枝中,使用 --squash 合并后,会把代码的不同合并之后添加到 暂存区,需要我们手动 commit 一次,这里我们写 dev 合并到 master 。好处是不影响 master 分枝的提交记录,这样在我们以后梳里提交历史时会很干净,不会有其他分提交历史干扰

    我们看个例子:

    1. 先创建一个名叫 test 的分枝,提交2次,log 日志如下:


    2. 然后我们使用 squash 把 test 分枝合并到 master 分枝,然后 commit 此次合并,然后看 master 分枝的 log:


    看的很清楚,test 分枝的提交记录不会再 master 分枝中看到,这种方式其实才是我们大部分时候需要的


    分枝操作

    查看分支,绿色的是当前分支

    git branch -a  
    

    删除分支

    git branch -d xxx 
    

    新建并切换到分支

    git checkout -b xxx  
    

    切换分支

    git checkout xxx  
    

    若是我们的本地仓库没有和远程仓库关联,使用 remote 命令关联远程仓库

    git remote add origin https://github.com/WuXiaolong/WeWin.git  
    

    比如我们提交本地代码到 github 时,会涉及到 ssh 密钥一些替他问题,具体的请看:

    此时我们的本地仓库已经和远程仓库关联起来了,比如远程仓库里面有一个分枝,我们想拉下来到本地

    本地没有这个远程分枝时

    git checkout origin/remoteName -b localName 
    

    本地有这个远程分枝时

    git pull orign devolp:zhangbin
    

    反过来我们要提交一个分枝到远程,远程此时没有这个分枝

    git push orign zhangbin:devolp
    

    删除远程分支,:左边的本地分支为空,那么将删除:右边的远程的分支

    git push origin :test
    

    打 tag

    git tag v0.0.1 //创建本地tag
    git tag -d v0.0.1 //删除本地tag
    git tag -a v0.0.1 -m "version 0.0.1"  // 创建tag并添加备注信息
    git push origin v0.0.1:v0.0.1  //提交本地分支
    

    reset 三种用法

    reset HEAD 我们可以回滚版本,其实 reset 也是有多种限定符可用的

    • git reset (–mixed) HEAD~1
      回退一个版本,且会将暂存区的内容和本地已提交的内容全部恢复到未暂存的状态,不影响原来本地文件(未提交的也不受影响)
    • git reset –soft HEAD~1
      回退一个版本,不清空暂存区,将已提交的内容恢复到暂存区,不影响原来本地的文件(未提交的也不受影响)
    • git reset –hard HEAD~1
      回退一个版本,清空暂存区,将已提交的内容的版本恢复到本地,本地的文件也将被恢复的版本替换

    stash 保存暂存区

    stash 命令也是我们常用的,比如领导让赶紧改一个 bug ,但是我们正在新的分枝开发代码呢,代码这时写到一半,我不想提交一个没意思的 commit 上去怎么办,那就得用 stash 来把暂存区保存下来

    保存暂存区

    git stash save "测试 stash"
    

    查看暂存区保存记录

    git stash list
    

    恢复暂存区保存的代码

    git stash pop
    

    删除某一个暂存区保存记录,后跟这个记录对应的编号

    git stash drop stash@{1}
    

    删除某一个暂存区保存记录

    git stash clear
    

    参考:

    相关文章

      网友评论

          本文标题:git 使用注意点

          本文链接:https://www.haomeiwen.com/subject/kbvzrqtx.html