git的使用

1 Git简介
Git是目前世界上最先进的分布式版本控制系统(没有之一)。
2 Windows上安装Git
  1. 在网上下载国内镜像Git的安装程序
  2. 安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
  3. 安装完成后,还需要最后一步设置,在命令行输入:(注:git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置)
  • $ git config --global user.name "Your Name"
  • $ git config --global user.email "email@example.com"
3 创建版本库
1、选择一个合适的地方,创建一个空目录:
  • $ mkdir app//创建一个叫app的文件夹
  • $ cd app //切换到app目录下
  • $ pwd //查看当前目
2 、通过git init命令把这个目录变成Git可以管理的仓库(如果已有文件,则忽略第一步):
瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository)
  • 目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
  • 如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见。
3、现在我们编写一个readme.txt文件放在app目录下,内容如下:
1111
然后:
  1. 用命令git add告诉Git,把文件添加到仓库:
$ git add readme.txt
执行上面的命令,没有任何显示,这就对了,Unix的哲学是“没有消息就是好消息”,说明添加成功。
  1. 用命令git commit告诉Git,把文件提交到仓库:
$ git commit -m "wrote a readme file"
解释一下git commit命令,-m后面输入的是本次提交的说明.
为什么Git添加文件需要addcommit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:
  • $ git add file1.txt
  • $ git add file2.txt file3.txt
  • $ git commit -m "add 3 files."
4、成功地添加并提交了一个readme.txt文件,现在,是时候继续工作了,我们继续修改readme.txt文件,改成如下内容:
11111
22222
现在,运行git status命令看看结果:
git status命令可以让我们时刻掌握仓库当前的状态,上面的命令告诉我们,readme.txt被修改过了,但还没有准备提交的修改。
5、虽然Git告诉我们readme.txt被修改了,但如果能看看具体修改了什么内容,自然是很好的。比如你休假两周从国外回来,第一天上班时,已经记不清上次怎么修改的readme.txt,所以,需要用git diff这个命令看看:
知道了对readme.txt作了什么修改后,再把它提交到仓库就放心多了,提交修改和提交新文件是一样的两步,第一步是git add,在执行第二步git commit之前,我们再运行git status看看当前仓库的状态:
git status告诉我们,将要被提交的修改包括readme.txt,下一步,就可以放心地提交了。
提交后,我们再用git status命令看看仓库的当前状态:
Git告诉我们当前没有需要提交的修改,而且,工作目录是干净(working directory clean)的。
4 版本回退
4.1 git log
“保存一个快照”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作.
实际工作中,版本控制系统用git log命令可以告诉我们历史记录:
git log命令显示从最近到最远的提交日志。
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数:
你看到的一大串类似3628164...882e1e0的是commit id(版本号),一大串数字防止跟别人的版本号冲突
4.2 git reset
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
现在,我们要把当前版本回退到上一个版本,就可以使用git reset命令:$ git reset --hard HEAD^(注:--hard参数
还可以继续回退到再上一个版本,不过且慢,然我们用git log再看看现在版本库的状态:
 
  • 此时你反悔不想回退,想回到刚刚删除的那个未来版本,办法其实还是有的,只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个版本commit id3628164...,于是就可以指定回到未来的某个版本:
$ git reset --hard 3628164
版本号没必要写全,前几位就可以了。
  • 上面的命令行窗口被关掉了!在Git中,总是有后悔药可以吃的。你必须找到commit id。Git提供了一个命令git reflog用来记录你的每一次命令:
4.3 小结
现在总结一下:
  • HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
  • 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
  • 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
5 撤销修改
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- fileName
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD fileName,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
6 添加远程库
6.1 本地库与远程库关联
git remote add origin https地址
添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。
6.2 把本地库的所有内容推送到远程库上
$ git push -u(第一次提交到远程空库,以后可以忽略) <远程库名> <远程库分支名> (如:$ git push -u origin master)
7 从远程库克隆
远程库已经准备好了,下一步是用命令git clone克隆一个本地库:
$ git clone https地址
8 分支管理
分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。
现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。
8.1 Git分支管理
9 解决冲突
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
git log --graph命令可以看到分支合并图。
具体原理可以查看:
10 Bug分支
当你接到一个很急的bug,但是,等等,当前正在dev上进行的工作还没有提交,Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作。
现在在比如develop分支上创建一个bug分支,bug解决后合并到develop分支,并删除bug分支,现在要接着完成之前的工作。
  • git stash //当前工作现场“储藏”起来
  • $ git stash list //查看刚才的工作现场存到哪去了
  • git stash apply //恢复后,stash内容并不删除,你需要用git stash drop来删除;
  • git stash pop //恢复的同时把stash内容也删了
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除
11 Git与可视化工具小乌龟对应
  • git提交(c)->master //相当于“git add”,提交到本地仓库
  • Git同步 //相当于git push origin master 提交到远程仓库(其中分支可选)
12 重要
当我想从远程仓库里拉取一条本地不存在的分支时:git checkout -b 本地分支名 origin/远程分支名,这个将会自动创建一个新的本地分支,并与指定的远程分支关联起来。如果出现提示:
fatal: Cannot update paths and switch to branch 'dev2' at the same time. Did you intend to checkout 'origin/dev2' which can not be resolved as commit?
表示拉取不成功。我们需要先执行:git fetch
然后再执行
git checkout -b 本地分支名 origin/远程分支名
posted @ 2018-04-09 11:29  Geminiyu  阅读(288)  评论(0编辑  收藏  举报