文档章节

Git版本控制 —— 常用命令速查

哼_哼
 哼_哼
发布于 2017/09/04 10:32
字数 4424
阅读 11
收藏 1

本文已被《Git版本控制 —— 常用命令目录》替换https://my.oschina.net/u/3452433/blog/1796164

git init (初始化版本库)

此命令用于创建一个git版本库。执行此命令的目录下会多出一个“.git”隐藏目录。git版本库信息就存储在这个目录下。

git init

 

“.git”目录中的文件结构如下

$ ls
config  description  HEAD  hooks/  info/  objects/  refs/
config git配置文件
description 仓库的描述信息,主要给gitweb等git托管系统使用
HEAD 这个文件包含了一个档期分支(branch)的引用
hooks/ 这个目录存放一些shell脚本,可以设置特定的git命令后触发相应的脚本;在搭建gitweb系统或其他git托管系统会经常用到hook script
info/ 包含仓库的一些信息
objects/ 所有的Git对象都会存放在这个目录中,对象的SHA1哈希值的前两位是文件夹名称,后38位作为对象文件名
refs/ 这个目录一般包括三个子文件夹,heads、remotes和tags,heads中的文件标识了项目中的各个分支指向的当前commit

 

git config (配置文件)

查看配置文件

$ git config --list

修改配置文件

$ git config --global user.name "lichao"

 

git clone (克隆项目)

此命令用于将远程版本库克隆到本地。

git支持https和ssh协议进行项目的克隆操作

git clone https://git.oschina.net/imlichao/git-example.git
git clone git@git.oschina.net:imlichao/git-example.git

 

git status(查看文件状态)

此命令用于查看更改过的文件当前的状态,也就是说文件目前在哪个区域内有没有提交等信息。

git status

下面介绍一下几类文件的状态提示

没有加入到git版本管理的文件提示

目前在工作区的文件提示

目前在暂存区的文件提示

文件已提交但是没推送到远程版本库时的提示

文件已推送将不再提示

 

git status -s(状态简览)

git status 命令的输出十分详细,但其用语有些繁琐。 如果你使用 git status -s 命令或 git status --short 命令,你将得到一种更为紧凑的格式输出。 运行 git status -s ,状态报告输出如下:

$ git status -s
 M README
MM Rakefile
A  lib/git.rb
M  lib/simplegit.rb
?? LICENSE.txt

新添加的未跟踪文件前面有 ?? 标记,新添加到暂存区中的文件前面有 A 标记,修改过的文件前面有 M 标记。 你可能注意到了 M 有两个可以出现的位置,出现在右边的 M 表示该文件被修改了但是还没放入暂存区,出现在靠左边的 M 表示该文件被修改了并放入了暂存区。 例如,上面的状态报告显示: README 文件在工作区被修改了但是还没有将修改后的文件放入暂存区,lib/simplegit.rb 文件被修改了并将修改后的文件放入了暂存区。 而 Rakefile 在工作区被修改并提交到暂存区后又在工作区中被修改了,所以在暂存区和工作区都有该文件被修改了的记录。

 

.gitignore(忽略提交)

有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,每次git status都会显示Untracked files ...,有强迫症的童鞋心里肯定不爽。

好在Git考虑到了大家的感受,这个问题解决起来也很简单,在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。

我使用的忽略文件,忽略了IDEA、maven、日志和svn生成的文件。

# --> IDEA
.idea/
*.iml

# --> maven
target/

# --> log
logs/

# --> svn
.svn/

 

git add(保存到暂存区)

此命令用于将工作区修改的文件保存到暂存区(包括修改文件、新增文件和删除文件)

git add <file name>

指定文件保存,需要输入文件名

git add src/main/java/pub/lichao/test/Application.java

将当前目录下的所有文件保存,使用“.”作为通配符

git add .

这是个多功能命令:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。 将这个命令理解为“添加内容到下一次提交中”而不是“将一个文件添加到项目中”要更加合适。 

 

git commit(提交文件)

将文件从暂存区全部提交到分支。

git commit

vim编辑器编辑提交说明(提交说明必须要填)

保存后提交成功。

我们也可以直接使用 -m 参数直接填写说明

git commit -m "commit explain"

 

跳过使用暂存区域

尽管使用暂存区域的方式可以精心准备要提交的细节,但有时候这么做略显繁琐。 Git 提供了一个跳过使用暂存区域的方式, 只要在提交的时候,给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤:

$ git commit -a

 

git diff(差异比较)

此命令用于查看不同区域和分支之间的差异。

比较工作区与暂存区文件差异

git diff <file name>

当file name指定了文件名则展示这个文件的差异,当不指定file name时展示所有文件差异。

比较工作区与分支差异

git diff <branch name> <file name>

branch name 代表分支名称。HEAD为当前分支、master为本地主分支、origin/master为远程主分支。

比较暂存区与分支差异

git diff --cached <branch name> <file name>

比较分支之间的差异

git diff <branch name1> <branch name2> <file name>

 

git log (提交日志)

查看提交日志

git log

增加--pretty=oneline参数可以查看精简版日志

git log --pretty=oneline

查看分支合并图

git log --graph

 

git reset(版本回退)

已经提交到分支的文件可以进行版本回退。

HEAD代表当前分支,一个“^”符号回退一个版本,三个就回退三个版本。

git reset --hard HEAD^

我们可以指定回退到某一次提交,其实准确的说应该是根据提交编号,跳转到某次提交。因为只要有提交编号也可以向前跳。

git reset --hard db779694ccfd556b5110dcda64db9dec0f5706cd

 

git reflog(操作日志)

此命令用于查看操作日志。git所有的操作在这里都能找到。

git reflog

如果我们将已提交代码进行了回退但是,发现回退错了。这时候在 git log中是无法找到记录的。这是我们就可以使用reflog命令查找到那次提交记录,然后用reset命令指定到回退前的提交编号。

如下图:

git checkout -- (撤销工作区修改)

此命令用于撤销工作区的修改。特别要注意checkout 后面的“--”如果没有就变成切换分支的命令了。

撤销后会恢复到 最后一次add或commit的状态,也就是说在工作区编辑完的内容没有保存到暂存区的,可以通过此命令全部退回。

撤销指定文件的修改

git checkout -- src/main/java/pub/lichao/test/Application.java

撤销全部工作区修改

git checkout -- .

你需要知道 git checkout -- [file] 是一个危险的命令,这很重要。 你对那个文件做的任何修改都会消失 - 你只是拷贝了另一个文件来覆盖它。 除非你确实清楚不想要那个文件了,否则不要使用这个命令。

 

git reset HEAD(撤销暂存区修改)

提交到暂存区的修改可以使用reset HEAD进行撤销。撤销后暂存区内容将被清空。

撤销某一个文件

git reset HEAD src/main/java/pub/lichao/test/Application.java

撤销所有文件

git reset HEAD .

 

git rm (删除文件)

此命令用于删除文件。此操作会自动保存在暂存区(不需要add),所以删除后的文件需要使用git reset HEAD从暂存区撤销,再用git checkout -- 恢复工作区文件。

如果已经提交可以使用git reset进行回退。

git rm pom.xml

 

git mv(移动文件、改名)

此命令用于git的文件移动

$ git mv documents/new ./

也可以用于修改文件名

$ git mv new new1

底层操作实际上是执行了

$ mv README.md README
$ git rm README.md
$ git add README

 

git branch(分支操作)

此命令用于查看或创建一个新的分支。

查看本地分支

* 号代表当前分支

git branch

 

- a 参数可以看到所有分支,包括远程分支

- v 参数可以看到分支最后一次提交

-vv 可以看到分支对应的远程分支

创建分支

git branch <branch name>

删除分支

git branch -D <branch name>

添加对应关系

添加本地分支和远程分支的对应关系

git branch --set-upstream <branch name> origin/<branch name>

此命令必须用在clone、fetch、pull等命令拉取分支之后才能用

如果本地分支不存在则新建本地分支并关联对应关系。

查看跟踪分支

从远程分支创建的本地分支,都会自动创建一个跟踪分支来维护本地分支与远程分支的对应关系。

我们在pull或push代码时就会与对应的远程分支进行交互。

git branch -vv

 这会将所有的本地分支列出来并且包含更多的信息,如每一个分支正在跟踪哪个远程分支与本地分支是否是领先、落后或是都有。

 

git checkout (切换分支)

此命令用于切换本地分支

切换分支

git checkout <branch name>

切换并创建分支

git checkout -b <branch name>

切换并使用远程分支创建分支

git checkout -b <branch name> origin/<branch name>

此命令必须用在clone、fetch、pull等命令拉取分支之后才能用

这没创建的本地分支和远程分支是有对应关系的

 

git merge(合并分支)

此命令用于合并分支

 

自动合并

将指定分支合并到当前分支

git merge <branch name>

 

快进合并

在合并的时候,你应该注意到了"快进(fast-forward)"这个词。 由于当前 master 分支所指向的提交是你当前提交(有关 hotfix 的提交)的直接上游,所以 Git 只是简单的将指针向前移动。 换句话说,当你试图合并两个分支时,如果顺着一个分支走下去能够到达另一个分支,那么 Git 在合并两者的时候,只会简单的将指针向前推进(指针右移),因为这种情况下的合并操作没有需要解决的分歧——这就叫做 “快进(fast-forward)”。

可以使用 --no-ff参数来禁用Fast forward模式。

 

手动解决冲突

当两个分支存在冲突时需要手动解决冲突。

git merge <branch name>

执行合并后如果存在冲突则会提示

这时我们再查看冲突文件时,会增加<<<<<<< HEAD、=======、>>>>>>> dev2

手动处理冲突后,重新提交冲突文件

我们可以使用 git log --graph --pretty=oneline 命令查看冲突解决的的过程

 

git rebase(变基)

此命令用于使用编辑的方式来合并分支。

操作涉及到两个分支一个是提取补丁的分支我们暂且叫“补丁分支”,另一个是执行补丁的分支我们暂且叫“目标分支”。我们首先要将分支切换到“目标分支”

git checkout master

然后在“目标分支”中执行变基命令指定“补丁分支”

git rebase dev

变基过程中有可能会有冲突,处理冲突后我们需要选择继续、终止或跳过这次变基

 git rebase (--continue | --abort | --skip)

最后进行一次快进合并

git merge dev

看一下日志“补丁分支”的提交已经都在“目标分支”上执行了一次

 

git rebase -i (交互式变基)

交互式变基主要用于合并多次提交

$git rebase -i HEAD^^^

此时我们将除第一次提交以外的提交设置为squash(简写s)并保存,squash代表跟随之前的提交

然后系统提示合并前几次提交的说明

最后我们使用git log查看提交日志发现已经进行了合并

 

git stash(储藏场景)

此功能用于储藏当前场景。在我们开发某功能到一半的时候,突然要求临时修复一个bug,这时我们可以将当前代码储藏起来(当工作区或暂存区有未提交代码时不允许切换分支),待bug修复完成后再恢复继续进行工作。

储藏当前场景

git stash

带注释的储藏

git stash save "stash注释"

 

查看储藏的场景

git stash list

在这里我们看到,git可以存储多次。最新的在最上面,也就是越新的序号越小。

 

恢复并删除场景

git stash pop --index <stash@{id}>

--index 代表同时恢复暂存区内容,否则只恢复工作区

stash@{id} 为储藏编号 如果不指定默认恢复最新的也就是stash@{0}那条

 

恢复不删除场景

git stash apply --index <stash@{id}>

--index 代表同时恢复暂存区内容,否则只恢复工作区

stash@{id} 为储藏编号 如果不指定默认恢复最新的也就是stash@{0}那条

 

删除单个场景

git stash drop <stash@{id}>

stash@{id} 为储藏编号 如果不指定默认删除最新的也就是stash@{0}那条

 

清空整个储藏区

git stash clear

 

git remote(查看远程仓库)

git remote -v

-v参数可以查看更详细的信息

这里展示了抓取(fetch)和推送(push)的地址,如果没有推送权限则没有下面这一条。

 

 

git push(推送分支)

此命令用于将本地仓库变更推送到远程仓库中。远程仓库默认名称为origin。

 

当前分支代码推送

推送本地当前分支变更的代码,到默认对应的的远程分支。

git push

分支的对应关系被保存在config文件中。创建远程分支时使用-u参数关联。

我们可以使用 git branch -vv命令查看本地分支与远程分支的对应关系(参数是两个v不是w)

 

指定分支代码推送

git push origin <branch name>:<origin branch name>

<branch name> 本地分支名称

<origin branch name> 远程分支名称

如果本地分支与远程分支名称一致我们也可以不写远程分支名称

git push origin <branch name>

 

创建远程分支

将本地创建的分支推送到远程仓库

git push -u origin <branch name>

<branch name> 为要推送的分支名称

-u 表示添加本地分支与远程分支对应关系。此关系保存在config文件中。在我们使用pull和push不加参数时默认从这个关系的远程分支同步代码。

如果需要向远程分支push代码<branch name>和<origin new branch name>名称就必须一直。

我们也可以创建与本地分支不同名的远程分支

git push -u origin <branch name>:<origin branch name>

 

删除远程分支

讲一个空分支推送给远程分支实现删除操作。

git push origin :<origin branch name>

 

推送指定标签

 git push origin <tag name>

 

推送全部标签

 git push origin --tags

 

删除远程标签

讲一个空标签推送给远程分支实现删除操作。

git push origin :<origin tag name>

 

git fetch(拉取分支不合并)

此命令会将远程分支的变更拉取到本地,但是并不和本地分支进行合并。需要合并时使用git merge命令将远程分支和对应的本地分支进行合并。

git fetch

git pull(拉取分支自动合并)

此命令会将远程分支的变更拉取到本地,并和本地对应分支进行合并。

拉取所有远程分支到对应本地分支

git pull

 

拉取远程分支到当前分支

git pull origin <branch name>

 

git pull --rebase(拉取分支自动变基)

当我们希望拉取分支后执行的不是Merge而是rebase时我们可以使用此命令

git pull --rebase

我们也可以修改配置文件让pull默认执行rebase

git config --global pull.rebase true

 

git tag(标签)

标签记录了某一时刻的分支状态,不能前进也不能后退。

查看标签

git tag -n

-n 参数可以看到对应的注释

创建标签

创建当前分支当前提交的标签

git tag <name>

创建当前分支某一次提交的标签

git tag <name><commit code>

commit code为提交编号,使用git log可以查询到编号

创建附注标签

git tag -a v1.1 -m "标签说明"

在 Git 中创建一个附注标签是很简单的。 最简单的方式是当你在运行 tag 命令时指定 -a 选项

-m 选项指定了一条将会存储在标签中的信息。 如果没有为附注标签指定一条信息,Git 会运行编辑器要求你输入信息。

删除标签

git tag -d <name>

 

使用标签创建分支

git checkout -b branch_name tag_name

 

git show(查看信息)

此命令可以查看分支或标签的详细信息

git show <name>

 

© 著作权归作者所有

共有 人打赏支持
哼_哼
粉丝 8
博文 57
码字总数 77252
作品 0
哈尔滨
git文章列表

关于gitlab默认clone协议 Git实现从本地添加项目到远程仓库 翻翻git之---一个简单的标签控件 LabelView (随手发了两张小宝宝的玩耍照) Git 项目推荐 | Java 版微信普通号机器人 翻翻git之---...

d_watson
2016/04/20
26
0
日常使用 Git 的 19 个建议

本文由伯乐在线 -zaishaoyi 翻译,艾凌风 校稿。未经许可,禁止转载! 英文出处:Alex。欢迎加入翻译组。 我使用Git已经有4年之久,在这里想分享一些实用的小技巧,希望能对大家有所帮助。 ...

伯乐在线
2015/12/16
0
0
Git 常用命令速查

转自:http://www.jb51.net/article/55442.htm 一、 Git 常用命令速查 git branch 查看本地所有分支 git status 查看当前状态 git commit 提交 git branch -a 查看所有的分支 git branch -r ...

qulei1
2017/07/07
0
0
全栈必备——Git

为什么使用Git Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。大神就是大神,在开发了Linux之后,Git 是又一抗鼎之作。这是唯一的理由么? Git在软...

wireless_com
2016/07/02
0
0
笔记《版本控制之道--使用Git》

笔记《版本控制之道--使用Git》 我认为每个学过Git的人都应该做过类似这种笔记,因为Git命令太多看着看着就把前边看过的忘了,之前我也看过Git,但是一直没用,现在一看几乎没有印象了,所以...

gongweixin
2012/12/21
0
2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

49.Nginx防盗链 访问控制 解析php相关 代理服务器

12.13 Nginx防盗链 12.14 Nginx访问控制 12.15 Nginx解析php相关配置(502的问题) 12.16 Nginx代理 扩展 502问题汇总 http://ask.apelearn.com/question/9109 location优先级 http://blog....

王鑫linux
今天
1
0
Nginx防盗链、访问控制、解析php相关配置、Nginx代理

一、Nginx防盗链 1. 编辑虚拟主机配置文件 vim /usr/local/nginx/conf/vhost/test.com.conf 2. 在配置文件中添加如下的内容 { expires 7d; valid_referers none blocked server_names *.tes......

芬野de博客
今天
0
0
spring EL 和资源调用

资源调用 import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.PropertySource;import org.springframework.core.io.Resource;......

Canaan_
今天
1
0
memcached命令行、memcached数据导出和导入

一、memcached命令行 yum装telnet yum install telent 进入memcached telnet 127.0.0.1 11211 命令最后的2表示,两位字节,30表示过期时间(秒) 查看key1 get key1 删除:ctrl+删除键 二、m...

Zhouliang6
今天
1
0
Linux定时备份MySQL数据库

做项目有时候要备份数据库,手动备份太麻烦,所以找了一下定时备份数据库的方法 Linux里有一个 crontab 命令被用来提交和管理用户的需要周期性执行的任务,就像Windows里的定时任务一样,用这...

月夜中徘徊
今天
1
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部