git使用大全

一、git简介

git使用大全_第1张图片

git使用大全_第2张图片

git使用大全_第3张图片

  • 版本控制:可以解决多人同时开发的代码问题,也可以解决找回历史代码的问题。
  • 分布式:Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。首先找一台电脑充当服务器的角色,每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。可以自己搭建这台服务器,也可以使用GitHub网站

二、安装与配置

(1)安装命令如下:

  • sudo apt-get install git

(2)安装成功后,运行如下命令,可以获取到各种场合常见的git命令:

  • git
    git使用大全_第4张图片

三、创建版本库:

(1)新建一个目录yuanma,在yuanma目录下创建一个版本库,命令如下:

  • git init
  • 可以看到在yuanma目录下创建了一个.git隐藏目录,这就是版本库目录。
    git使用大全_第5张图片

四、版本的创建于回退

4.1使用:

  • 在yuanma目录下创建一个文件code.txt:
    git使用大全_第6张图片

  • 使用如下两条命令可以创建一个版本:

git add code.txt
git commit –m '版本1'

git使用大全_第7张图片

  • 使用如下命令可以查看版本记录:git log
    git使用大全_第8张图片

  • 继续编辑code.txt,在里面增加一行。
    git使用大全_第9张图片

  • 创建一个版本后再查看版本记录:
    git使用大全_第10张图片

  • 现在若想回到某一个版本,可以使用如下命令: git reset --hard HEAD~1(回到上一个版本)
    git使用大全_第11张图片
    git使用大全_第12张图片

其中HEAD表示当前最新版本,HEAD^表示当前版本的前一个版本,HEAD^^表示当前版本的前前个版本;
也可以使用HEAD~1表示当前版本的前一个版本,HEAD~100表示当前版本的前100版本。
  • 假如我们现在又想回到版本2,这个时候怎么办?
    (1)可以使用如下命令: git reset --hard 版本号
    从之前的git log中,可以看到版本2的版本号为:
    git使用大全_第13张图片

  • 在终端执行如下命令:
    git使用大全_第14张图片
    现在发现版本2又回来了。可以查看 code.txt 里面的内容如下:
    git使用大全_第15张图片

  • 下面把终端关了,然后再打开终端,发现之前版本2的版本号看不到了。 那么怎么再回到版本2呢?git reflog命令可以查看我们的操作记录。
    git使用大全_第16张图片
    可以看到版本2的版本号,我们再使用如下命令进行版本回退,git reset --hard 版本重新回到了版本2。
    git使用大全_第17张图片

4.2、工作区和暂存区

4.2.1、 工作区(Working Directory)

  • 电脑中的目录,比如我们的yuanma,就是一个工作区。

4.2.2、 版本库(Repository)

  • 工作区有一个隐藏目录.git,这个不是工作区,而是git的版本库。

  • git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

  • 因为我们创建git版本库时,git自动为我们创建了唯一一个master分支,所以,现在,git
    commit就是往master分支上提交更改。

  • 你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
    git使用大全_第18张图片

  • 前面讲了我们把文件往git版本库里添加的时候,是分两步执行的:

     第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
     第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
    
  • 使用如下命令查看当前工作树的状态:git status
    当工作区文件和暂存区不一致时
    git使用大全_第19张图片

如果文件都被提交到了版本库
在这里插入图片描述

4.3、管理修改

  • git管理的文件的修改,它只会提交暂存区的修改来创建版本

4.4、撤销修改

  • 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout – file。
  • 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD
    file,就回到了场景1,第二步按场景1操作。
  • 场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节。

4.5、对比文件不同

  • 现在要对比工作区中code.txt和HEAD版本中code.txt的不同。使用如下命令:

git使用大全_第20张图片

4.6、删除文件

  • 删除code.txt rm code.txt
    git使用大全_第21张图片
  • 命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容

五、分支管理

5.1、创建和合并分支

  • git把我们之前每次提交的版本串成一条时间线,这条时间线就是一个分支。截止到目前只有一条时间线,在git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支

  • 一开始的时候,master分支是一条线,git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:
    git使用大全_第22张图片
    每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。

  • 当我们创建新的分支,例如dev时,git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:
    git使用大全_第23张图片
    git创建一个分支很快,因为除了增加一个dev指针,改变HEAD的指向,工作区的文件都没有任何变化。

  • 不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:
    git使用大全_第24张图片

  • 假如我们在dev上的工作完成了,就可以把dev合并到master上。git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:
    git使用大全_第25张图片
    git合并分支也很快,就改改指针,工作区内容也不变。

  • 合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:
    git使用大全_第26张图片
    举例说明:

  • 执行如下命令可以查看当前有几个分支并且看到在哪个分支下工作 git branch
    在这里插入图片描述

  • 创建一个分支dev并切换到其上进行工作
    git使用大全_第27张图片
    git使用大全_第28张图片

  • 修改code.txt内容,在里面添加一行,并进行提交
    git使用大全_第29张图片

  • 切换回master分支 git checkout master
    git使用大全_第30张图片

git使用大全_第31张图片
查看code.txt,发现添加的内容没有了。因为那个提交是在dev分支上,而master分支此刻的提交点并没有变

  • 把dev分支的工作成果合并到master分支上 git merge 分支名称
    git使用大全_第32张图片
    再查看code.txt的内容,就可以看到,和dev分支的最新提交是完全一样的

git使用大全_第33张图片
注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快

  • 合并完成后,就可以放心地删除dev分支了,删除后,查看branch,就只剩下master分支了
    git使用大全_第34张图片
    总结:
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>

5.2、解决冲突

  • master分支和dev分支各自都分别有新的提交:
    git使用大全_第35张图片
  • 执行如下命令尝试将dev分支合并到master分支上来
    git使用大全_第36张图片
  • git status也可以告诉我们冲突的文件
    git使用大全_第37张图片
  • 查看code.txt的内容
    git使用大全_第38张图片
  • git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改如下后保存
    git使用大全_第39张图片
  • 再提交

在这里插入图片描述

  • 现在,master分支和dev分支变成了下图所示
    git使用大全_第40张图片
  • 用带参数的git log也可以看到分支的合并情况
    git使用大全_第41张图片

5.3、分支管理策略

通常,合并分支时,如果可能,git会用fast forward模式,但是有些快速合并不能成而且合并时没有冲突,这个时候会合并之后并做一次新的提交。但这种模式下,删除分支后,会丢掉分支信息

  • 创建切换到dev分支下;
  • 新建一个文件code3.txt编辑内容,并提交一个commit;
  • 切换回master分支,编辑code.txt并进行一个提交;
  • 合并dev分支的内容到master分支;
  • 出现如下提示,这是因为这次不能进行快速合并,所以git提示输入合并说明信息,输入合并内容之后git会自动创建一次新的提交
    git使用大全_第42张图片
    git使用大全_第43张图片

如果要强制禁用fast forward模式,git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息

  • 创建并切换到dev分支;
  • 修改code.txt内容,并提交一个commit;
  • 切换回master分支;
  • 准备合并dev分支,请注意–no-ff参数,表示禁用Fast forward;
    在这里插入图片描述
    因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去
  • 合并后,我们用git log看看分支历史
    git使用大全_第44张图片
    git使用大全_第45张图片

5.4、bug分支

每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除

  • 修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除; 当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,恢复工作现场

六、使用github

6.1、创建仓库

  • 注册github账户,登录后,点击"New respository "
    git使用大全_第46张图片

  • 在新页面中,输入项目的名称,勾选’readme.md’,点击’create repository’
    git使用大全_第47张图片

  • 添加成功后,转到文件列表页面
    git使用大全_第48张图片

6.2、添加ssh账户

  • 点击账户头像后的下拉三角,选择’settings’(如果某台机器需要与github上的仓库交互,那么就要把这台机器的ssh公钥添加到这个github账户上);
    git使用大全_第49张图片

  • 点击’SSH and GPG keys’,添加ssh公钥。
    git使用大全_第50张图片

  • 编辑文件.gitconfig,修改某台机器的git配置

  • 修改为注册github时的邮箱,填写用户名
    git使用大全_第51张图片

  • 使用如下命令生成ssh密钥 ssh-keygen -t rsa -C "邮箱地址"
    git使用大全_第52张图片

  • 进入主目录下的.ssh文件件,下面有两个文件

     公钥为id_rsa.pub
     私钥为id_rsa
    
  • 查看并复制公钥内容

  • 回到浏览器中,填写标题,粘贴公钥
    git使用大全_第53张图片

6.3、克隆项目

  • 复制git地址
    git使用大全_第54张图片

6.4、推送项目

  • 推送分支,就是把该分支上的所有本地提交推送到远程库,推送时要指定本地分支,这样,git就会把该分支推送到远程库对应的远程分支上
git push origin 分支名称
例:
git push origin smart

6.5、将本地分支跟踪服务器分支

git branch --set-upstream-to=origin/远程分支名称 本地分支名称
例:
git branch --set-upstream-to=origin/smart smart

在这里插入图片描述

6.6、从远程分支上拉取代码

git pull orgin 分支名称
例:
git pull orgin smart

git使用大全_第55张图片
注:参考网络上文档编写,部分内容并非原创!!!

你可能感兴趣的:(python,git,python,git)