git基本语法
基本用法(上)
一、实验说明
本节实验为 Git 入门第一个实验,可以帮助大家熟悉如何创建和使用 git 仓库。
二、git的初始化
在使用git进行代码管理之前,我们首先要对git进行初始化。
1.Git 配置
使用Git的第一件事就是设置你的名字和email
,这些就是你在提交commit
时的签名,每次提交记录里都会包含这些信息。使用git config
命令进行配置:
$ git config --global user.name "Scott Chacon"
$ git config --global user.email "schacon@gmail.com"
执行了上面的命令后,会在家目录(/home/shiyanlou
)下建立一个叫.gitconfig
的文件(该文件为隐藏文件,需要使用ls -al
查看到). 内容一般像下面这样,可以使用vim或cat查看文件内容:
$ cat ~/.gitconfig
[user]
email = schacon@gmail.com
name = Scott Chacon
上面的配置文件就是Git全局配置的文件,一般配置方法是git config --global <配置名称> <配置的值>
。
如果你想使项目里的某个值与前面的全局设置有区别(例如把私人邮箱地址改为工作邮箱),你可以在项目中使用git config
命令不带 --global
选项来设置. 这会在你当前的项目目录下创建 .git/config
,从而使用针对当前项目的配置。
三、获得一个Git仓库
既然我们现在把一切都设置好了,那么我们需要一个Git仓库。有两种方法可以得到它:一种是从已有的Git仓库中clone (克隆,复制);还有一种是新建一个仓库,把未进行版本控制的文件进行版本控制。
1.Clone一个仓库
为了得一个项目的拷贝(copy),我们需要知道这个项目仓库的地址(Git URL). Git能在许多协议下使用,所以Git URL可能以ssh://, http(s)://, git://. 有些仓库可以通过不只一种协议来访问。
我们在git.shiyanlou.com
上提供了一个名字为gitproject
的供大家测试的公有仓库,这个仓库可以使用下面方式进行clone:
$ git clone http://git.shiyanlou.com/shiyanlou/gitproject
clone操作完成后,会发现当前目录下多了一个gitproject
文件夹,这个文件夹里的内容就是我们刚刚clone下来的代码。由于当前`gitproject仅是测试项目,里面仅有一个README.md文件。
$ cd gitproject/
(master)$ ls
README.md
细心的同学可以发现在命令提示符$
前面多了个(master)
。这是由于实验楼的Linux使用的是zsh Shell,zsh会判断当前的目录是否有Git仓库,如果是的话则自动把目前所在的git分支显示在提示符中。Git 分支的概念我们会在稍后介绍。
2.初始化一个新的仓库
可以对一个已存在的文件夹用下面的命令让它置于Git的版本控制管理之下。
创建代码目录project
:
$ cd /home/shiyanlou/
$ mkdir project
进入到代码目录,创建并初始化Git仓库:
$ cd project
$ git init
Git会输出:
Initialized empty Git repository in /home/shiyanlou/project/.git/
通过ls -la
命令会发现project目录下会有一个名叫.git
的目录被创建,这意味着一个仓库被初始化了。可以进入到.git
目录查看下有哪些内容。
四、正常的工作流程
1. 正常的工作流程
git的基本流程如下:
- 创建或修改文件
- 使用
git add
命令添加新创建或修改的文件到本地的缓存区(Index) - 使用
git commit
命令提交到本地代码库 - (可选,有的时候并没有可以同步的远端代码库)使用
git push
命令将本地代码库同步到远端代码库
进入我们刚才建立的project
目录,分别创建文件file1
,file2
,file3
:
$ cd project
$ touch file1 file2 file3
修改文件,可以使用vim编辑内容,也可以直接echo添加测试内容。
$ echo "test" >> file1
$ echo "test" >> file2
$ echo "test" >> file3
此时可以使用git status
命令查看当前git仓库的状态:
$ git status
On branch master
Initial commit
Untracked files:
(use "git add <file>...") to include in what will be committed)
file1
file2
file3
nothing added to commit but untracked files present (use "git add" to track)
可以发现,有三个文件处于untracked
状态,下一步我们就需要用git add
命令将他们加入到缓存区(Index)。
使用git add
命令将新建的文件添加到:
$ git add file1 file2 file3
然后再次执行git status
就会发现新的变化:
$ git status
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: file1
new file: file2
new file: file3
你现在为commit
做好了准备,你可以使用 git diff
命令再加上 --cached
参数,看看缓存区中哪些文件被修改了。进入到git diff --cached
界面后需要输入q
才可以退出:
$ git diff --cached
如果没有--cached
参数,git diff
会显示当前你所有已做的但没有加入到索引里的修改。
如果你要做进一步的修改, 那就继续做, 做完后就把新修改的文件加入到缓存区中。
当所有新建,修改的文件都被添加到了缓存区,我们就要使用git commit
提交到本地仓库:
$ git commit -m "add 3 files"
需要使用-m
添加本次修改的注释,完成后就会记录一个新的项目版本。除了用git add
命令,我们还可以用下面的命令将所有没有加到缓存区的修改也一起提交,但-a
命令不会添加新建的文件。
$ git commit -a -m "add 3 files"
再次输入git status
查看状态,会发现当前的代码库已经没有待提交的文件了,缓存区已经被清空。
至此,我们完成了第一次代码提交,这次提交的代码中我们创建了三个新文件。需要注意的是如果是修改文件,也需要使用git add
命令添加到缓存区才可以提交。如果是删除文件,则直接使用git rm
命令删除后会自动将已删除文件的信息添加到缓存区,git commit
提交后就会将本地仓库中的对应文件删除。
这个时候如果本地的仓库连接到了远程Git服务器,可以使用下面的命令将本地仓库同步到远端服务器:
$ git push origin master
这时候可能需要你输入在Git服务器上的用户名和密码。可以参考实验楼的代码库中的说明练习这个命令。
五、分支与合并
Git的分支可以让你在主线(master分支)之外进行代码提交,同时又不会影响代码库主线。分支的作用体现在多人协作开发中,比如一个团队开发软件,你负责独立的一个功能需要一个月的时间来完成,你就可以创建一个分支,只把该功能的代码提交到这个分支,而其他同事仍然可以继续使用主线开发,你每天的提交不会对他们造成任何影响。当你完成功能后,测试通过再把你的功能分支合并到主线。
1.分支
一个Git仓库可以维护很多开发分支。现在我们来创建一个新的叫 experimental的分支:
$ git branch experimental
运行git branch
命令可以查看当前的分支列表,已经目前的开发环境处在哪个分支上:
$ git branch
experimental
* master
experimental 分支是你刚才创建的,master分支是Git系统默认创建的主分支。星号标识了你当工作在哪个分支下,输入git checkout 分支名
可以切换到其他分支:
$ git checkout experimental
Switched to branch 'experimental'
切换到experimental
分支,切换完成后,先编辑里面的一个文件,再提交(commit)改动,最后切换回 “master”分支:
# 修改文件file1
$ echo "update" >> file1
# 查看当前状态
$ git status
# 添加并提交file1的修改
$ git add file1
$ git commit -m "update file1"
# 查看file1的内容
$ cat file1
test
update
# 切换到master分支
$ git checkout master
查看下file1
中的内容会发现刚才做的修改已经看不到了。因为刚才的修改时在experimental
分支下,现在切换回了master
分支,目录下的文件都是master
分支上的文件了。
现在可以在master
分支下再作一些不同的修改:
# 修改文件file2
$ echo "update again" >> file2
# 查看当前状态
$ git status
# 添加并提交file2的修改
$ git add file2
$ git commit -m "update file2 on master"
# 查看file2的内容
$ cat file2
test
update again
这时,两个分支就有了各自不同的修改,分支的内容都已经不同,如何将多个分支进行合并呢?
可以通过下面的git merge
命令来合并experimental
到主线分支master
:
# 切换到master分支
$ git checkout master
# 将experimental分支合并到master
$ git merge -m 'merge experimental branch' experimental
-m
参数仍然是需要填写合并的注释信息。
由于两个branch修改了两个不同的文件,所以合并时不会有冲突,执行上面的命令后合并就完成了。
如果有冲突,比如两个分支都改了一个文件file3,则合并时会失败。首先我们在master分支上修改file3文件并提交:
# 切换到master分支
$ git checkout master
# 修改file3文件
$ echo "master: update file3" >> file3
# 提交到master分支
$ git commit -a -m 'update file3 on master'
然后切换到experimental,修改file3并提交:
# 切换到experimental分支
$ git checkout experimental
# 修改file3文件
$ echo "experimental: update file3" >> file3
# 提交到master分支
$ git commit -a -m 'update file3 on experimental'
切换到master进行合并:
$ git checkout master
$ git merge experimental
Auto-merging file3
CONFLICT (content): Merge conflict in file3
Automatic merge failed; fix conflicts and then commit the result.
合并失败后先用git status
查看状态,会发现file3显示为both modified
,查看file3内容会发现:
$ cat file3
test
<<<<<<< HEAD
master: update file3
=======
experimental: update file3
>>>>>>> experimental
上面的内容也可以使用git diff
查看,先前已经提到git diff
不加参数可以显示未提交到缓存区中的修改内容。
可以看到冲突的内容都被添加到了file3中,我们使用vim编辑这个文件,去掉git自动产生标志冲突的<<<<<<
等符号后,根据需要只保留我们需要的内容后保存,然后使用git add file3
和git commit
命令来提交合并后的file3内容,这个过程是手动解决冲突的流程。
# 编辑冲突文件
$ vim file3
# 提交修改后的文件
$ git add file3
$ git commit -m 'merge file3'
当我们完成合并后,不再需要experimental
时,可以使用下面的命令删除:
$ git branch -d experimental
git branch -d
只能删除那些已经被当前分支的合并的分支. 如果你要强制删除某个分支的话就用git branch –D
2.撒销一个合并
如果你觉得你合并后的状态是一团乱麻,想把当前的修改都放弃,你可以用下面的命令回到合并之前的状态:
$ git reset --hard HEAD^
# 查看file3的内容,已经恢复到合并前的master上的文件内容
$ cat file3
3.快速向前合并
还有一种需要特殊对待的情况,在前面没有提到。通常,一个合并会产生一个合并提交(commit), 把两个父分支里的每一行内容都合并进来。
但是,如果当前的分支和另一个分支没有内容上的差异,就是说当前分支的每一个提交(commit)都已经存在另一个分支里了,git 就会执行一个“快速向前"(fast forward)操作;git 不创建任何新的提交(commit),只是将当前分支指向合并进来的分支。
六、Git日志
1.查看日志
git log命令可以显示所有的提交(commit):
$ git log
如果提交的历史纪录很长,回车会逐步显示,输入q
可以退出。
git log
有很多选项,可以使用git help log
查看,例如下面的命令就是找出所有从"v2.5“开始在fs目录下的所有Makefile的修改:
$ git log v2.5.. Makefile fs/
Git会根据git log命令的参数,按时间顺序显示相关的提交(commit)。
2.日志统计
如果用--stat选项使用'git log',它会显示在每个提交(commit)中哪些文件被修改了, 这些文件分别添加或删除了多少行内容,这个命令相当于打印详细的提交记录:
$ git log --stat
3.格式化日志
你可以按你的要求来格式化日志输出。--pretty
参数可以使用若干表现格式,如oneline
:
$ git log --pretty=oneline
或者你也可以使用 short
格式:
$ git log --pretty=short
你也可用medium
,full
,fuller
,email
或raw
。 如果这些格式不完全符合你的相求, 你也可以用--pretty=format
参数定义格式。
--graph
选项可以可视化你的提交图(commit graph),会用ASCII字符来画出一个很漂亮的提交历史(commit history)线:
$ git log --graph --pretty=oneline
4.日志排序
日志记录可以按不同的顺序来显示。如果你要指定一个特定的顺序,可以为git log
命令添加顺序参数。
按默认情况,提交会按逆时间顺序显示,可以指定--topo-order
参数,让提交按拓扑顺序来显示(就是子提交在它们的父提交前显示):
$ git log --pretty=format:'%h : %s' --topo-order --graph
你也可以用 --reverse
参数来逆向显示所有提交日志。
七、小结
本节讲解了几个基本命令:
- 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基本语法的更多相关文章
- Git&GitHub语法大全
目录 1. GitHub与Git万用语法 1)创建库 2)添加和提交到仓库 3)版本回退 4)缓存区和暂存区 5)撤销和删除文件 6)远程仓库 7)创建和合并分支 2. 更多Git语法 1. GitH ...
- git常用语法
git笔记 1. 获取项目(克隆): Git repository: git clone -b develop ssh://git@68. ...
- 12. git常用语法总结
git介绍与安装这里不再多说,再说也不如廖雪峰大佬总结的优秀: https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67 ...
- git cherry-pick合并某个commit
1.使用方法及其作用 git cherry-pick可以选择某一个分支中的一个或几个commit(s)来进行操作(操作的对象是commit).例如,假设我们有个稳定版本的分支,叫v2.0,另外还有个开 ...
- git入门及上传项目到github
Git入门: 如果你完全没有接触过Git,你现在只需要理解通过Git的语法(敲入一些命令)就可以将代码上传到远程的仓库或者下载到本地的仓库(服务器),我们此时应该有两个仓库,就是两个放代码 ...
- git clone简介
翻译整理自: http://web.mit.edu/~mkgray/project/silk/root/afs/sipb/project/git/git-doc/git-clone.html 在使用 ...
- git subtree用法(转)
git subtree用法 一.使用场景 例如,在项目Game中有一个子目录AI.Game和AI分别是一个独立的git项目,可以分开维护.为了避免直接复制粘贴代码,我们希望Game中的AI子目录与AI ...
- git 入门宝典
本篇教程是按照我自己的组织方式,然后从多篇教程中拼凑出来的,嘎嘎~,真佩服自己的技术! 原本想叫 git 宝典的,结果一查git的命令大全,还有那么多的git命令与功能没有接触到,所以...还是谦虚一 ...
- 【技术干货】git常用命令
2.1 git init语法: git init在当前目录初始化git仓库,适用于尚未使用git管理的项目2.2 git clone语法: git clone <url>例如: git c ...
随机推荐
- 使用Restify+superagent做数据转发
最近为了解决跨域问题,做了一个Node数据转发服务器,使用到了Restify和superagent. Restify 是nodejs的模块.虽然restify的API或多或少的参考了express,但 ...
- Spring中的IOC和AOP是什么含义,他们在项目中起到什么作用,并举例说明?
IOC:控制反转,是一种设计模式.一层哈尼是控制权的转移:由传统的在程序中控制并依赖转移到容器赖控制:第二是依赖注入:将相互以来的对象分离,在Spring配置文件中描述他们的依赖关系.他们的依赖关系只 ...
- [ZJOI2007]时态同步
题目描述 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3….进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路板的任何两个节点 ...
- MySQL配置文件
[mysqld]datadir=/usr/local//mysql/data #数据存放位置socket=/var/lib/mysql/mysql.sockuser=mysqllower_cas ...
- python PEP8相关介绍
在学习了python相关技术之后,开始重视其开发规范,以满足代码的可读性以及可维护性.主要的是学习了PEP8-style for python code的相关内容. 代码布局 缩进:每一级4个缩进.连 ...
- Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null object reference
尝试在一个空的对象引用上引用boolean java.util.List.add()这个方法: 错误例子: private ArrayList<String> classList; cla ...
- Web项目生成详解
action 与用户控制层相关内容,来自用户的请求和页面跳转: dao 数据库进行增删改查操作,接口定义其中: dao.impl 将上述接口进行实现 domain 数据表都映射成java中的类,实现数 ...
- 关于java构造函数,静态代码块,构造代码块,和普通代码块相关总结(一)
构造函数.构造代码块和静态代码块容易混淆,它们的执行条件和执行顺序也常常容易犯迷.这里就针对这些问题说一下我个人的一些理解,顺便对这部分内容做个小结. 一.构造函数 格式:类名(参数1,参数2,-){ ...
- asp.net core 四 IOC&DI Autofac
其实关于IOC,DI已经有了很多的文章,但是自己在使用中还是有很多困惑,而且相信自己使用下,印象还是会比较深刻的 关于这段时间一直在学习.net core,但是这篇文章是比较重要的,也是我自己觉得学习 ...
- mysql安装过程
1.到官网下载Mysql,目前最新版都是5.0以上版本,下载之后直接解压即可 2.在终端进入bin目录(如果嫌麻烦可配置环境变量,配置之后则无需进入bin目录则可敲命令),安装数据库服务:my ...