Git 常用命令

168 阅读7分钟

Git - Book (git-scm.com)

配置

Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量。 这些变量存储在三个不同的位置:

  1. /etc/gitconfig 文件: 包含系统上每一个用户及他们仓库的通用配置。 如果在执行 git config 时带上 --system 选项,那么它就会读写该文件中的配置变量。 (由于它是系统配置文件,因此你需要管理员或超级用户权限来修改它。)
  2. ~/.gitconfig 或 ~/.config/git/config 文件:只针对当前用户。 你可以传递 --global 选项让 Git 读写此文件,这会对你系统上 所有 的仓库生效。
  3. 当前使用仓库的 Git 目录中的 config 文件(即 .git/config):针对该仓库。 你可以传递 --local 选项让 Git 强制读写此文件,虽然默认情况下用的就是它。。 (当然,你需要进入某个 Git 仓库中才能让该选项生效。)

每一个级别会覆盖上一级别的配置,所以 .git/config 的配置变量会覆盖 /etc/gitconfig 中的配置变量。

git config  core.autocrlf false                 禁止换行符转换
 
git config  merge.conflictstyle diff3           更改冲突文件冲突标记,显示公共祖先(未修改版本)。
git config  merge.tool vimdiff                  更改差异分析工具  
有kdiff3,tkdiff,meld,xxdiff,emerge,vimdiff,gvimdiff,ecmerge,和 opendiff 等合并工具

git config  user.name "John Doe"                更改用户名

git config  user.email johndoe@example.com      更改email

git config  core.editor "vim"                   使用vim编辑器

--global                                        更改全局配置文件

查看配置信息

git config [kay] [value]

--list          命令来列出所有 Git 当时能找到的配置
--show-origin   查看他们所在文件

通用

获取帮助

--help 详细  
-h  简略

特殊符号

\*  通配符   

HEAD 说明:

-   HEAD     表示当前版本
-   HEAD^    上一个版本
-   HEAD^^   上上一个版本
-   HEAD^^^  上上上一个版本
-   以此类推...

可以使用 ~数字表示

-   HEAD~0   表示当前版本
-   HEAD~1   上一个版本
-   HEAD^2   上上一个版本
-   HEAD^3   上上上一个版本
-   以此类推...

head可以替换成commit

仓库

创建仓库

git init 

克隆仓库

git  clone  oldRegisterUrl   newRegisterName

remote

git remote 
add [name] url                        添加远程仓库
show [name]                           查看远程仓库的更多信息
rename oldname newname                远程仓库的重命名
remove name                           删除远程仓库

分支

branch

git branch [brandchName]         新建分支
-d branchName                    删除分支
-v                               查看最后一次提交
-vv                              查看设置的所有跟踪分支
-u [remote/branch]               跟踪远程分支
--unset-upstream                 取消跟踪
--merged                         已经合并到当前分支的分支
--no-merged                      尚未合并到当前分支的分支 

checkout

git checkout [branchName]
-b newBranchName [remote/branch]    创建新分支[并追踪远程分支]
-- file                             用最近提交的版本覆盖掉它,任何修改都会消失

reset

git reset [--soft | --mixed  默认| --hard] [HEAD] [SHA-1 校验和] [file]

soft 更新head 和 当前分支指针 指向指定版本 mixed 更新指针和暂存区 hard 更新指针、暂存区和工作区间

工作

add

git add [file1] [file2]

-- all     添加所有变化到索引(暂存区)

restore

git restore  [file]    会撤销文件的修改,撤销到最近一次执行git add的内容。
--staged               把文件从暂存区移除,文件的修改不会受影响

commit

git commit [file1] [file2] 
-m [message] 
-a               相当于提前执行一次git add --all
--amend          覆盖前一次提交

mv

git mv [oldFile] [newFile]
-f                        强制执行

stash

贮藏(stash)会处理工作目录的脏的状态——即跟踪文件的修改与暂存的改动——然后将未完成的修改保存到一个栈上, 而你可以在任何时候重新应用这些改动(甚至在不同的分支上)。

git stash               储藏

list                    查看储藏内容
apply stash@{number}    应用储藏内容
drop  stash@{number}    移除储藏 

--keep-index            它告诉 Git 不仅要贮藏所有已暂存的内容,同时还要将它们保留在索引中。
-u                      Git 也会贮藏任何未跟踪文件
--all                   也会储藏被忽略文件
-q                      安静模式

rm

git rm [file]    从暂存区和工作区中删除
-f               强制删除已暂存文件
--cached         取消暂存,追踪
-r               递归

clean

从工作区中移除不想要的文件

-n        选项来运行命令, 这意味着“做一次演习然后告诉你 **将要** 移除什么”。
-d        命令来移除工作目录中所有未追踪的文件以及空的子目录
-f        意味着“强制(force)”或“确定要移除”,使用它需要 Git 配置变量 `clean.requireForce` 没有显式设置为 `false`。
-i        交互模式
-x        移除忽略文件

分析工具

status

-s         得到简短输出结果

diff

git diff [file] [branch]  比较工作目录中当前文件和暂存区域快照之间的差异
--cached/staged           查看暂存区快照与上次提交的差异[版本库]
branch1...branch2         显示自branch2与branch1 分支的共同祖先起,branch2分支中的工作。
brandh1 branch2           查看两个分支最新提交的差异
--check                   检查空白错误
-b                        忽略空白字符差异

blame

git blame [file]                      查看指定文件的修改历史

log

git log
-number 限制显示的日志条目数量
--authoer userName 查看某人的提交历史
-p              按补丁格式显示每个提交引入的差异。    
--graph          在日志旁以 ASCII 图形显示分支与合并历史。  
--oneline        --pretty=oneline --abbrev-commit 合用的简写。 


--stat          显示每次提交的文件修改统计信息。                                                     
--shortstat      只显示 --stat 中最后的行数修改添加移除统计。                                                                                             
--name-status    显示新增、修改、删除的文件清单。                                                      
--abbrev-commit  仅显示 SHA-1 校验和所有 40 个字符中的前几个字符。                                        
--relative-date  使用较短的相对时间而不是完整格式显示日期(比如“2 weeks ago”)。                                
           
--pretty         使用其他格式显示历史提交信息。可用的选项包括 oneline、short、full、fuller 和 format(用来定义自己的格式)。 
 

仅显示最近的 n 条提交。

`--since`, `--after`

仅显示指定时间之后的提交。

`--until`, `--before`

仅显示指定时间之前的提交。

`--author`

仅显示作者匹配指定字符串的提交。

`--committer`

仅显示提交者匹配指定字符串的提交。

`--grep`

仅显示提交说明中包含指定字符串的提交。

`-S`

仅显示添加或删除内容匹配指定字符串的提交。

合并

merge

git merge  [branch] [commit]
--abort                            恢复到你运行合并前的状态
-Xignore-space-change              忽略空白

rebase

原理是首先找到这两个分支(即当前分支 experiment、变基操作的目标基底分支 master) 的最近共同祖先 C2,然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件, 然后将当前分支指向目标基底 C3, 最后以此将之前另存为临时文件的修改依序应用。
如果提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基。

git rebase objectBranch [operatedBranch]

例子:

现在ceperiment指向c4
$ git checkout experiment
$ git rebase master

image.png

远程仓库交互

pull

自动抓取后合并该远程分支到当前分支

git pull <远程主机名> <远程分支名>:<本地分支名>

fetch

只会将数据下载到你的本地仓库——它并不会自动合并或修改你当前的工作。

$ git fetch <remote>

push

git push <remote> <branch>
git push remote --delete branch 从服务器上删除 分支

工具

tag

git tag 
-l [可使用通配符]
-a [versionName]                      创建标签
-d versionName                        删除标签

git push origin --delete <tagname>   删除远程仓库标签

grep

git grep string  
从提交历史、工作目录、甚至索引中查找一个字符串或者正则表达式
-n 显示行号
-c 输出概述信息
-p 输出上下文