Git入门指南

  • A+
所属分类:有好物
摘要这一篇文章会简单介绍一下Git的相关操作, 包括Git的配置, Git的基础操作和Git的分支管理.

简介

这一篇会介绍关于Git的相关操作. 包括基础的Git的简单配置, SSH的关联设置. 会介绍一次完整的Git的操作, 包括add, commit和push. 同时, 我们会介绍Git中的分支的内容.

 

参考链接

 

Git的简单配置

Git的本地配置

使用git config -l来查看git的相关配置信息. 所有的这些配置信息, 都会存储在主目录的隐藏文件.gitconfig中. 我们也可以对这个配置文件直接进行手动的修改.

如果使用github, 这里就可以写上github的邮箱号和用户名.

克隆仓库到本地

我们使用git clone + (仓库地址)即可克隆仓库到本地. 下面是一个简单的例子. 后续会基于这个例子进行.

  1. git clone https://github.com/wmn7/ML_Practice.git

当我们克隆一个远程仓库到本地, 本地仓库会自动关联这个远程仓库. 使用git remote -v可以查看本地仓库所关联的远程仓库的信息. 在github上, 主机名就是这个仓库地址.

Git入门指南

 

添加SSH关联授权

为了避免每次输入账号密码的麻烦, 我们可以在系统中创建SSH公钥和私钥. 并将公钥放在Github(或是GitLab等其他托管的地方)指定位置, 这样既可以生成Git账户对于当前系统的Git授权.

首先我们在终端执行ssh-keygen命令, 生成公私钥对. 公私钥对放在主目录的隐藏目录.ssh下. 点击进去可以看到有两个文件, 如下所示:

Git入门指南

我们将id_rsa.pub中的公钥内容复制出来, 在Github(或是GitLab等其他托管的地方)中添加公钥(一般的操作是Setting->SSH Keys->New SSH Key). 添加完毕之后, 我们可以进入我们要克隆的仓库, 找到SSH的链接, 接着使用git clone (SSH 链接)即可.

Git入门指南

 

关于上传新的仓库

我们可以现在github上新建一个仓库, 再把本地的文件push上去. 具体的方法如下所示:

  1. cd existing_folder
  2. git init
  3. git remote add origin url
  4. git add .
  5. git commit -m "Initial commit"
  6. git push -u origin master

 

关于.gitignore的说明

在我们写代码的时候, 总会出现一些不需要上传到仓库的代码, 缓存文件等. 这个时候就可以创建一个.gitignore(忽略文件)将这些不需要上传的文件进行忽略. 忽略文件的名称是.gitignore, 他会被存放在仓库的主目录下. 关于一些常见的忽略文件, 可以查看链接, gitignore

我们也可以通过vscode的插件, gitignore来完成相关文件的生成.

Git入门指南

安装完毕之后, 使用Ctrl+Shift+P打开命令, 搜索Add gitignore.

Git入门指南

之后选择语言, 进行添加即可.

Git入门指南

 

关于Watch, Star和Fork

首先我们介绍一下下面的三个标志.

Git入门指南
  • Watch, 点击Watch之后, 会对一个仓库进行关注, 仓库更新可以在首页得到消息.
  • Star, 类似与收藏的功能, 觉得这个项目好, 就可以使用Star.
  • Fork, 点击fork, 可以克隆一个完全一模一样的仓库到自己的账号上, 包括所有的分支和提交等. 但是当原来的仓库版本发生改变, 是不会自动同步到自己克隆的仓库中去的.

 

Git的基础操作

在这一部分, 我们会完成一次从本地仓库修改代码, 提交并推送到远程仓库的操作. Git的整体的操作流程如下图所示, 其中:

  • Working Directory: 工作区
  • Staging: 暂存区
  • Local Repository: 本地的仓库, 版本区.
  • Remote Repository: 远程仓库
Git入门指南

查看仓库状态-git status

进入仓库目录, 使用git status查看整个仓库的状态. 此时没有需要提交的文件.

Git入门指南

此时我们对仓库里的文件进行一些小的修改, 这一步是在工作区中进行的. 修改完毕之后再次使用git status进行查看状态.

Git入门指南

可以看到有需要git add的内容.

 

添加修改到暂存区-git add

于是, 我们按照上面的提示, 使用git add (文件名)把新增文件添加到暂存区. 接着我们再次使用git status来查看仓库状态.

Git入门指南

如果有很多文件需要添加, 可以使用git add .来全部添加到暂存区.

 

撤销暂存区的修改-git reset

如果我们有些修改添加错了, 需要撤销暂存区的修改, 可以使用git reset -- 文件名, 或是git rm --cached 文件名即可. 可以看到撤销之后所有内容又回到了工作区. 可以看到git status中会有提示需要进行git add.

Git入门指南

如果需要撤销全部的修改, 可以使用git reset --, 此时不需要后面的文件名.

 

比较修改内容-git diff

当我们想要查看文件修改的地方的时候, 可以使用git diff的命令.

  • git diff, 可以查看工作区被跟踪的文件修改情况.
  • git diff --cached, 查看暂存区内修改的情况(也就是在git add .之后进行查看不同)

 

提交版本-git commit

接着我们执行git commit将暂存区的修改提交到本地仓库, 版本区. 这个时候会生成一个新的版本. 我们需要使用选项-m来提供相应的备注. 例如, git commit -m 'generate mosaic image'

Git入门指南

提交后, 暂存区的修改被清空.

 

查看分支信息-git branch

在提交之后, 我们可以来查看全部的分支信息, 使用git branch -avv. 会得到如下的结果:

Git入门指南

下面我们一一来解释一下:

  • 第一行, 开头的星号表示所在的分支, 后面是版本号. 中括号内的内容, 表示此分支的远程分支的名字, 冒号后面的内容表示本地分支领先远程分支一个提交. 最后就是commit时的备注信息.
  • 第二行, 是git的信息指针, 指向远程的master分支.
  • 第三行, 是远程分支的信息.

 

查看提交的历史-git log

我们可以使用git log来查看版本区的提交历史. 有以下的一些常见的用法.

  • git log 分支名, 查看某个分支的提交历史, 不写分支名查看当前所在的分支.
  • git log --oneline, 一行显示提交历史.
  • git log -n, 查看最近n次的提交.
  • git log --author 贡献者名字, 查看指定贡献者的提交记录.
  • git log --graph, 提示法显示提交历史.

我们看一下git log --graph最后的效果, 前面的十六进制就是提交的版本号, 每个提交都有自己独特的版本号.

Git入门指南

 

将本地仓库提交到远程-git push

最后一个环节, 是将本地新增的提交推送到远程仓库中. 他的命令是git push. 此命令会把本地仓库master分支上的新提交推送到远程仓库同名的分支上. 因为现在本地所在的分支就是master, 远程也是, 所以直接更新远程的仓库.

这里在使用git push的时候, 会要求输入账号和密码, 按要求进行输入即可.

Git入门指南

当push成功之后, 我们再使用git branch -avv来查看, 可以看到此时本地分支和远程分支的版本号是一样的.

Git入门指南

 

版本回退-git reset

如果发现我们提交的内容有问题, 我们可以选择重新走一遍上面的流程, 及修改, git add, git commit, git push. 我们也可以撤销最近的一次提交.

我们使用git reset --soft HEAD^来撤销最近的一次提交, 将修改返回到暂存区. 其中HEAD^表示撤销一次提交, HEAD^^表示撤销两次提交.

但是一旦本地的版本回退之后, 本地仓库和远程仓库会在提交版本上有冲突. 这是因为撤回是在本地撤回的, 这个时候再需要将本地的推送到远程, 需要增加一个参数, -f, 表示force, 即强制推送. git push -f.

 

回退到某个版本-git reflog

在本地仓库中, 会记录每一次提交的版本. 这个只记录在本地的仓库中, 一旦本地仓库删除, 记录就会消失. 我们可以使用git reflog来查看提交的历史.

Git入门指南

可以看到这里记录了两次操作, 分别是git clone和git commit的操作.

如果想要回退到某个版本, 我们可以根据上面每一行HEAD的信息, 使用git reset --hard HEAD@{0}来退回到指定的版本.

 

Git的分支管理

刷新分支目录

有的时候我们需要看一下远程哪些分支被merge了, 现在还有哪些新的, 可以使用下面的命令.

  1. git remote update origin --prune

 

刷新本地的分支信息-git fetch

有的时候, 我们需要把远程仓库的分支信息拉取到本地仓库中, 这个时候需要使用git fetch. 该命令只是刷新保存在本地的远程仓库的信息.

例如现在远程的仓库有了更新, 本地还没有更新. 我们使用git fetch更新一下. 可以看到先在本地的分支落后远程的分支一个版本.

Git入门指南

 

更新本地分支内容-git pull

上面的git fetch只是刷新在本地的远程分支的信息. 如果想要使得本地的分支是最新的, 就需要使用git pull命令来拉去远程分支到本地.

如果上面使用了git fetch, 也可以直接使用git rebase origin/master来实现本地的分支的更新. 下面我们使用git rebase来进行本地仓库的更新, 可以看到跟新后本地和远程的版本号就是一样的了.

Git入门指南

 

创建和切换新的本地分支-git branch/git checkout

分支在多人开发中有着很大的作用. 例如现在有一个项目, 需要有两个版本进行测试, 测试的内容显然不可以直接在正式的分支上进行修改. 所以我们需要创建新的分支来存放不同版本的代码. 一般情况下, 不同的团队成员都在自己的分支上进行修改, 然后向master提交PR(pull request).

首先我们在主目录下可以查看分支的信息, 使用git branch来查看分支信息.

Git入门指南

接着执行git branch 分支名可以创新新的分支. 可以看到下面创建完成之后, 再次查看可以看到我们刚刚创建的分支.

Git入门指南

接着我们使用git checkout 分支名来进行分支的切换. 可以看到现在我们成功切换到了dev这个分支上面. 需要注意的, 新建分支没有跟踪任何远程的分支, 所以不像master分支那样会有蓝色的远程分支的名字.

Git入门指南

我们也可以使用git checkout -b 分支名, 来创建分支并切换到新的分支.

 

提交新的分支-git push

现在我们在新的分支上修改内容, 再次使用git status来进行查看. 可以看到是在dev分支上. 我们对修改的内容进行提交.

Git入门指南

现在我们需要把我们新的分支提交到版本区, 我们使用git push 主机名 本地分支名:远程分支名, 如果远程分支不存在, 就会自动进行创建. 如果本地分支名和远程分支名是一样的, 就可以进行省略. 可以写成下面的形式, git push 主机名 本地分支名

下面我们首先来提交一下这个分支.

Git入门指南

我们提交一下我们这个分支, 接着来查看一下. 可以看到此时远程分支的信息已经存在了.

Git入门指南

这个时候再看GitHub的页面, 就可以看到一个多的的分支的选择了.

Git入门指南

 

新的分支与远程分支关联

上面我们在查看分支信息的时候, 可以看到新的分支并没有和远程的分支关联. 即没有中括号里面蓝色的内容. 我们可以使用git branch -u [主机名/远程分支名] [本地分支名]来将本地分支与远程分支进行关联. 可以看到下面就是成功关联了.

Git入门指南

同样, 我们也可以在push的时候就自动追踪远程的分支. 使用git push -u 主机名 本地分支名:远程分支名.

 

删除远程分支

我们可以使用git push 主机名 :远程分支名来进行删除, 这个命令是将空分支推送到远程, 这样也就把分支删除了.

另一个删除远程分支的命令是, git push 主机名 --delete 远程分支名, 来进行删除.

Git入门指南

此时只是删除了远程的分支, 本地分支还没有被删除.

Git入门指南

 

本地分支的更名与删除

上面我们删除了远程分支, 这里我们将本地的分支也删除. 需要注意的是, 不能删除所在的分支, 所以我们需要先使用git checkout来进行分支的切换, 再进行删除. 我们使用git branch -D 分支名来进行本地的分支的删除.

Git入门指南

 

多人协作的Git部分

下面介绍一下完整的多人合作的时候应该如何来做. 下面要讲的是使用fork的方法. 当然我们也可以不fork, 直接克隆主仓库, 然后创建自己的分支, 在自己的分支上进行修改和提交. 最后从自己的分支向master进行PR.

克隆仓库到本地并进行修改

  • 首先我们需要fork一个官方的仓库.
  • 接着我们以成员的身份将其克隆到自己的本地.
  • 之后我们就在我们克隆的仓库中进行修改.

 

提PR和检查合并PR

在我们完成修改之后, 应该如何将新的仓库提交到组长的仓库呢. 这里就需要使用pull request方法. 我们稍微介绍一下PR的过程. 创建一个PR就是从甲分支向乙分支提一个请求, 这个请求中有一个或者多个提交. 要是乙觉得没有问题, 就可以进行合并(merge). 这个整个过程就是PR.

Git入门指南

 

同步主仓库

作为组员, 我们需要保证自己的master分支和组长是一样的, 这样可以避免在PR的时候出现问题. 那么我们首先使用git remote来增加一个关联主机. 完整的命令是, git remote add 主机名 主仓库地址. 一般主机名使用up, 只需要不是origin重复即可.

在增加之后我们再次查看, 可以看到此时就会多出两个地址.

Git入门指南

之后我们就使用之前学过的fetch来拉取远程仓库的信息. git fetch 主机名. 如果在git fetch的时候出现报错, fatal: Authentication failed for, 很可能是我们账号密码输错了. 在Windows中, 可以在设置中搜索凭据管理, 把密码删掉后重新进行输入即可.

Git入门指南

在拉取信息之后, 我们需要同步主仓库. 有下面两种方法:

  • git pull --rebase up master, 这一种方法是包含git fetch的
  • git rebase up/master

所以, 相当于是git pull --rebase up master = git fetch + git rebase up/master. 在完成主仓库的同步之后, 可以继续修改自己的master分支, 最后一起提交到远程仓库.

 

一些报错

fatal: The remote end hung up unexpectedly

这个可能是由于推送的文件太大, 我们可以通过修改config文件来解决问题.

打开仓库所在目录, 显示隐藏文件可见.

打开并编辑config文件, 在最后加上下面的内容即可.

  1. [http]
  2.     postBuffer = 524288000

参考链接, Git:解决报错:fatal: The remote end hung up unexpectedly

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: