小结
- 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的基本流程如下:
- 创建或修改文件
- 使用
git add
命令添加新创建或修改的文件到本地的缓存区(Index)
- 使用
- 使用
git commit
命令提交到本地代码库
- 使用
- (可选,有的时候并没有可以同步的远端代码库) 使用
git push
命令将本地代码库同步到远端代码库
- (可选,有的时候并没有可以同步的远端代码库) 使用
使用git status
查看git仓库的状态。
有三个文件处于
untracked
状态,使用git add
命令把文件加入到缓存区
git add f1 f2 f3
再运行git status
状态会变化
使用
git diff --cached
可以看看那些文件被修改了。进入之后按q
才可以退出使用
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
命令可以查看当前的分支列表,以及目前的开发环境处在哪个分支上。
使用
git checkout
分支名可以切换到其他分支。可以按tab键补全。切换到其他分支,编辑提交再切换会master分支,在其他分支上的修改就看不到了。
2 合并
# 切换到master分支
$ git checkout master
# 将experimental分支合并到master
$ git merge -m 'merge experimental branch' branch1
如果两个分支修改了相同文件,则合并会失败。
git status
会显示both modified
查看f1 文件内容发现:
也可以用
git diff
命令查看。用编辑器,手动删除没有的东西,再重新提交。完成合并。
# 编辑冲突文件
$ vim file3
# 提交修改后的文件
$ git add file3
$ git commit -m 'merge file3'
当完成合并,不需要分支了,就可以删除掉git branch -d branch1
这个分支。
`
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
命令,命令的作用是比较修改的或提交的文件内容。
命令输出当前工作目录中修改的内容,并不包含新加文件,请注意这些内容还没有添加到本地缓存区。
将修改内容添加到本地缓存区,** * 通配符**可以把当前目录下所有修改的新增的文件都自动添加:
$ git add *
这时候再看git diff
没有任何内容,说明所有的修改都加到了缓冲区。查看缓存区与上次提交之间的差别就使用--cache
参数:
git diff --cached
再提交之后,
git diff
和git 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的基本用法,只看了这么多,了解了这些大概就能用了。以后的事,熟悉了再说。