一些基本的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
在服务器上使用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 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进行可视化的冲突解决
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
未完待续