Sweety

Practice makes perfect

导航

git&github常用日常

Posted on 2017-11-20 21:13  蓝空  阅读(152)  评论(0编辑  收藏  举报

本文仅用作自己笔记用途,可能不系统,勿喷,教程见廖雪峰官网
安装教程网上自行google,安装后先注册全局信息

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

1. git基本操作

1.1 初始化

$ git init                  //把某个目录变成Git可以管理的仓库
$ git add <文件名>        //用命令git add告诉Git,把文件添加到仓库Git添加

文件需要add,commit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:

$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."

1.2 git status

git status命令可以让我们时刻掌握仓库当前的状态Untracked
这里写图片描述
这三个分别是:
第一个是add之后但是没有commit的
第二个是没有add的
第三个是新文件,未被追踪的

1.3 git diff

git diff顾名思义就是查看difference,这里显示的是本地没有提交的和提交的版本上的差异,显示的格式正是Unix通用的diff格式

1.4 git log

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

如果嫌输出信息太多,看得眼花缭乱的,可以试试加上–pretty=oneline参数

1.5 git reset

$ git reset --hard HEAD^

首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交3628164…882e1e0(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
命令执行后会提醒:

Unstaged changes after reset:
M       README.md

这里直接把head指针修改了,但是文件的内容没有修改,需要借助1.7小节命令将其工作区的文本文件还原(具体原理见1.6),通过git status可查看,直接checkout就可以将文本变为想还原的版本了

–hard参数有啥意义?这个后面再讲,现在你先放心使用。

最新的那个版本append GPL已经看不到了!好比你从21世纪坐时光穿梭机来到了19世纪,想再回去已经回不去了,肿么办?

办法其实还是有的,只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个append GPL的commit id是3628164…,于是就可以指定回到未来的某个版本:

$ git reset --hard 3628164

Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL:
这里写图片描述

改为指向add distributed:

这里写图片描述

然后顺便把工作区的文件更新了。所以你让HEAD指向哪个版本号,你就把当前版本定位在哪。
想恢复到新版本怎么办?找不到新版本的commit id怎么办?

在Git中,总是有后悔药可以吃的。当你用$ git reset –hard HEAD^回退到add distributed版本时,再想恢复到append GPL,就必须找到append GPL的commit id。Git提供了一个命令git reflog用来记录你的每一次命令

$ git reflog
a4a4527 (HEAD -> master, origin/master) HEAD@{0}: reset: moving to a4a45
dae796b HEAD@{1}: reset: moving to HEAD^
a4a4527 (HEAD -> master, origin/master) HEAD@{2}: commit: the third times modify readme.md
dae796b HEAD@{3}: commit: modify readme.md & add test2.txt
bdacecc HEAD@{4}: commit: new file readme.md
76b4650 HEAD@{5}: commit (initial): my first test

注意这里前面的那个id就是后面命令执行后最新的版本号,所以就可以回到最新的了

1.6 原理图

这里写图片描述
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

1.7 git checkout

命令git checkout – readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commit或git add时的状态。
这里写图片描述
使用场景:

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

1.8 git rm

删除文件:

$ git rm test.txt
$ git commit -m "remove test.txt"

1.9 git remote

查看remote名称,增加-v可查看详细信息

1.9 git last

2. git分支管理

廖雪峰“说”:

分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。
现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。
其他版本控制系统如SVN等都有分支管理,但是用过之后你会发现,这些版本控制系统创建和切换分支比蜗牛还慢,简直让人无法忍受,结果分支功能成了摆设,大家都不去用。
但Git的分支是与众不同的,无论创建、切换和删除分支,Git在1秒钟之内就能完成!无论你的版本库是1个文件还是1万个文件。

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

一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点
这里写图片描述
而增加分支就相当于增加新的dev指针(详情

2.1 git checkout -b

$git checkout -b dev //-b参数表示创建并切换,上面相当于:
                     //$ git branch dev
                     //$ git checkout dev

2.2 git branch

git branch命令会列出所有分支,当前分支前面会标一个*号。

2.3 git checkout master

$ git checkout master//回到master分支

2.4 其他git操作

查看分支:git branch

创建分支:git branch

切换分支:git checkout

创建+切换分支:git checkout -b

合并某分支到当前分支:git merge
–no-ff //禁用fast forward
-m “merge信息”

删除分支:git branch -d

分支合并图:git log –graph
–pretty=oneline //一行显示
–abbrev-commit

2.5 远程git分支clone(如GitHub)

使用git clone后,你的小伙伴从远程库clone时,默认情况下,你的小伙伴只能看到本地的master分支
完整的是:

git clone 网址
gitcheckout -b 创建的本地分支名称 origin/分支名称 //命令前面部分和本地创建分支一样

2.6 远程git分支创建(如GitHub)

git push --set-upstream origin 新分支名称

3. tag

Git有commit,为什么还要引入tag?
“请把上周一的那个版本打包发布,commit号是6a5819e…”
“一串乱七八糟的数字不好找!”
如果换一个办法:
“请把上周一的那个版本打包发布,版本号是v1.2”
tag应运而生!!!

3.1 tag的基本用法

git tag v1.0 //默认标签是打在最新提交的commit上的。
git tag -a <tagname> -m "blablabla..."//可以指定标签信息;
git tag v0.9 6224937 //提交打标签,对应的commit id是6224937
git tag //查看所有标签
git show v0.9 //查看标签信息
git tag -d v0.1 //删除标签

3.2 tag的远程使用(如GitHub)

git push origin v1.0  //推送本地v1.0标签到远程
git push origin --tags  //推送本地所有标签到远程

/*远程删除tag,先在本地删除,再删除远程(好像直接远程也可以吧)*/
git tag -d v0.9
git push origin :refs/tags/v0.9

4. 自定义git

4.1 注册全局信息

绑定自己的账号和公开自己起的名字

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

Git显示颜色,会让命令输出看起来更醒目

$ git config --global color.ui true

5. github

5.1 在命令行创建自己的仓库并上传

echo "# sss" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/zsweet/xxx.git
git push -u origin master

添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
从现在起,只要本地作了提交,就可以通过命令:

$ git push origin master
//或者直接 git push

5.2 直接上传已经存在的仓库

git remote add origin https://github.com/zsweet/xxx.git
git push -u origin master

5.3 git clone

克隆远程git到本地,两种方式都可以:我常用第二个

$ git clone git@github.com:michaelliao/gitskills.git
$ git clone https://github.com/michaelliao/gitskills.git