git 基础用法

小结

  • git config:配置相关信息
  • git clone:复制仓库
  • git init:初始化仓库
  • git add:添加更新内容到索引中
  • git diff:比较内容
  • git status:获取当前项目状况
  • git commit:提交
  • git branch:分支相关
  • git checkout:切换分支
  • git merge:合并分支
  • git reset:恢复版本
  • git log:查看日志
  • git tag:标签

版本控制系统

  • 集中式版本控制系统


    image.png

有一台服务器集中管理,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。

  • 分布式版本控制系统


    image.png

分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。

基本用法

初始化

使用git之前要对git进行初始化,使用git config命令

$ git config --global user.name "Scott Chacon"
$ git config --global user.email "schacon@gmail.com"

执行完会在/home/zjy建立一个.gitconfig的文件。就像下边这样。

[user]
    email = schacon@gmail.com
    name = Scott Chacon

上面的配置文件就是Git全局配置的文件,一般配置方法是git config --global <配置名称> <配置的值>
如果你想使项目里的某个值与前面的全局设置有区别(例如把私人邮箱地址改为工作邮箱),你可以在项目中使用git config 命令不带--global 选项来设置. 这会在你当前的项目目录下创建 .git/config,从而使用针对当前项目的配置。

克隆一个仓库

git clone命令+ 仓库路径。。

git clone https://github.com/shiyanlou/gitproject

初始化一个仓库

建个文件夹,然后cd进去,然后git init

$ cd /home/shiyanlou/
$ mkdir project
$ cd project
$ git init

工作流程

git的基本流程如下:

    1. 创建或修改文件
    1. 使用git add命令添加新创建或修改的文件到本地的缓存区(Index)
    1. 使用git commit命令提交到本地代码库
    1. (可选,有的时候并没有可以同步的远端代码库) 使用git push命令将本地代码库同步到远端代码库

使用git status查看git仓库的状态。

image.png

有三个文件处于untracked状态,使用git add命令把文件加入到缓存区

git add f1 f2 f3

再运行git status状态会变化

image.png

使用git diff --cached可以看看那些文件被修改了。进入之后按q才可以退出
image.png

使用git commit命令提交到本地仓库。

git commit -m "add 3 files" # -m 添加注释

git commit-a 参数会把没有添加到缓冲区的修改一起提交,不过 -a不会添加新建的文件。
git rm命令删除后会自动将已删除文件的信息添加到缓存区。提交后会将本地仓库中的对应文件删除。
这时候要是想关联到远程服务器,需要使用git remote命令,不是git clone命令。

git remote add origin https://github.com/yingque/novel_insect.git

对于上述命令而言,git remote add 命令用于添加远程主机,origin 是主机名,此处我们可以自定义,不一定非要使用 origin,而 https://github.com/yinqgue/novel_insect.git,是我自己的远程仓库,此处 需要替换为自己的远程仓库地址。
这个时候如果本地的仓库连接到了远程Git服务器,可以使用下面的命令将本地仓库同步到远端服务器:

# 需要输入仓库对应的用户名和密码
$ git push origin master

分支与合并

1 分支

一个Git仓库可以维护很多开发分支。现在我们来创建一个新的叫 experimental的分支

$ git branch experimental

git branch命令可以查看当前的分支列表,以及目前的开发环境处在哪个分支上。

image.png

使用git checkout 分支名可以切换到其他分支。可以按tab键补全。
image.png

切换到其他分支,编辑提交再切换会master分支,在其他分支上的修改就看不到了。

2 合并

# 切换到master分支
$ git checkout master
# 将experimental分支合并到master
$ git merge  -m 'merge experimental branch' branch1

如果两个分支修改了相同文件,则合并会失败。

image.png

git status会显示both modified

image.png

查看f1 文件内容发现:

image.png

也可以用git diff命令查看。
用编辑器,手动删除没有的东西,再重新提交。完成合并。

# 编辑冲突文件
$ vim file3
# 提交修改后的文件
$ git add file3
$ git commit -m 'merge file3'

当完成合并,不需要分支了,就可以删除掉git branch -d branch1这个分支。
`

image.png

git branch -d只能删除那些已经被当前分支的合并的分支. 如果你要强制删除某个分支的话就用git branch –D

3 撤销一个合并

下面的命令可以回退到合并之前的状态。

$ git reset --hard HEAD^

通常,一个合并会产生一个合并提交(commit), 把两个父分支里的每一行内容都合并进来。

查看日志

  • git log命令可查看所有的commit。
  • git log --stat命令可以打印详细记录,这些文件分别添加或者删除多少内容,打印详细的提交记录。
  • git log --pretty=oneline按特定格式输出日志,选项可以按tab键补全。
  • --graph 选项可以可视化你的提交图(commit graph),会用ASCII字符来画出一个很漂亮的提交历史(commit history)线。
  • 默认顺序会按提交时间逆序显示,可以指定一个--topo-order参数,按拓扑顺序显示,或者--reverse参数来逆序显示所有提交日志。

对比版本

git diff命令,命令的作用是比较修改的或提交的文件内容。

image.png

命令输出当前工作目录中修改的内容,并不包含新加文件,请注意这些内容还没有添加到本地缓存区。
将修改内容添加到本地缓存区,** * 通配符**可以把当前目录下所有修改的新增的文件都自动添加:

$ git add *

这时候再看git diff没有任何内容,说明所有的修改都加到了缓冲区。查看缓存区与上次提交之间的差别就使用--cache参数:

git diff --cached

image.png

再提交之后,git diffgit diff --cache就不会有任何输出了。
git diff命令也可以比较分支之间的差别。

git  diff 分支1 分支2
git diff 另一个分支
git diff 另一个分支  文件或目录
git diff test --stat #可以统计一下有哪些文件被改动或者。 

分布式工作流程

开发过程中,通常大家都会使用一个公共的仓库,并clone到自己的开发环境中,完成一个阶段的代码后可以告诉目标仓库的维护者来pull自己的代码。
通过http或是git协议,其它维护者可以通过远程访问的方式抓取(fetch)你最近的修改,但是他们 没有写权限。如何将本地私有仓库的最近修改主动上传到公共仓库中呢?
最简单的办法就是用git push命令,推送本地的修改到远程Git仓库,执行下面的命令:

$ git push [ssh://yourserver.com/~you/proj.git](仓库地址) master

如果推送失败,这种情况通常是因为没有使用git pull获取远端仓库的最新更新,在本地修改的同时,远端仓库已经变化了(其他协作者提交了代码),此时应该先使用git pull合并最新的修改后再执行git push

git pull
git push ssh://yourserver.com/~you/proj.git master

标签

  • 1 轻量级标签。
    可以用 git tag不带任何参数创建一个标签(tag)指定某个提交(commit):
# 查看git提交记录
git log

# 选择其中一个记录标志位stable-1的标签,注意需要将后面的8c315325替换成仓库下的真实提交内,commit的名称很长,通常我们只需要写前面8位即可
git tag stable-1 8c315325

# 查看当前所有tag
git tag
  • 2 用特定的搜索模式列出符合条件的标签。
git tag -l 'v1.4.2.*'
  • 3 含附注的标签

创建一个含附注类型的标签非常简单,用 -a (取 annotated 的首字母)指定标签名字即可:

git tag -a v1.4 -m 'my version 1.4'

-m 选项则指定了对应的标签说明,Git 会将此说明一同保存在标签对象中。如果没有给出该选项,Git 会启动文本编辑软件供你输入标签说明。

  • 4 可以使用 git show 命令查看相应标签的版本信息,并连同显示打标签时的提交对象。
$ git show v1.4
  • 5 分享标签
    默认情况下,git push 并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库。其命令格式如同推送分支,运行 git push origin [tagname] 即可:
$ git push origin v1.5
Counting objects: 50, done.
Compressing objects: 100% (38/38), done.
Writing objects: 100% (44/44), 4.56 KiB, done.
Total 44 (delta 18), reused 8 (delta 1)
To git@github.com:schacon/simplegit.git
* [new tag]         v1.5 -> v1.5

如果要一次推送所有本地新增的标签上去,可以使用 --tags 选项:

$ git push origin --tags
Counting objects: 50, done.
Compressing objects: 100% (38/38), done.
Writing objects: 100% (44/44), 4.56 KiB, done.
Total 44 (delta 18), reused 8 (delta 1)
To git@github.com:schacon/simplegit.git
 * [new tag]         v0.1 -> v0.1
 * [new tag]         v1.2 -> v1.2
 * [new tag]         v1.4 -> v1.4
 * [new tag]         v1.4-lw -> v1.4-lw
 * [new tag]         v1.5 -> v1.5

参考资料
【1】https://git-scm.com/book/zh/v2
【2】https://www.shiyanlou.com/courses/4


以上就是git的基本用法,只看了这么多,了解了这些大概就能用了。以后的事,熟悉了再说。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,519评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,842评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,544评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,742评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,646评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,027评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,169评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,324评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,268评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,299评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,996评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,591评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,911评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,288评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,871评论 2 341

推荐阅读更多精彩内容

  • Git是目前最流行的版本管理系统,也是最先进的分布式版本控制系统(distributed version cont...
    pro648阅读 5,664评论 1 17
  • 1. 安装 Github 查看是否安装git: $ git config --global user.name "...
    Albert_Sun阅读 13,621评论 9 163
  • 1.git的安装 1.1 在Windows上安装Git msysgit是Windows版的Git,从https:/...
    落魂灬阅读 12,643评论 4 54
  • 一、二次回路基本知识 1、二次回路作用 (1)二次设备:对一次设备进行监测、控制、调节、保护的电气设备。 (2)二...
    木垚一夕阅读 5,276评论 3 2
  • 小叮当有大熊保护 我们的认识很奇妙,在互联网的时代,虚拟的世界中相识,一开始的不信任到现在的算作身心交付吧,我想用...
    丁壮壮阅读 372评论 0 1