Git命令和操作的学习及在线练习


标题: Git命令和操作的学习及在线练习
作者: 梦幻之心星   sky-seeker@qq.com
标签: [Git, 版本控制]
目录: [软件]
日期: 2020-07-18

  • Git是一种分布式版本控制系统
    Git Flow模型图

基础知识

  • Git 的三个分区和文件的三种状态
    Git基本命令

    分区 用途 对应的文件状态
    工作区 存放代码文件 modified
    暂存区 临时存放代码文件 staged
    本地库 存放历史版本信息 committed

本地操作

Git基本操作

创建仓库

  • git init 将当前的目录转换成一个仓库
  • git init <directory> 命令用于在指定目录创建名为 的空仓库
  • git init --bare <directory> 命令用于创建一个没有工作目录的裸仓库。裸仓库以 .git 结尾,作为储存代码的中央仓库。
    • git init --bare my-project.git命令创建了一个用于代码共享的裸仓库。

添加

  • git add 命令将工作区的文件添加到暂存区。可以通过修改.gitignore文件来设置不需要添加的文件。

提交

  • git commit命令将暂存区的文件提交到本地库。
  • git commit -m "comment"命令在提交时进行说明,说明改动的内容或原因。
  • git commit --amend命令把新的内容添加到之前的提交里面,这样就还是同一条提交日志信息。

状态

  • git status命令用于查看状态。

日志

  • git log命令用于查看提交日志,从近到远显示每次提交的评论、作者、日期等信息。
  • git reflog命令用于查看命令日志。
  • commit 后面的编号,是每次历史记录的一个索引。如果需要对版本进行前进或者后退的时候,就需要用到它。

重置

  • git reset命令用于将当前版本回退到选定的版本。

  • 重置的方法

    git reset HEAD^^^   //向上返回3代
    git reset HEAD~~~   //向上返回3代
    git reset HEAD~3    //向上返回3代
    git reset <提交号>   //重置到指定提交号
    
  • 重置有三种模式:hardsoftmixed

  • 默认使用混合重置(mixed)模式

硬重置

  • git reset --hard <提交号>命令将工作区、暂存区、本地库都重置到这个选定的版本上。
  • 整体状态直接重置到特定提交之前的状态。
  • 效果看起来等同于清空暂存区和工作区。
    git reset --hard <提交号>

软重置

  • git reset --soft <提交号>命令将本地库重置到这个选定的版本上,保留工作区、暂存区的中的内容。
  • HEAD 移至指定的提交,而不会移除该提交之后加入的修改。
  • 效果看起来就是工作目录的内容不变,暂存区原有的内容也不变,只是原节点和Reset节点之间的所有差异都会放到暂存区中。
    git reset --soft xxx

混合重置

  • git reset --mixed <提交号>命令将暂存区、本地库重置到这个选定的版本上,保留工作区中的内容。
  • 效果看起来就是原节点和Reset节点之间的所有差异都会放到工作目录中。

还原

  • git revert命令用于撤销修改。通过对特定的提交执行还原操作,会创建一个包含已还原修改的新提交。
    git revert

高级操作

拣选

  • cherry-pick <提交号> 命令用于复制特定分支的某个提交到活动分支。
  • cherry-pick <提交号> <提交号> 命令用于复制特定分支的多个提交到活动分支。
    cherry-pick

恢复

  • git checkout [file]命令恢复暂存区的指定文件到工作区。
  • git checkout .命令恢复暂存区的所有文件到工作区。
  • git checkout [commit] [file]命令恢复指定提交的指定文件到暂存区和工作区。

本地栈式提交

  • 用于修改提交的评论
  • git rebase -i HEAD~3+git commit --amend+git rebase -i HEAD~3
  • git cherry-pick <提交号>+git commit --amend+git cherry-pick <提交号>

标签

  • git tag <标签号> <提交号>命令用于为指定提交号创建一个标签
  • git tag -a <标签号> -m <提交信息> <提交号>命令用于为指定提交号创建一个带有说明的标签
  • git tag -d <标签号>命令用于删除一个标签
  • git push origin <标签号>命令用于推送某个标签到远程仓库
  • git push origin --tags命令用于推送全部尚未推送到远程仓库的本地标签
  • git push origin :refs/tags/<标签号>命令用于删除远程仓库中的指定标签

描述

  • Git Describe <ref> 命令用于查找离最近的锚点(标签)
  • git bisect 命令用于查找产生 Bug 的提交记录
  • <ref> 可以是任何能被 Git 识别成提交记录的引用,未指定时,以目前所检出的位置(HEAD)为默认位置。
  • 执行Git Describe 命令后输出的结果:
    <tag>_<numCommits>_g<hash>
    
  • tag 表示的是离 ref 最近的标签, numCommits 是表示这个 reftag 相差有多少个提交记录, hash 表示的是所给定的 ref 所表示的提交记录哈希值的前几位。

远程交互

Git基本流程

推送

  • git push命令将本地库的数据推送到远程库。

克隆

  • git clone命令将远程库的数据拷贝到本地库。

拉取

  • git pull命令将远程库的数据拷贝到本地库,然后自动合并到本地分支中。
  • 实际上是git fetchgit merge两个命令合成了一个。
    git pull

获取

  • git fetch命令将远程库的数据拷贝到本地库,但是工作区中的文件没有更新。
    git fetch

变基

  • git rebase命令将当前分支的提交复制到指定的分支之上。
  • 变基的作用更多的是来整合分叉的历史。
    git rebase
  • 变基与合并有一个重大的区别:Git 不会尝试确定要保留或不保留哪些文件。执行 rebase 的分支总是含有想要保留的最新近的修改!这样不会遇到任何合并冲突,而且可以保留一个漂亮的、线性的 Git 历史记录。

高级操作

交互式变基

  • 交互式变基指的是使用带参数 --interactiverebase 命令, 简写为 -i
  • git rebase -i HEAD~3 命令用于修改最近 3 条提交。
  • 交互式变基在当前开发的分支上想要修改某些提交时会很有用。
    交互式变基
  • rebase 的提交上,可以执行以下 6 个动作:
    • reword:修改提交信息;
    • edit:修改此提交;
    • squash:将提交融合到前一个提交中;
    • fixup:将提交融合到前一个提交中,不保留该提交的日志消息;
    • exec:在每个提交上运行我们想要 rebase 的命令;
    • drop:移除该提交。

远程跟踪

  • git checkout -b <本地分支名> o/<远程分支名>
  • git branch -u o/<远程分支名> <本地分支名>

关联远程仓库

  • git remote add origin <url>命令用于关联远程仓库
  • git push -u origin master命令用于关联远程仓库并进行第一次推送

同步仓库的分支

同名指定分支
  • git push <remote> <place>命令用于同步本地仓库到远程仓库的指定分支。
  • git fetch <remote> <place>命令用于同步远程仓库到本地仓库的指定分支。
  • git push origin master,这个命令的作用是切换到本地仓库中的master分支,获取所有的提交,再到远程仓库origin中找到master分支,将远程仓库中没有的提交记录都添加上去。
不同名指定分支
  • git push origin <source>:<destination>命令将来源和目的地不同的分支同步到远程仓库。
  • 如果要推送到的目的分支不存在,Git 会在远程仓库中根据提供的名称自动创建分支。
  • git fetch origin <source>:<destination>命令将来源和目的地不同的分支同步到本地仓库。
  • 如果要推送到的目的分支不存在,Git 会在本地仓库中根据提供的名称自动创建分支。
删除远程仓库中的分支
  • git push origin :<destination>命令来源分支为空,会删除远程仓库中的目的地分支。
创建本地仓库中的分支
  • git fetch origin :<destination>命令来源分支为空,会在本地仓库中创建一个新分支。
Git pull 的参数
  • git pull origin foo 相当于:git fetch origin foo+git merge o/foo

  • git pull origin bar~1:bugFix 相当于:git fetch origin bar~1:bugFix+ git merge bugFix

分支管理

查看分支:

  • git branch命令用于列出当前所有分支。
  • git branch -v 能够显示更多信息。

创建分支:

  • git branch <branchName>命令用于创建分支
  • git branch <branchName> <提交号> 命令用于创建分支并关联到对应的提交号
  • git branch -f <branchName> <提交号> 命令用于强制移动分支到对应的提交号
  • git checkout -b <branchName> 命令用于创建并切换分支

切换分支:

  • git checkout <branchName>命令用于切换分支
  • git checkout <提交号>命令用于切换到对应的提交号
  • git checkout HEAD^2命令用于指定提交记录的某个父提交

合并分支:

  • git merge <branchName>命令用于合并分支
  • Git 可执行两种类型的合并:fast-forwardno-fast-forward

快速合并

  • 在当前分支相比于要合并的分支没有额外的提交时,可以执行 fast-forward 合并。这类合并不会创建新的提交,而是会将正在合并的分支上的提交直接合并到当前分支。Git 优先执行这种合并方式。
    640

非快速合并

  • git merge --no-ff <branchName>命令用于禁用快速合并
  • 在当前分支上提交想要合并的分支不具备的改变,那么 git 将会执行 no-fast-forward 合并。这类合并会在当前活动分支上创建新的合并提交。这个提交的父提交指向这个活动分支,也指向想要合并的分支。
    640 (1)

手动合并

  • 想要合并的两个分支的同一文件中的同一行代码上有不同的修改,或者一个分支删除了一个文件而另一个分支修改了这个文件时,此时就需要手动合并冲突。
    640 (2)

Git 属性

  • 可以用 Git 属性指示 Git 识别二进制文件以及如何处理特定格式的文件

识别二进制文件

  • 如指定 Git 把所有pbxproj文件当成二进制文件,添加下面的行到 .gitattributes 文件:
    *.pbxproj binary
    

比较二进制文件

  • 方法1:使用工具把二进制文件转化为纯文本格式,再使用 diff 命令进行文本对比。
  • 方法2:从二进制文件中获取元数据,再使用 diff 命令对元数据进行对比。

Word文档

  1. 安装 pandoc
  2. 添加下面的行到 .gitattributes 文件
*.doc diff=pandoc
  1. 添加下面的行到 .git/config 文件
[diff "pandoc"]
  textconv=pandoc --to=markdown
  prompt = false

图像文件

  1. 安装 exif
  2. 添加下面的行到 .gitattributes 文件
*.jpg diff=exif
  1. 添加下面的行到 .git/config 文件
[diff "exif"]
textconv = exiftool

注意事项

  • 在一个Git库中可以有多个gitattributes文件
  • 同一个gitattributes文件中,按照行的先后顺序,后序的设置覆盖前序
  • 不同gitattributes文件中,属性设置的优先级如下所示(从高到低)
    /myproj/info/attributes
    /myproj/my_path/.gitattributes
    /myproj/.gitattributes
    

练习 Git

  • Learning Git Branching 项目是学习 Git 的在线练习平台。
  • 开源项目地址:https://github.com/pcottle/learnGitBranching
  • 教程网站地址:https://learngitbranching.js.org
    640
  • 所有 Git 分支都被可视化,只需要在左侧的命令行输入 Git 命令,分支会进行相应的变化。每次 commit 都抽象成树的节点,用动画闯关的形式,让你自由使用 Git 命令完成目标。
    640 (1)
  • 教程包含本地 Git 仓库的版本管理和远程仓库的操作,很适合初学和进阶。
    640 (2)

参考书籍

  • GitHub入门与实践-[日] 大塚弘记-人民邮电出版社-2015年7月-9787115394095

参考资料


版权声明:本文为「梦幻之心星」原创,依据 CC BY-NC-SA 4.0 许可证进行授权,转载请附上原文出处链接及本声明。


博客园地址:https://www.cnblogs.com/Sky-seeker

微信公众号:关注微信公众号,获取即时推送
微信名:梦幻之心星 微信号:Sky-seeker


posted @ 2020-07-17 19:00  梦幻之心星  阅读(664)  评论(0编辑  收藏  举报