git学习笔记

一世执手 提交于 2020-02-27 13:10:08

本笔记为本人作为一个菜鸟入门git的学习笔记,参考了以下资料:

  • git官方的tutorial——Git的一个入门教程,在命令行中输入git help tutorial即可查看该教程。
  • git的git everyday教程——列举了git常用的最小命令集(20个左右的命令),在命令行中输入git help everyday即可查看该教程
  • git简易指南——git入门的一些常用命令讲解
  • 及下面提到的博客

1.安装部署git

  1. 首先,如果你试了以上命令打开官方的git入门教程发现没有该命令,提示命令没有找到,显然是因为还没有安装git,本教程工作环境为ubuntu系统,故只介绍ubuntu下的操作方法。像安装其他软件一样,在命令行中输入sudo apt install git即可安装git。(想必怎么打开命令行不需要解释了吧)

  2. github上注册账号,略

  3. 然后配置git,最简单的是执行以下命令行:

    git config --global user.name "WillsonLee"
    git config --global user.email 2742395658@qq.com
    #这一行是注释不用运行,以上双引号中为用户名;user.email之后为邮箱
    

2.从创建一个git仓库开始

  1. 在你的工作目录中新建一个目录用于存放该项目,如mkdir learn-Git新建一个learn-Git项目

  2. 进入文件夹,初始化仓库

    cd learn-Git
    git init
    
  3. 新建一个readme.md,一般在项目里该文件用于介绍该项目以及说明该项目的安装部署步骤。这里按照传统只写入一个hello git

    touch test.md
    echo "Hello,Git!" >> readme.md
    
  4. 添加文件到git并且推送到最新版本,.表示对当前目录截取快照,将所有变化保存至缓冲区;commit则将缓冲区的内容更新到当前仓库(本地)。

    git add .
    git commit -m "Test commit"
    
  5. 推送到远程仓库。上面commit只将本地仓库更新到最新,未同步远程仓库,需要使用push将本地仓库的改动同步到远程仓库。

    git push learn-Git master
    

    以上将当前项目推送到远程仓库learn-Gitmaster分支。当然前提是先配置远程服务器地址以及在远程服务器上创建该仓库。

    • 在github官网上创建一个learn-Git仓库,点击页面右上角+选择New repository,之后给该仓库一个名称learn-Git其他的选项可不设置,点击Create repository即可

      在这里插入图片描述

      在这里插入图片描述

    • 之后在命令行执行git remote add learn-Git https://github.com/WillsonLee/learn-Git.git即可添加远程库learn-Git设置其地址为https://github.com/WillsonLee/learn-Git.git(根据具体创建的仓库地址不同而异)

    • 最后执行以上同步推送命令将本地改动push到远程仓库上去,执行该命令后会提示输入账户名与密码,即github上注册的账户密码

      在这里插入图片描述

  6. 如果要从远程仓库下载,使用git clone即可

    如在另一个路径下将以上仓库克隆下来:

    git clone https://github.com/WillsonLee/learn-Git.git
    

    如果该远程仓库发生变更,可以在该本地仓库中使用git pull同步本地记录即可

    git pull
    

综上,git的基本用法如下:

  • git config --global user.name "用户名"设置全局用户名;git config --global user.email 邮箱设置全局用户邮箱
  • git config --global credential.helper store——可以使push的时候不需要每次都需要填写用户名和密码;第一次push仍然需要填写用户名和密码
  • git init——初始化当前目录,使其可被git仓库管理
  • git remote add 仓库名 远程仓库网址——添加本地仓库对应的远程仓库网址,仓库名相当于这个远程链接的名字,然后push的时候指定仓库名就可同步到对应的远程链接;另外,git remote remove可以移除远程链接,git remote -v可以查看当前所有的远程链接(比如如果是通过clone下载的仓库,会默认有一个origin仓库名对应下载的远程仓库网址,不需要自己再添加一个仓库名)
  • git add .——将当前文件夹下的变化保存至缓冲区
  • git commit -m "提交说明"——将当前缓冲区内容提交到本地仓库
  • git push 仓库名 分支名——将当前仓库变化同步至远程仓库的指定分支
  • git clone 网址——从给定网址的远程仓库克隆到本地
  • git pull——同步远程仓库到本地

基本上以上就是git的基本使用,在新机器上先配置git,然后克隆项目/pull项目,然后作出更改,最后push,通过这些命令git就相当于一个远程的同步服务器,还是没有自动同步的那种简易版本。如果仅是这样,那git的功能就非常有限了。

3.git历史变化与版本回滚

  • git status——查看当前工作区状态,是否有变化未提交到本地库,是否与远程仓库同步
  • git diff——当前状态未最新的提交之间的变化,可以查看未提交的变化;也可以指定提交id号(前几位即可,只要能区分),从而查看当前状态与指定提交id号之间的变化
  • git log——查看历史提交id号、作者、时间、提交说明
  • git reset --hard HEAD^——把当前仓库指针前移一个提交,恢复到上一次提交的状态;git reset --hard HEAD^^,回溯两次提交;git reset --hard id——跳转到指定id号的提交状态(也可以跳到将来的提交id号,只要知道id号
  • git reflog——reference log,查看引用更改日志,即HEAD的指向变动历史,HEAD是一个指针,指向当前的提交,跳转到之前(或者之后)的提交id时只是更改了HEAD指针的指向,所以可以通过该命令查看在各个提交之间跳转的历史记录

以上参考Git学习笔记:版本回滚-Big_quant。至此,可以使用git跨设备开发,以及查看变更历史与回滚等,对于个人开发应该够用了。但是如果需要多人协作则还不够。

4.多人协作

使用git进行多人协作,根据这篇博客的说法Git&Github怎么团队合作多人开发项目-bluetata,主要有以下几种合作协作方式(使用github):

  • 添加collaborators:邀请合作者的方式是项目的所有者添加合作者到自己的仓库中,添加成功后受邀者会收到一封邮件,点击链接查看项目以及选择是否接受。然后受邀者可以clone邀请者的仓库,然后本地修改,然后commit之后push到邀请者的远程仓库。这种模式下合作者几乎拥有与仓库所有者同等的权限。
  • fork & pull request:这是开源项目最常用的方式,合作者将项目拥有者的仓库fork,即产生了自己的远程仓库镜像,然后像操作自己的仓库一样——克隆到本地、修改、提交、同步到远程。当合作者认为自己完成了一部分功能或者修改了一个bug,可以向项目所有者发出pull request,然后项目所有者决定是否合并该合作者作出的更改。如果合作期间,所有者的仓库发生变动,合作者可以fetch到自己的仓库。
  • 创建team:创建一个team,在team中创建仓库,然后在team中添加成员,设置成员权限,然后成员可以参与到该仓库的修改中去。

添加了collaborators之后,如果对本地仓库作出更改,然后commit,然后push到远程仓库;但是如果合作者此时也做了更改,并且比你先一步push了,这时相当于远程仓库在你pull之后又前进了一个(或多个)commit,而你自己本地仓库也前进了几个commit,这样二者出现冲突,push将会失败(当然可以选择git push -f来强制同步到远程仓库,但是这种做法非常不建议,容易被其他合作者打死);查询网上解决冲突的方法大多是:

  • git pull,将远程仓库同步下来,然后在本地手动更改解决冲突,之后再git push。pull下来之后,内容可能变成下面的鬼样子:

    二者共同的内容

    <<<<<<< HEAD

    合作者新增的内容
    =======
    本地新增的内容

    >>>>>>> 本地最新一次commit的id号

    这是在合作者只是新增了一点内容的情况下,很简单的改动;如果合作者既有增加又有删除,甚至删除了文件,或者说合作者虽然没删除文件与内容,但是新增的内容中有多行========,而一行等于号又用于区分远程新增与本地新增,到时候哪个是哪个,就会很麻烦。

  • 另一个方法是,如果push不上去,则先git reset HEAD^回滚到分歧处(没有--hard参数,硬回滚的话同时会把自己做的改变也取消了),然后git stash将当前变化保存至stash栈,然后git pull和远程的同步,然后git diff stash比较当前库(已经与远程库同步)状态与stash的差异,然后选择性继续完成自己之前的更改,然后git commit -am "commit title"git push实现同步

  • 更简单粗暴的做法是直接备份本地文件夹,然后硬回滚到与远程没有分歧的地方,然后pull一下,然后根据备份的文件重新做出修改,最后push

  • git对冲突内容进行融合时,查了网上很多博客,都是先pull在本地手动解决冲突然后push,关键是本地解决冲突并没有一个很好的方法。我觉得可以有一个GUI的工具对要融合的两个分支进行文件差异的比对,然后对每一点差异可以由用户决定使用哪个分支的变更为准,我觉得这个应该并不难实现,不知道为什么网上一搜“git解决本地与远程冲突”都是怎么用git命令对比两个仓库分支的差异,好像对比出来就不用更改一样。

5.git分支

参考廖雪峰-git创建与合并分支

  • git branch dev——创建一个叫dev的分支(也可以叫别的)
  • git checkout dev——切换到dev分支;或者git switch dev
  • git checkout -b dev——创建并切换到dev分支;或者git switch -c dev
  • git branch——查看当前分支
  • git merge dev——将dev分支合并到当前分支
  • git branch -d dev——删除dev分支

因为git分支只是一个指针,创建、合并、删除都非常快,Git鼓励使用分支来完成具体的任务,完成后再合并到主分支。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!