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~1HEAD~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 协议 ,转载请注明出处!