Git浅显使用

来源:互联网 发布:贵阳大数据交易所 地址 编辑:程序博客网 时间:2024/06/05 08:06

本文参考1:廖雪峰的官方网站Git教程
本文参考2:慕课网-知乎文章

1. 什么是Git?

Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。可以这样读:给特,可以参考英文单词gift,把f的发音去掉。它是怎么来的呢?是被Linux缔造者Linus花费两周的时间写出来的。感兴趣的可以去看一下本文参考1。

提示:版本控制系统,只能跟踪文本文件的改动,比如txt文件,网页,所有程序的代码等,版本控制系统可以告诉你每次的改动,但是图片,视频,Word文档这些二进制文件,虽能也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是知道图片从1kb变成2kb,但是到底改了啥,版本控制也不知道。

2. Git可以干什么?

浅显的讲,至少可以干这两件事:
(1)昨天我花了两个小时改了一个前天的代码,今天我突然觉得前天的代码很完美啊。我为什么手贱动了那个代码,现在怎么办?重新再写一遍?那就再花费两个小时。这时候如果你使用了Git,那么你可以通过几行命令让你的代码恢复到前天的状态。
(2)在一个团队里面,开发一个产品基本都需要团队协作开发。我们传统的开发模式,当一个人开发了一个模块,整合到项目上的方式应该是复制。但是随着业务量的增大,这种方式显然不能满足开发的需求。如果通过Git管理项目,团队成员可以将自己的项目提交到Git的版本库中,最终实现更为方便的项目团队开发。

3. Git的工作原理/流程

首先,先给大家一个概念图:
Git工作原理图
流程举例:
(1)实现项目上传:
->首先创建了一个项目
->在项目的根目录下,将项目初始化为一个被Git管理的项目
->把项目的更新(增加、修改、删除)先添加(add)到缓存区
->在缓存区将最后添加的最新项目提交(commit)到本地仓库
->建立与远程仓库的连接
->拉回远程仓库项目以便检查项目是否有其他团队成员作的更新
->若有更新会产生冲突,先解决冲突,无冲突不作操作
->最终推送(push)本地仓库的项目
(2)实现项目下载
->建立与远程仓库的连接
->将项目clone到本地仓库
->切换分支进行开发

3. Git的安装

根据我个人习惯,喜欢去官网下载。在这里你也可点击git-for-windows直接下载(下载版本为2.15.0版本)。
下载完成之后会得到一个exe可执行安装程序。点击该可执行程序,默认安装即可。安装完成成功之后,右键菜单项会出现两个选项:Git GUI Here和Git Bash Here。另外还可以通过Windows的CMD来输入git version来查看Git是否安装成功。
安装成功之后,我们需要给Git一个我们的标识,好让它识别我们是谁。
在任意非选中位置右键点击Git Bash Here,进入Git的bash界面,在命令行分别输入两行命令并回车:
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
第一行命令输入你的姓名,当然你可以随便输。第二行命令输入你的邮箱,当然你也可以随便输。
这是我们再输入一个命令并回车:
ssh-keygen -t rsa -C "email@example.com"
完成这个命令之后,你的C:\Users\Administrator\*(如果你的电脑默认用户名更改,则该位置是:C:\Users\用户名\)会增加一个.ssh文件夹,里面记录着你的Git本地的个人秘钥,你可以打开id_rsa.pub文件查看。
我的秘钥文件如图:(内容部分作覆盖处理)
我的秘钥

4. Git的使用

对于Git的使用,推荐大家使用Git的命令行操作。
当我们使用Git进行管理项目的时候。项目其实就是一个目录,在该目录下有各类配置文件、其他子文件以及其他目录,也或者结构非常简单仅有几个文件,这都是无所谓的。我们只需要通过命令就可以实现Git对项目进行管理了。
下面我将简单介绍一些Git的使用(示例环境Windows)。
(1)如果已有项目请直接进行第二步。如果没有项目,请在你Windows系统你想在的任意位置右键。然后点击Git Bash Here,进入Git的bash界面。创建项目并进入该项目根目录下。操作如下图(本示例系统环境为Windows):
操作图
命令行步骤:

mkdir gittest       //创建名为gittest的空项目(目录)cd gittest      //进入到gittest项目中

(2)创建版本库
在该项目根目录下,将本项目创建成版本库,创建成功之后,项目目录下会多一个.git文件夹,里面是Git用来跟踪管理版本,发生改动会造成仓库的损坏。操作如下图:
操作图
命令行步骤:

git init        //将被管理的项目创建为版本库

(3)版本回退

  • 为了测试,首先我们先创建一个文件。文件名为demo1。文件内容为:Love is life in its fulness like the cup with the wine 。然后,这作为项目的初始状态。将项目添加到缓存区,然后提交到本地仓库。
  • 操作如下图:
    操作图
  • 我们对文件进行第一次修改,删除第一个定冠词the。Love is life in its fulness like cup with the wine 。这时候再查看文件内容,发现the已被删除。修改完成之后,我们需要将项目添加到缓存区,然后提交到本地仓库。
  • 操作如下图:
    操作图
  • 现在如果我们对demo1文件继续进行修改,增加两句话,第一句:生命注满了爱,就如酒杯斟满了酒。第二句:我爱你。查看内容,修改成功。修改完成之后,将项目添加到缓存区,然后提交到本地仓库。
  • 操作如下图:
    操作图

就这样,你一直对项目进行着修改。当你修改好之后都要进行提交到缓存库并再进一步提交到本地仓库。像我上面的测试,我提交三个版本的项目到本地仓库。那么,如果我现在后悔了,我想回到之前的某一版本怎么办?
此时我们可以通过查看我们的Git日志记录。日志记录中记录着我们的版本信息*(日志信息按时间倒序排序),然后我们再通过版本回退命令,让项目恢复到之前某一版本。

  • 操作如下图:
    操作图
    操作图
    通过上图我们可以发现我们实现了预期的效果。
    命令行步骤:
//先对文件做修改git add demo1       //将修改后的demo1文件添加到缓存区git commit -m "修改描述"        //将demo1文件提交到本地仓库git log     //查看本地仓库记录的提交版本信息git reset --hard "版本号前六位即可"     //根据查看的版本号前六位使项目恢复到之前的某一版本

(4)分支管理
通过上面的操作图,你应该会发现在我们的操作路径最后有个(master)。这个就是一个分支,它是默认的主分支。而我们平常开发严格来讲是不允许在主分支上进行开发的。
这是我们可以创建自己的分支,然后我们的工作在自己的分支上进行开发。比如我创建一个zhang开发分支。这时我们发现,我们会进入zhang开发分支上,通过查看Git日志记录,发现目前的分支本地仓库与主分支一致。这是我们还没有在zhang分支上进行修改的添加并提交。
- 操作如下图:
这里写图片描述
下面我在zhang分支上进行修改,然后添加并提交再查看版本情况,会发现记录有所更新。但我们切回到主分支,版本状态并没有发生改变。
操作如下图:
操作图
操作图
操作图
当我在自己的分支上完成了工作并做了测试,完全没有问题。这个时候我们需要将自己分支上做的修改提交到主分支,即合并分支。
合并分支需要切换到主分支上,然后将我们的个人分支合并过来。因为刚才我进行版本信息的比较已经切换到master上了,所以下图不再重新切换分支。
操作如下图:
操作图
(5)解决冲突
刚才我们合并分支的时候并没有发生冲突。这是因为,我们在master主分支上创建了zhang分支之后,只在zhang分支上进行了项目的更新,在主分支并没有进行其他修改。那么这时候,并不会存在冲突。
但是,在我们的团队开发过程中,A、B成员在获取到初始项目后,会进行相应的开发,难免不会对同一个文件都进行了修改。但是提交总有先后顺序,当A完成工作之后,他会提交到主分支,但是当B进行提交的时候,因为他们对同一个文件进行了不同的修改,很可能会发生冲突。那么这时候,B需要进行解决冲突,然后再进行提交到主分支。
现在我先在主分支添加一句话,然后在zhang分支也添加一句话。但是内容不同,再当我们进行合并的时候,就会发生冲突。然后,我们需要进行解决冲突。
- 操作如下图:
操作图
操作图
操作图
操作图
从上图我们可以发现,zhang分支内容和master分支内容不一致。zhang分支最后一句是:我叫zhang。而在master分支中最后一句是:我姓zhang
下面进行合并:
操作图
很明显Git在提示我们进行修复冲突。
操作图
在这里我们可看到冲突的内容是被<<<<<<<,=======,>>>>>>>标记出来的。我们需要修改的是删除这些标记并删除我们不想要的东西,当然如果你想加上一些内容也是可以的。
如图:
操作图
在这里我添加了一句:我叫gege
(6)使用GitHub
gitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名GitHub。使用GitHub,我们可以把自己的项目托管上去,更可以分享自己的代码,实现技术交流。
我们使用GitHub首先需要注册一个GitHub账号。之前本文之前我们介绍的创建的秘钥就发挥了作用。有了秘钥我们才能向我们的GitHub账号上托管我们的项目。我们需要将秘钥填入一下框中。
GitHub
GitHub
以此点击,title随便写,但是最好有标识意义。秘钥要填入我们的个人秘钥。一切准备好之后,就可以使用GitHub进行项目托管了。
(1)如何从GitHub获取项目。
直接在GitHub的项目上复制clone路径,然后再自己本地任意一个非选择位置右键点击给Git Bash Here,输入命令:git clone "复制的路径"比如:git clone https://github.com/GitHuUser/xxxx.git。这样就完成了从GitHub上克隆项目的目的。
如图:
GitHub
(2)上传项目到GitHub
首先我们的项目在本地进行修改好,并最终已经提交到本地仓库。
然后我们需要在远程版本库GitHub中创建一个同本地项目名相同的版本库,创建如图。
GitHub
GitHub
这时我们现在Git Bash Here中建立与远程版本库GitHub的连接,连接需要远程仓库项目的路径,需要复制,同克隆复制路径方法一致。然后我们可以进行推送了。
命令行步骤:

git remote add origin git@github.com:michaelliao/learngit.git       //与远程仓库连接git push -u origin master       //推送所有内容到远程仓库

到这里,基本上简单的Git使用有个大致的了解。如果看不明白的话,可以多花些功夫去参考一下本文参考。
下面附上一些Git的命令,其中很多是本文没有讲到的。
Git命令:
git init用来把目录变成git可以管理的仓库

ls -ah可以看见隐藏文件

git add 用来把文件添加到仓库,可一次添加多个文件

git commit -m “描述” 用来把文件提交到仓库

git status用来查看仓库的当前状态

git diff用来查看文件做了什么修改

git log –pretty=oneline命令显示从最近到最远的提交日志

git reset –hard HEAD^

git reflog用来记录你的每一次命令

git reset –hard commit_id

git diff HEAD – 用来查看工作区和版本库最新版本的区别

git checkout – file用来丢弃工作区的修改

git reset HEAD file用来把暂存区的修改撤销掉,重新放回工作区

git rm从版本库中删除文件

git checkout – file从版本库中恢复删除的文件

git checkout是用版本库里的版本代替工作区的版本

git remote add origin git@github.com:GitHuUser/Git_repository.git

git remote add origin git@server-name:path/repo-name.git关联一个远程库

git push -u origin master第一次推送master分支的所有内容

git push origin master第一次推送之后就可以使用该命令推送最新修改

git clone git@github.com:GitHuUser/xxxx.git

git checkout -b dev创建一个dev的分支 加上-b参数表示创建并切换相当于git branch dev和git checkout dev两条命令

git branch命令来查看分支

git checkout -b dev 创建分支

git checkout 切换分支

git merge dev把dev分支的工作成果合并到当前分支上

git branch -d 删除分支

git log –graph命令可以看到分支合并图

git log –graph –pretty=oneline –abbrev-commit

git merge –no-ff -m “merge with no-ff” dev –no-ff参数表示禁用Fast forward

git stash把当前工作现场”储存”起来,等以后恢复现场后继续工作

git stash apply恢复工作现场,但是stash内容不删除,可以用git stash drop删除,或者直接用git stash pop

git stash list查看stash内容

git branch -D dev可以强制删除分支

git checkout -b dev origin/dev创建远程origin的dev分支到本地

原创粉丝点击