Git 常用命令
Git 常用命令
@firestaradmin
人生好像很没意思,但总有很多人在享受着生活,我也不例外
[TOC]
Base cmd:
创建仓库命令
下表列出了 git 创建仓库的命令:
命令 | 说明 |
---|---|
git init |
初始化仓库 |
git clone |
拷贝一份远程仓库,也就是下载一个项目。 |
提交与修改
Git 的工作就是创建和保存你的项目的快照及与之后的快照进行对比。
下表列出了有关创建与提交你的项目的快照的命令:
命令 | 说明 |
---|---|
git add |
添加文件到仓库 |
git status |
查看仓库当前的状态,显示有变更的文件。 |
git diff |
比较文件的不同,即暂存区和工作区的差异。 |
git commit |
提交暂存区到本地仓库。 |
git reset |
回退版本。 |
git rm |
删除工作区文件。 |
git mv |
移动或重命名工作区文件。 |
提交日志
命令 | 说明 |
---|---|
git log |
查看历史提交记录 |
git blame <file> |
以列表形式查看指定文件的历史修改记录 |
远程操作
命令 | 说明 |
---|---|
git remote |
远程仓库操作 |
git fetch |
从远程获取代码库 |
git pull |
下载远程代码并合并 |
git push |
上传远程代码并合并 |
Config
Set global user config
git config --global user.name "firestaradmin"
git config --global user.email "firestaradmin@xxx.com"
List config
List all global config:
git config --global -l
List all local config:
git config --local -l
Core config
Core config is set to process file before you push it.
core.autocrlf=false
core.ignorecase=false
- autocrlf: whether the CRLF will be automatically converted.
- ignorecase: whether case file name sensitve.
Remote
Add remote
git remote add origin http:xxxxxxxxxxx/xxxx/xx
you can add multiple remotes, as follows:
git remote add origin1 http:xxxxxxxxxxx/xxxx/xx
git remote add origin2 http:xxxxxxxxxxx/xxxx/xx
git remote add gitee http:xxxxxxxxxxx/xxxx/xx
And then, you can push branch use the following command:
push originX localBranchX:remoteBranchX
- originx: the remote repository name
- localBranchX: the branch locally
- remoteBranchX: the branch of the remote will be uploaded.
Rename remote
git remote rename origin old-origin
Check remote address
git remote -v
Prune(清除已删除的远端分支缓存)
如果远端分支已经在其他地方删除了,那么本地其实还是会有显示远端分支,可以使用以下指令清除已删除的分支缓存。
git remote prune origin
Branch
branch 是分支管理命令。
Querrying all branches
git branch -avv
create a new branch
git branch (branchname)
or
git checkout -b local-branchname remote_name/remote_branchname
就可以新建本地 local-branchname 分支,并将远程分支映射到该分支,且设置追踪。
change current branch
git checkout (branchname)
or
git checkout -b (branchname)
if you add -b
, will auto create a new branch if the repository does not have it.
delete branch
delete local branch:
git branch -d (branchname)
- -d: 删除
- -D: 强制删除
delete remote branch:
git push origin --delete master
or
git push origin :master
delete lots branch
删除当前分支外的所有分支:
git branch | xargs git branch -d
删除分支名包含指定字符的分支:
git branch | grep 'dev*' | xargs git branch -d
这将会删除分支名包含’dev’字符的分支。
命令解释:|
管道命令,用于将一串命令串联起来。前面命令的输出可以作为后面命令的输入。
git branch
用于列出本地所有分支。
grep
搜索过滤命令。使用正则表达式搜索文本,并把匹配的行打印出来。
xargs
参数传递命令。用于将标准输入作为命令的参数传给下一个命令。
管道命令与xargs命令的区别:
管道
是实现 “将前面的标准输出作为后面的标准输入”, xargs
是实现 “将标准输入作为命令的参数”
Merge branch
合并前要先切回要并入的分支
以下表示要把issue1234分支合并入master分支
git checkout master
git merge issue1234
Checkout (合并|恢复 文件)
git checkout
除了可以切换分支,还可以进行合并操作,或者恢复文件到某个版本。
在git 里面,merge是全部文件merge ,没有单个文件的merge,所以这个时候可以使用 checkout。
git checkout <commit|branch|tag> <filePath|FolderPath>
这个命令的意思是把另一个分支的文件覆盖到当前的分支上。
一个好的建议是,不要在master上面操作,可以建立一个临时的分支,然后进行操作。
关于文件的回退,例如你改了这个文件,然后你想变回和某个版本一样的文件,那么你也可以使用该命令。
Pull
Normall, need use git fetch
before pull a branch form remote.
git fetch
将远程分支test_remote拉取下来到本地test分支, 如果本地没有该分支,自动创建
git checkout -b test origin/test_remote
从远程分支test 中checkout下来的本地分支test成为跟踪分支,使用git pull或者git push就会操作到对应的远程分支test
git pull test
Push
git push 命用于从将本地的分支版本上传到远程并合并。
命令格式如下:
git push <远程主机名> <本地分支名>:<远程分支名>
如果本地分支名与远程分支名相同,则可以省略冒号:
git push <远程主机名> <本地分支名>
如果本地版本与远程版本有差异,但又要强制推送可以使用 –force 参数:
**一般用于删除远程commit,比如错误的上传了commit4,不想要了,可以回退到commit3,然后重新push,加上 **
–force 就会吧commit3之后的commit 全部删除,谨慎使用!
git push --force origin master
智能人性化提示:在操作过程中,可能会需要使用 Clean 指令,删除Untracked file。
删除主机的分支可以使用 –delete 参数,以下命令表示删除 origin 主机的 master 分支:
git push origin --delete master
当你每次输入 git push origin master:master,是不是很麻烦
使用 -u
选项,输入一次命令,就可以直接跟踪本地分支和远程分支,以后在本分支下就直接输入 git push 即可
git push -u origin master:master
Commit
Submit a commit
git commit -m "这里是提交的说明信息"
Undo a commit
commit 之后想撤回咋办?
git reset --soft HEAD^
这样就成功的撤销了你的commit
注意,仅仅是撤回commit操作,您写的代码仍然保留。
HEAD^的意思是上一个版本,也可以写成HEAD~1
如果你进行了2次commit,想都撤回,可以使用HEAD~2
Change commit
commit 后发现写错了 信息,可以重写
git commit --amend
此时会进入默认vim编辑器,修改注释完毕后保存就好了。
Log
Format:
git log [<options>] [<revision range>] [[\--] <path>…]
Example:
常见的format选项:
#选项 #说明
%H 提交对象(commit)的完整哈希字串
%h 提交对象的简短哈希字串
%T 树对象(tree)的完整哈希字串
%t 树对象的简短哈希字串
%P 父对象(parent)的完整哈希字串
%p 父对象的简短哈希字串
%an 作者(author)的名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 -date= 选项定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者(committer)的名字
%ce 提交者的电子邮件地址
%cd 提交日期
%cr 提交日期,按多久以前的方式显示
%s 提交说明
Shell
注:作者是指最后一次修改文件的人;而提交者是指提交该文件的人。
git log --pretty=format:"%an %ae %ad %cn %ce %cd %cr %s" --graph
--mergs
- 查看所有合并过的提交历史记录--no-merges
- 查看所有未被合并过的提交信息--author=firestaradmin
- 查询指定作者@firestaradmin的提交记录
git log --author=firestaradmin
--since
,--affter
- 仅显示指定时间之后的提交(不包含当前日期)--until
,--before
- 仅显示指定时间之前的提交(包含当前日期)
git log --before={3,weeks,ago} --after={2018-04-18}
显示整个提交历史记录,但跳过合并
git log --no-merges
显示所有提交更改include/
或drivers/iic
子目录中的任何文件的所有提交
git log master include drivers/iic
显示更改builtin/rev-list.c
的提交,包括在文件被赋予其现有名称之前发生的提交。
git log --follow builtin/rev-list.c
显示文件main.c
中的函数main()
随着时间的推移而演变。
git log -L '/int main/',/^}/:main.c
将显示最近三次的提交。
git log -3
根据提交ID查询日志
git log commit_id #查询ID(如:6bab70a08afdbf3f7faffaff9f5252a2e4e2d552)之前的记录,包含commit
git log commit1_id commit2_id #查询commit1与commit2之间的记录,包括commit1和commit2
git log commit1_id..commit2_id #同上,但是不包括commit1
Shell
其中,commit_id可以是提交哈希值的简写模式,也可以使用HEAD代替。HEAD代表最后一次提交,HEAD^
为最后一个提交的父提交,等同于HEAD~1
,HEAD~2
代表倒数第二次提交--pretty
按指定格式显示日志信息,可选项有:oneline,short,medium,full,fuller,email,raw以及format:,默认为medium,可以通过修改配置文件来指定默认的方式。
$ git log (--pretty=)oneline
Clean (删除 untracked files)
删除 untracked files
git clean -f
连 untracked 的目录也一起删掉
git clean -fd
连 gitignore 的untrack 文件/目录也一起删掉 (慎用,一般这个是用来删掉编译出来的 .o之类的文件用的)
git clean -xfd
在用上述 git clean 前,墙裂建议加上 -n 参数来先看看会删掉哪些文件,防止重要文件被误删
git clean -nxfd
git clean -nf
git clean -nfd
Tag
git查询本地所有tag
git tag
本地新增无备注的tag
(默认在当前分支最后一个commit上添加tag)
git tag 标签名
git tag v1.1.0
本地新增有备注的tag
(默认在当前分支最后一个commit上添加tag)
git tag -a 标签名 -m “备注内容”
git tag -a v1.1.1 -m "测试"
在指定commit上新增tag
git tag 标签名 commit
(前几位也可以,尝试过最低3位报错,最好5位以上)
git tag v1.1.0 105851905c8a0f9cc040cf845b35c1ced1963fcc
将tag推送到远程分支
git push origin 标签名
git push origin v1.1.0
删除本地分支标签
git tag -d 标签名
git tag -d v1.1.0
删除远程分支标签
git push origin :refs/tags/标签名
git push origin :refs/tags/v1.1.0
or
git push origin :v1.1.0
or
git push origin --delete tag v1.1.0
Show tag info
git show tagXX
- tagXX: tag name
rm/Reset (undo)
仅仅删除暂存区里的文件
此时你想撤销错误添加到暂存区里的文件,可以输入以下命令:
git rm --cache 文件名
删除暂存区和工作区的文件
git rm -f 文件名
撤销操作
有时,不仅添加到了暂存区,而且commit到了版本库,这个时候就不能使用git rm了,需要使用git reset命令。
错误提交到了版本库,此时无论工作区、暂存区,还是版本库,这三者的内容都是一样的,所以在这种情况下,只是删除了工作区和暂存区的文件,下一次用该版本库回滚那个误添加的文件还会重新生成。
这个时候,我们必须撤销版本库的修改才能解决问题!
一般指令为:
git reset HEAD^
HEAD^的意思是上一个版本,也可以写成HEAD~1
如果你进行了2次commit,想都撤回,可以使用HEAD~2
可以加一些选项,如在commit后使用一下指令:
git reset --soft HEAD^
这样就成功的撤销了你的commit
注意,仅仅是撤回commit操作,您写的代码仍然保留。
选项:
–mixed
意思是:不删除工作空间改动代码,撤销commit,并且撤销git add . 操作
这个为默认参数,git reset –mixed HEAD^ 和 git reset HEAD^ 效果是一样的。
–soft
不删除工作空间改动代码,撤销commit,不撤销git add .
–hard
删除工作空间改动代码,撤销commit,撤销git add .
注意完成这个操作后,就恢复到了上一次的commit状态。
git submodule 子模块
添加引用
Git一个项目中引用其他Git仓库
// git submodule add [git地址] [目录位置]
$ git submodule add https://xxx/gittest.git src/gittest
目录位置为空的话,则会在当前目录创建名为引用仓库名称的文件夹。
使用submodule add
后自动在当前git目录下会生成一个 .gitmodules 文件
如果但当前目录已经存在了一个 .gitmodules,命令需要更改为
$ git submodule add -f https://xxx/gittest.git src/gittest
目录存放位置如果设置,会将clone下来的仓库存放在指定位置, 默认在当前目录下
拉取子仓库
如果在一个新的地方 克隆主仓库,那么主仓库下的子仓库是不会呗克隆的,只会创建一个文件夹,如果要一起克隆需要如下指令:
git clone https://xxx/gittest.git --recurse-submodules
这样取克隆就会自动克隆子仓库。
但是如果已经克隆了主仓库了,没有使用 --recurse-submodules
选项,那么可以如下操作:
git submodule init
git submodule update
就可以把子仓库进行克隆
更新子仓库
子仓库如果有版本变动,主仓库是一脸懵逼的,如果直接git status
或者 git pull
都不会自动拉去子仓库最新的版本,因为主仓库添加子仓库引用后的提交,对于子仓库是提交的是当时的版本号。
所以如果子仓库有更新,你需要去 cd
去子仓库手动 更新,然后再回主仓库 提交。
但是如果子仓库很多,可以使用:
git submodule foreach "git pull origin master"
以遍历所有子仓库
删除子仓库
如果不需要子仓库,使用一下指令:
1、删除子仓库信息和文件
git submodule deinit xxx/xxx
2、删除子仓库的残留
git rm xxx/xxx
.gitignore
.gitignore
file is a very useable file in git system.
it can help you to ignore some files you do not want upload to repository.
Format:
mtk/ 过滤整个文件夹
*.zip 过滤所有.zip文件
mtk/do.c 过滤某个具体文件
以上规则意思是:被过滤掉的文件就不会出现在你的GitHub库中了,当然本地库中还有,只是push的时候不会上传。
注意: mtk/
的意思是所有的mtk文件夹都忽略掉,如果只需要忽略git根目录下的 mtk 文件夹需要这样写: /mtk/
除了以上规则,它还可以指定要将哪些文件添加到版本管理中。
如 project
文件夹除了 stm32.proj
文件其他都忽略,示例:
project/*
!project/stm32.proj
当你需要不过滤一个特定文件时,该文件夹一定不能直接屏蔽,即 project/
, 这样就算底下设置了 !peoject/xxx.xx
也不会上传该文件。 一定要使用 project/*
这样子来过滤所有文件。
当有多级目录时,需要加入某个特定文件时:
//错误写法
**/node_modules/*//忽略文件夹node_modules
!**/node_modules/vue-html5-editor/dist/ //这样写是不生效的
//正确写法
**/node_modules/*
!**/node_modules/vue-html5-editor/
**/node_modules/vue-html5-editor/*
!**/node_modules/vue-html5-editor/dist
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!