GIT基础命令

一些基本的Git命令,备查。

基础配置

使用git config进行基础配置
查看配置文件所在的位置

1
$ git config --list --show-origin

初次使用配置全局用户名和邮箱,这些信息在commit的时候会用到

1
2
$ git config --global user.name "chibao"
$ git config --global user.email chibao@colorccm.com

以上配置是全局的,如果仅是对某个项目的设置,则不需要–golbal参数
查看所有的配置信息

1
2
$ git config --list
$ git config --list XXXX

创建仓库

使用ssh的方式访问,配置ssh用户;
在~/.ssh/authorized_keys文件中新增ssh key
终端中使用以下命令生成ssh key

1
$ ssh-keygen -t rsa

在服务器上使用git –bare init xxxxx创建仓库

1
$ git --bare init testproject

文件的生命周期与状态 status

untracked:
未被git跟踪变更的
unmodified:
已经跟踪但是未修改的
modified:
已经跟踪切已经修改的
staged/cached:
放入缓存区的
使用status命令查看各文件的状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)

new file: README
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: CONTRIBUTING.md
Untracked files:
(use "git add <file>..." to include in what will be committed)

README

nothing added to commit but untracked files present (use "git add" to track)

Changes to be committed:
使用add命令放入暂存区中准备提交的文件
Changes not staged for commit:
文件已经被跟踪,但是还没有add到暂存区中
Untracked files:
未跟踪文件,需要用add加入跟踪
使用 -s 参数可以简化信息
前面是状态,后面是文件名,其中状态有两位,第一位表示暂存区中文件的状态,第二位表示工作区中文件的状态

1
2
3
4
5
6
$ git status -s
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt

.gitignore的使用

.gitignore放在工程的根目录,用来控制哪些文件需要提交,哪些不需要
规则如下:

  • 所有空行或者以 # 开头的行都会被 Git 忽略。
  • 可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。
  • 匹配模式可以以(/)开头防止递归。
  • 匹配模式可以以(/)结尾指定目录。
  • 要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反
  • *glob语法规则**
  • 星号(*)匹配零个或多个任意字符
  • [abc] 匹配任何一个列在方括号中的字符
  • 问号(?)只匹配一个任意字符
  • [0-9] 表示匹配所有 0 到 9 的数字
    例子:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 忽略所有的 .a 文件
    *.a
    # 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件
    !lib.a
    # 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO
    /TODO
    # 忽略任何目录下名为 build 的文件夹
    build/
    # 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
    doc/*.txt
    # 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
    doc/**/*.pdf

    查看变更信息diff

    使用diff可以查看当前版本与上一版本的修改内容
    1
    2
    3
    4
    5
    6
    #工作区版本与暂存区版本的区别
    $ git diff
    #暂存区版本与上一提交版本的区别,暂存区是已经add过的文件
    $ git diff --cached
    #or
    $ git diff --staged

    提交变更commit

    使用commit命令可以将暂存区中的文件提交
    1
    2
    3
    4
    #将暂存区中的文件进行提交
    $ git commit -m "commit message"
    #直接将工作区中的文件进行提交
    $ git commit -a -m "commit message"
    如果不用-m参数,则会进入编辑器编辑版本信息

暂存stash

将当前工作区的内容进行暂存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#将所有未提交的内容进行暂存
$ git stash
$ git stash save "test"//添加一些注释
#将当前暂存的内容弹出到工作区
$ git stash pop //注意,暂存是使用栈堆的方式进行储存,先进后出,pop后会从栈堆中删除
$ git stash apply //功能同上,但是不会删除栈堆中的暂存内容
$ git stash apply stash名字
$ git stash applly stash@{1}
#删除某个stash
$ git stash drop stash名称
#清除stash
$ git stash clear
# 查看栈堆中最新的stash和工作区内容的差异
$ git stash show
$ git stash show -p //显示更加详细的信息
#从stash直接创建分区
$ git stash branch

移除文件rm

从工作区中删除,直接删除后进行commit

1
2
3
4
#从暂存区中删除,用rm命令,commit后该文件不再跟踪,工作区中的文件也会删除
$ git rm xxxxx
#仅从暂存区中删除,工作区中文件保留
$ git rm --cached xxxxx

移动文件mv

类似于重命名文件

1
$ git mv AAAA.txt BBBB.txt

查看提交历史log

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#按照提交顺序显示提交历史
$ git log
#显示前几行
$ git log -n
$ git long -10
#显示文件diff历史
$ git log -p
$ git log --patch
#显示统计信息
$ git log --stat
#格式化输出
$ git log --pretty=format:"%h - %an, %ar : %s"
#更多格式化参考 https://www.git-scm.com/book/zh/v2/ch00/pretty_format
#在一行显示信息
$ git log --pretty=oneline
#显示特定用户的信息
$ git log --author xxxxx
#过滤器
$ git log --grep xxxxx

撤销操作

内容没有变动,仅补充提交没有加入暂存区的文件,最终的提交只有一个

1
2
3
$ git commit -m "test"
$ git add some_files
$ git commit --amend

将文件从暂存区恢复到工作区,取消暂存

1
$ git reset HEAD xxxxx

将工作区中的文件恢复到原始(上一次未修改)的状态

1
$ git checkout -- xxxxx

远程仓库操作

查看当前项目的远程仓库

1
2
3
4
5
6
7
8
9
10
$ git remote
#查看远程仓库对应的url
$ git remote -v
#增加一个远程仓库
$ git remote add ssh://xxxx@xxxxxxx/xxxx.git
#推送到远程仓库
$ git push <remote> <branch>
$ git push origin master
#查看远程仓库的更多信息
$ git remote show origin

打标签

附注标签,会形成一个完整的版本信息,单独存储一个文件

1
2
3
4
5
6
7
#打上一个附注标签
$ git tag -a v1.0 -m "version 1.0"
#显示标签
$ git tag
$ git tab -l "v.1*"
#显示标签详细内容
$ git show v1.0

轻量标签,只是一个引用,并保存简单的信息

1
$ git tag v1.0 -m "version 1.0"

可以对历史上某个提交补充打标签

1
2
3
4
#查看历史上的版本
$ git log --pretty=oneline
$ git tag [-a] v0.1 -m "message" abcdefg
#abcdefg为某个版本的校验和,可以取版本前7位

推送标签至远程仓库

1
2
$ git push origin tag_name
$ git push origin v1.0

删除标签

1
2
3
4
5
6
7
8
#删除本地标签
$ git tag -d tag_name
$ git tag -d v1.0
#删除远程仓库的标签
$ git tag -d v1.0
$ git push origin :refs/tags/v1.0
#or
$ git push origin --delete v1.0

命令别名

通过config设置某些命令的别名

1
2
$ git config --global alias.alias_name "command"
$ git config --global alias.last 'log -1 HEAD'

分支管理

HEAD是当前工作区的一个指针
master是默认的分支
一个commit后的版本,包括commit对象(保存本次提交的信息)、tree对象(保存提交文件的目录结构与索引)、n个具体文件的blob对象
随着版本的提交,分支指针会不断前移
使用branch创建分支、使用checkout切换分支,切换分支时工作区会恢复成分支保存的保本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#新建一个分支
$ git branch branch_name
#切换分支,如果切换时两个分支之间有文件冲突,则需要commit后才能切换
$ git checkout branch_name
#可以在checkout的同时使用-b参数新建分支
$ git checkout -b branck_name
#如果新的分支上有文件修改并commit了,则项目发生分叉,后续需要进行合并
#使用以下命令查看分叉情况
$ git log --oneline --decorate --graph --all
#如果要将分支合并到master上,先切换到master后,再使用merge命令
$ git checkout master
$ git merge branch_name
#合并后,可以使用-d参数删除分支,未合并的分支删除时会报错
$ git branch -d branch_name

如果merge冲突了,则需要解决冲突后,add该文件,表示该文件已经完成冲突的解决
可以使用mergetool进行可视化的冲突解决

1
$ git mergetool

branch的一些其他用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#显示所有的分支
$ git branch
iss02
\* master
testing
#显示分支的提交情况
$ git branch -v
iss02 f719ac6 test conflict
\* master b1a0d88 [ahead 5] solut conflict
testing 3c472fc test branch testing
#显示已经合并的分支
$ git branch --merged
#显示未合并的分支
$ git branch --no-merged

远程分支

1
2
3
4
#查看远程分支的情况
$ git ls-remote origin
#拉取远程分支
$ git fetch origin

未完待续


GIT基础命令
http://blog.colorccm.com/2020/09/09/it/git/
作者
Chibao Chan
发布于
2020年9月9日
许可协议