美文网首页
git - 奇技淫巧

git - 奇技淫巧

作者: sunyelw | 来源:发表于2020-03-21 11:17 被阅读0次

    本文收录git的一些用法,常用or不常用
    PS: 都是命令行操作,对应IDE操作不做记录


    一、远程覆盖本地

    git reset origin/feature --hard
    

    这其实是回退操作的一种变形,reset 可以指定提交也可以指定分支,还可以指定几次HEAD~[number]

    二、rebase拉取

    git pull --rebase
    

    等价于

    git fetch origin/[branch_name] & git merge origin/[branch_name]
    

    可以设置为默认方式

    git config --global pull.rebase true
    

    三、rebase 变基

    git checkout [branch1_name]
    

    使 [branch1_name] 分支的提交基于 [branch2_name]

    git rebase [branch2_name]
    


    before

    执行命令

    git checkout feature-2 & git rebase master
    

    变成


    after

    (图片来源git rebase 使用)

    四、rebase 修改历史

    git rebase -i HEAD~[number]
    

    或指定一个提交进行rebase, 此提交之后的所有commit都会被编辑

    git rebase -i [commit-id]
    

    -i 交互式运行
    这时候从上到下就是从早到晚,修改保存以后,git就会从上到下地执行。在这个界面内,你可以做一些事情,比如:

    1. 更换提交顺序 - 编辑器内移动提交顺序
    2. 合并某些提交 - f / s
    3. 拆分某些提交 - e
    4. 修改某些提交信息

    五、提交合并

    git rebase -i [commit-id]
    

    各个命令释义


    image.png
    • p 正常应用此次提交
    • r 重写提交信息
    • e 修改本次提交(比如git commit -p可以用于拆分提交)
    • s 本次提交合并到上面(就是编辑页面的上下)一个提交中
    • fs, 不保留提交信息
    • x 暂不清楚
    • d 丢弃本次提交

    使用 sf 就可以将本次提交合并到前一次提交。

    六、其他

    • 交互式命令 -p
      add -p 选择那些需要提交(stage)
      commit -p自定义 commit (powerful!)
    • 清除uncheck文件 git clean -f
    • 清除远程已删除的分支 git remote prune origin
    • git bisect
    • git push -u 与远程分支添加连接
    • git diff [branch_name]...
      如果用2个点进行diff,会把[branch_name]的新增代码显示出来
      用3个点进行diff,只会显示当前分支与[branch_name]的最近公共祖先与当前分支的差异。

    实例1

    下面看一个使用commit -p拆分单文件提交的例子

    劝退警告!!

    注意git命令只能拆分不连续的提交,并选择接收哪些提交;如果是连续的提交,需要人工修改文件后自行提交

    首先看下提交信息


    log

    看下最新的提交内容


    commit-2

    进入交互模式

    git rebase -i HEAD~2
    

    注意, rebase 是不是不能编辑所有提交的,第一个提交是不能动的,也就是说,如果你只有两次提交,HEAD~2是不行的,最多HEAD~1

    所以我们需要再来一次提交


    commit-c

    然后就可以编辑前两次提交了


    rebase-before

    把需要拆分的提交前面操作改成eedit

    rebase-after

    保存退出.


    rebase-update

    查看状态


    rebase-status

    可以看到,状态信息告诉我们,当前正在交互式rebase,当前命令是 e d415576,下一条是pick 5bb4450,说明rebase确实是从上而下的执行命令的

    接下来我们开始拆分这次提交

    1. 首先撤销提交
    git reset HEAD~1
    
    reset-status

    这时候你可以修改这次提交。

    1. 然后交互式(-p)提交
      commit -p
      commit -p -help
    • e 编辑提交内容与提交信息
    • s 进行拆分(s选项用不了是因为你只有一段连续的修改无法拆分)
    • y 应用拆分
    • q 完成拆分

    上图中明显只有一处连续修改,故再来改一下,加三行,如下


    diff - add

    到这一步,我们阐述一下我们的需求
    总体流程是往一个文件a中添加了两次数据分别是

    x0
    x1
    x2
    

    b0
    ...
    b6
    

    现在需要把本次提交中的 x0 x1 x2 给剔除掉,那么我们继续

    再执行一下commit -p

    after-add -p

    s选项了,那么就可以进行拆分了,git会将连续的部分视为一个提交

    commit -p s
    输入提交信息
    commit-messag

    查看一下git log

    git - log

    再看下目前数据


    git - diff

    发现x0-x2已经变成了修改而不是提交了,如果你还需要这些信息作为一个新的提交,那就可以执行

    git commit -a -m "add x0-x2"
    

    这里我们选择丢弃这部分修改继续rebase

    cmd

    其实上面过程可以非常简单,直接人工修改后多段提交,看个人习惯,肯定选择自己最熟悉最有把握的方式。对于我而言,以上操作纯属炫技~~~

    如果是拆分一个提交的多个文件就更简单了,直接分段提交都不用commit -p

    本例参考连接
    git 奇技淫巧


    最后在你实际环境中使用git的时候,不可避免的会遇到冲突,需要更多的技巧与能力来帮助你解决这些冲突,也可以借助一些IDE工具,比如 IDEA 的Git 工具用来解决冲突真的是我见过对用户最为友好的方式了。

    未完待续~

    相关文章

      网友评论

          本文标题:git - 奇技淫巧

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