不以物喜,不以己悲

学习Git

git
写这篇主要是为了我做一个学习的记录,对于学习一个新的知识,我觉的还是记录一些东西对于知识点会更加清晰,故逐渐的我就保持学习一个新的知识时,我就开始做记录,也培养培养自己用文字描述一个事情的能力,话说这个过程是真的很难受,咱真真不善于表达。
Git是目前世界上最先进的分布式版本控制系统
Git真的是高端大气上档次,分支秒切,真真惊艳到咱了。
更惊讶的是,Linus大神只花了两周时间用C写的,一个月之内容,LInux系统的源码就由Git管理了!
本文主要参考廖雪峰的官方网站

集中式Vs分布式

集中式图

集中式

分布式图

分布式

创建版本库

版本库又名仓库,英文名为repository,可以简单理解成一个目录,这个目录里面的所有文件都可以被git管理,每个文件的修改、删除、Git都能跟踪,以便于任何时刻都可以追踪历史,或者还原。
创建一个版本库非常简单,首先,旋转一个合适的地方,创建一个空的目录:
mdkir test
cd test
第二部,通过git init命令把这个目录变成Git可以管理的仓库:
git init
瞬间就把仓库建好了,是一个空的仓库
然后就可以在该目录下新建文件可以管理了
使用git add命令来添加文件到仓库
git add readme.md
执行上面的命令,没有任何显示就对了,Unix的哲学是”没有消息就是好消息“,说明添加成功
第二步,用命令git commit告诉git,把文件提交到仓库。

git commit -m '描述一下'

git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容,这个你就能从历史记录f方便的找到改动记录。
可以继续修改文件内容,然后使用git status命令查看结果
git status命令可以让我们时刻了解仓库当前的状态。
可以使用命令git diff查看
git diff是查看difference,显示的格式是unix通用的diff格式
git log查看历史记录
git log --pretty=oneline可以看得舒服一些
这里看到的一串类似1094adc...的是commit id(版本号)
每提交一个新版本,实际上git就会把它们串成一条时间线。
git reset --hard HEAD^回退到上一个版本
git reset --hard 1094a (commit id版本号)即可回退到指定版本
git reflog 会显示每一次的命令
版本库
版本库图
撤销修改
git checkout -- file 可以丢弃工作区的修改
这里有两种情况:

  1. 一种是file自修改后还没有放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
  2. 一种是file已经添加到暂存区后,又做了修改,现在,撤销修改就回到添加到暂存区后的状态。
    总之,就是让文件回到最近一次git commit或git add的状态。
    git checkout -- file命令中的--很重要,么有--就变成了"切换到另一个分支“的命令。
    现在假定修改的东西,已经git add到暂存区了,庆幸的是在commit之前,你发现了这个问题,可以使用命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区
    git reset HEAD test.txt然后再丢弃工作区的修改
    git checkout -- test.txt即可。
    远程仓库
    第一步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可以直接跳到下一步。如果没有,打开shell,创建SSH Key:

ssh-keygen -t rsa -C 'youremail'

你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可。
如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的密钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
第二步:登录GitHub,打开“Account settings",”SSH Key"页面:
然后,点"Add SSH Key",填上任意的Title,在Key文本框黏贴id_rsa.pub文件的内容
点"Add Key",就可以了。
**添加远程仓库"
可以使用命令

git remote add origin git@github.com/xxxx.git

添加后,远程仓库的名字就是origin,这是git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程仓库。
下一步,就可以吧本地仓库的所有内容推送到远程库上:

git push -u origin master

把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
由于远程库是库的,我们第一次推送master分支时,加上了-u参数,git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。而后就可以使用简化命令

git push origin master

从远程库克隆
使用命令git clone克隆一个本地库

git clone git@github.com/xxxx.git

分支管理

  1. 创建与合并分支
    创建dev分支,然后切换到dev分支:

git checkout -b dev

git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

git branch dev
git checkout dev

然后使用git branch命令查看当前分支
git branch命令会列出所有分支,当前分支前面会标一个*号。
然后,我们就可以在dev分支上正常提交.
现在,dev分支的工作完成,我们就可以切换到master分支:

git checkout master

现在,我们把dev分支的工作成果合并到master分支上:

git merge dev

git merge命令用于合并指定分支到当前分支。合并后,再查看文件内容,就可以看到,和dev分支的最新提交时完全一样的。
合并完完成后,就可以放心地删除dev分支了:

git branch -d dev

删除后,查看branch,就只剩下master分支了;

git branch

工作现场“储藏”
使用stash功能,可以把当前工作现场“储藏”起来,等以后恢复x现场后继续工作:

git stash

现在,用status查看工作区,就是干净的,因此可以放心地创建分支来修复bug。
首先确定要在哪个分支上修复bug,假定需要再master分支上修复,就从master创建临时分支:

git checkout master
git checkout -b issue-101

现在修复bug,修复完成后,切换到master分支,并完成合并,最后删除issue-101分支:

git checkout master
git merge --no-ff -m 'merged bug fix 101' issue-101

现在是时候回到dev分支干活了!

git checkout dev
git status

工作区是干净的,刚才的工作现场存到哪去了?用git stash list命令查看:

git stash list

工作现场还在,git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
一个是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要使用git stash drop来删除
另一个方式是用git stash pop,恢复的同时把stash内容删除了:

git stash pop

再用git stash list查看,就看不到任何stash内容了:

git stash list

也可以多次stash,恢复的时候,先用git stash list查看,然后恢复到指定stash,用命令:

git stash apply stash@[0]

posted @ 2018-07-18 08:46  这种人  阅读(114)  评论(0)    收藏  举报