git入门---30分钟学会使用git

来源:互联网 发布:淘宝金牌卖家入口 编辑:程序博客网 时间:2024/05/10 03:52

在开始学习git之前,让我们看一下这个故事。

小张是一个未毕业程序员,最近在做一个小项目练习,在日常开发中为了能使每天编写/修改的代码能够保存。小张每天睡觉之前会把今天的代码备份起名 xxxx.xx.xx(年月日)。这样就能记录每天的工作,防止那天出现错误,能够回退到前一天的代码。小张知道这有一个问题如果上午写的代码正常,下午出现了大片的错误,只能回到昨天的版本,等于一个早上的代码白写了,小张觉得只要自己备份的频率频繁些就好了。刚开始这种方法还挺不错的,除了太占内存。还解决了一些问题,十天前小张的有个模块写的不错,后来修改修改
导致代码面目全非,还好备份直接恢复,照常运行,小张心里可高兴了。

之后,小张参加了学校的比赛,需要和队友配合一起完成,刚开始每人各自负责自己的模块,最后相互引用增加的文件就可以了,不过随着比赛的进行(小张这次参加了一个时间周期比较长的比赛)和队友之间工作交叉很多(两人修改了同一个文件里的方法,变量)。这下可苦恼了小张和他的队友。只能每次修改之前相互询问,我要修改x.c这个文件了,修改完了给你说,然后另一个人想修改,只能等到另一个人完成了再修改。 这样持续了一段时间,效率很差。

一个周末,小张和已经工作了的学长聊你了这件苦恼的事。学长说,哈,我们公司的项目比你们大多了,你们那种方式太原始了,一个人开发还好,要是很多人一起开发,基本就没法工作了。学长说,我们现在使用git来管理代码,之前是用的是SVN。 小张,一脸期待的看着学长。学长说那就给你普及普及知识。
你可以把你们的代码放到实验室的局域网内的服务器(SVN/GIT服务器),每次开始之前从服务器上获取最新的代码,修改完发送发服务器,服务器会处理你的修改,如果你和你的队友同时修改了一个文件,都发送服务器,服务器会把你们修改的标记,你们再从服务器获取,确定冲突的保存那些,修改之后,发送到服务器,之后就可以一直开发了,并且每次提交都有记录,可以看到修改了那些。 小张一脸兴奋的看着学长。学长顿了顿,这种方式叫做SVN。 有一个中央仓库。不过这种方式有个问题,那就是如果你回到了宿舍,实验室的服务器是局域网的,就没法玩了。所以的趋势是使用 git。 git会在你本地有一个和 中央仓库一样的数据。每次你完成一小步提交的本地仓库或者在宿舍写了一些代码,确定之后提交到本地仓库,等你完成了一个模块或者到了实验室连上了局域网,在提交到中央仓库。 这时你的队友也提价到了中央仓库,解决你们的冲突,从服务器获取最新的版本,这就是git。
小张听完如获至宝,回去后立马学习使用git,使用了一段时间,效率提升了很多,学习使用了一段时间,有些一些总结,好东西要和大家分享,软件的开源精神。

git 是分布式版本控制系统。
在开始之前,要了解一下git的工作流程:

工作区(workspace)—>暂存区(staging area)—–>git本地仓库(loca respository)——–>git远程仓库(remote respository)

这里写图片描述

初始化本地仓库

首先安装git(搜个教程就行),安装完成之后,我们可以使用git的命令行进行操作。
安装完成,在任何区域右键可以看到 GIT GUI Here GIT Base Here
这里写图片描述

本博客主要使用 Git base Here作为介绍GIT 。
进入任意盘,新建 learnGit 文件夹,我们在此文件下进行操作。
新建之后,进入文件夹,我们新建一个 a.txt 文件。

  • 创建本地仓库

    在指定目录下 右键点击 Git Base Here (如果你已经安装了git)
    输入 git init 会把此目录使用git管理起来

这里写图片描述

这个时候我们的目的是要管理 learnGit这个文件夹下的所有文件。
右键点击 Git Bash Here ,会打开一个终端命令输入的小黑框。

这里写图片描述

我们要把这个文件夹管理起来,要初始化这个文件夹作为一个git仓库。 输入 git init
我们会发现会生成一个.git 的文件夹(没有,看看你是不是设置隐藏一些文件/文件夹)。 .git 保存着我们每次的修改记录。
这里写图片描述

添加到暂存区/本地仓库

现在我们 在 a.txt添加修改。

这里写图片描述

我们把修改的信息,保存在本地仓库。
使用命令 添加到暂存区 git add a.txt 正常不会有什么信息, 再把修改提交到本地仓库使用命令:
git commit -m ‘增加了11111’

这里写图片描述

查看状态/提交记录

如果想查看状态,可以使用git status
这里写图片描述
由于我们已经把修改的提交到了本地仓库,所有工作区和暂存区是很干净的。 现在我们修改a.txt,再查看状态。
这里写图片描述

这里写图片描述

可以看到提示 a.txt被修改了,提示使用git add / git checkout(后面再来了解这个命令)。
提交到暂存区,再查看状态。(git add filename/* 可以提交单个文件也可以使用通配符提交所有修改)
这里写图片描述

现在我们已经把a.txt提交到了暂存区, modified a.txt 颜色和之前有区别。提交到本地仓库,再查看状态。
这里写图片描述

如果想查看提交的记录,可以使用 git log ,该命令会从近到远显示提交记录。
这里写图片描述

如果提交的记录很多,想把每次提交的记录显示为一行可以使用 git log –pretty=oneline
这里写图片描述

如果想查看历史提交版本号可以使用 git reflog .
这里写图片描述

版本回退

如果想回退到之前 11111的版本,可以使用 git reset –hard HEAD^ 代表回退到上一个版本,要是想回退到前两个版本 增加^ (git reset –hard HEAD^^),如果想回退到 前50个版本 ,你可以使用^ 这种方式,不过有一种更加便捷的方式 git reset –hard HEAD~count (git reset –HEAD ~50 count代表回退的版本数) 。
如果你不记得想回退到第几个版本,那么可以查看记录,使用 版本号回退。 git reset –hard versionNumber

这里写图片描述

在查看a.txt 可以看到 文本回到了 11111的状态。
这里写图片描述

分支管理

git 里有个分支的概念,你的代码就像一颗树,会随着你的需要变成很多树枝(分支),可以并行开发。例如我们 初始化 一个文件夹使用git管理起来,可以看到 master 代表着主分支,我们也可以新建分支,在其他分支上进行开发。 看看示例,你就更加明白了。

首先我们先新建一个分支 dev。 使用命令 git branch branchname 。
并且查看现在有多少个分支,切换到新建的dev分支。

这里写图片描述
可以看到我们现在有两个分支 master dev 并且现在在dev 分支下工作。

也可以使用命令 git checkout -b branchname 创建并且切换分支。

这里写图片描述

我们现在做下面的事情,来理解分支。 在dev分支下 a.txt 增加 333333 提交到本地仓库,切换到master 查看 a.txt的内容。

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

神奇吧,这就是git的分支管理。

如果想合并 master和Dev分支 使用命令 git merge branchname 。现在我们想把 dev 分支合并到master分支,那么首先切换 master 分支,然后使用上述命令。

这里写图片描述

这里写图片描述

现在我们的 master 和dev 的内容是一样的,如果你想删除 dev分支,可以使用命令 git branch -d branchname

这里写图片描述

远程仓库

现在我们一直在本地开发, 如果想和其他人一起开发,那么我们需要一个远端的仓库,大家共同使用来开发。 相比在本地,多了一个步骤。

修改—> 暂存区—->本地仓库—–>远端仓库

首先你需要有 github或者 开源中国码云平台的账号,才能创建和加入远端仓库。
当你申请账号,新建一个项目 拿到项目的 ssh/https 链接。
在本地使用命令 git remote add origin url ,url 就是你的到的ssh/https 。
和远程仓库链接起来之后,你就可以把本地的仓库推送到远程,也可以拉取远程仓库最新代码。

推送本地代码到远端:   git push origin branchname   /如果远程是新建的项目本地第一推送要是用  git push -u origin branchname 拉取远端代码到本地:   git pull  origin branchname  

命令总结

  • 添加到工作区/本地仓库

    git add filename/* ———添加工作区的修改到暂存区 可以是具体的一个文件也可以是 所有的修改的文件

    git commit -m ‘your commit message’ —–提交到本地仓库 -m 后面跟的是 这次提交的总结信息

  • 查看状态/记录

    git status —-查看状态

    git log —-查看提交记录

    git log –pretty=oneline —-查看提交记录,每次提交显示为一行

    git reflog —— 查看历史提交记录版本号

  • 版本回退:如果想回退到之前某次状态

    git reset –hard HEAD^ —–回退到上个版本 ^ 代表回退一个版本

    git reset –hard HEAD^^ ——回退到上上个版本 ^的个数代表回退到前几个版本

    git reset –hard HEAD~count —–回退到前count个版本

    git reset –hard version —–回退到version这个版本

  • 远程库操作

    git remote add origin url —-本地仓库关联远程 url 为远程仓库的地址

    git push -u origin branchName —– 提交本地仓库到远程仓库,第一提交需要加 -u

    git push origin branchName —–提交本地仓库到远程仓库

    git clone url ——-克隆远程仓库到本地 url : 远程仓库的地址

    git push < origin > < branchName > —–推送到远程分支

    git pull < origin > < branchName > —–拉取远程分支

  • 创建与合并分支

    git branch ——查看分支列表(本地)

    git branch -r ——— 查看分支列表(远程)

    git branch -a ——查看分支列表(本地和远程)

    git branch branchName ——–新建branchName 分支

    git checkout branchName ——选择分支

    git checkout -b branchName —–创建并选择分支

    git merge branchName ——-合并分支到当前分支,如果有冲突解决冲突,再提交

    git branch -d branchName ——-删除分支

  • 隐藏/恢复工作现场

    当我们正在分支dev 分支进行开发,这时一个紧急bug需要解决,分支为bug,但是手上dev分支还没有提交并且Dev还发还没有完成,此时需要切换到bug分支,但是dev正在开发还未提交暂存区/本地仓库,怎么解决?

    1.添加到暂存区并且提交到本地仓库
    2 . 放弃dev还没有提交的(开个玩笑 ^^)

    由于dev还没有还发完,提交的半成品,可能代码都运行不起来,那么没有其他的方式了?

    当然是有的啊。

    3.我们需要隐藏工作现场(已修改未暂存/未提交) ,之后等到把bug分支解决了,再恢复工作现场

     git stash       -----把当前工作区(已修改未暂存/未提交)隐藏起来 git stash list    ------查看当前被隐藏列表 git stash  pop       -------------恢复之前隐藏的工作现场并且把stash删除 git stash apply    ------恢复隐藏的工作现场,不删除stash git  stash   drop      -----删除一条stash 
  • 其他的一些问题

    一: 如果文件被修改,还没有提交到暂存区, 想回到之前的状态有三种方式:

           1.手动在文件里修改       2.退回版本       3.checkout 撤销   ---丢弃工作区的修改             git checkout --filename     

    二: 同步本地和远程仓库

        1. 同步分支代码  :   git pull    < origin>  < branchName>     2. 远端仓库有新的分支  :   git fetch    ----同步远程所有的分支         git  fetch < origin>    < branchName>       ---同步具体的分支

三: 修改commit 信息
3.1: 未提交到远程仓库
3.2: 已提交到远程仓库

3.1 :未提交到远程仓库
git commit –amend -m ‘message’ —–修改了最近一次的commit信息

3.2:已提交到远程仓库

第一步:
git commit –amend -m ‘message’

第二步:
git push < origin > < branchName > -force 或者
git push < origin > < branchName > -f

注意:使用第二步的时候,请确保当前本地仓库和远程的代码是一致的,因为此命令会使用本地仓库的代码强制覆盖远程仓库。