Git 常用命令
配置
git config --list(-l): 列出所有配置项(system, global, local)git config --system -l: 列出系统级别配置git config --global -l: 列出全局配置git config --local -l: 列出针对当前仓库的配置git config <key>: 查看某个具体的配置项, 默认先查找本地配置(.git/config), 如果没找到,会继续查找全局配置(~/.gitconfig), 最后查找系统级别的配置。git config --[system | global | local] <key>: 查看某个级别下的某个具体的配置项git config <key> <value>: 设置本地配置项, 等同于git config --local <key> <value>git config --[system | global | local] <key> <value>: 设置某个级别下的某个具体的配置项git config --unset --[system | global | local] <key>: 删除某个级别下的某个配置
查看帮助
git help <command>: 打开某个命令的帮助文档,如git help config会在浏览器中打开config命令的完整文档git <command> --help(-h): 直接在终端中查看某个命令的简略帮助信息
常用命令
git init: 把当前文件夹初始化为 git 仓库git clone url/to/repository/projectname: 克隆远程仓库,会在当前目录创建一个名为projectname的文件夹,并初始化这个文件夹为本地 git 仓库,同时拉取远程仓库所有的数据到本地仓库。该命令会自动设置本地 master 分支跟踪远程 master 分支,执行完git clone命令之后,可以直接运行git pull命令,将远程 master 分支合并到本地 master 分支。git clone url/to/repository/projectname myproject: 作用同上个命令,只不过本地文件夹的名字可以自定义为myproject。git status/git status -s(--short): 查看当前目录的状态git diff <filename>: 查看当前未暂存 (unstaged) 的变更git diff --staged: 查看已暂存 (staged) 的变更git difftool: 打开图形界面查看未暂存的变更git commit: 启动编辑器,填写 commit message 然后退出编辑器(vim 退出命令为:wq),提交当前变更。git commit -m 'commit message': 不启动编辑器,直接在命令行里填写 commit message,并提交更新。git commit -a -m 'commit message': 跳过git add步骤, stage 和 commit 一步完成,-a表示git add *,既 stage 当前所有变更。git rm <file>/<directory>: 移除已提交且未更改的文件/文件夹,同时从版本库和本地目录中移除,移除文件之后再执行一次git commit命令完成移除操作。注意:
- 如果文件处于已更改或已暂存但未提交状态,要从版本库中移除该文件且从本地目录中删除,使用
git rm <file> -f命令。 - 如果文件处于已更改或已暂存但未提交状态,要从版本库中移除该文件但在本地目录中保留该文件,使用
git rm <file> --cached命令。 - 如果简单使用
rm <file>移除本地文件,要想从版本库中移除还需执行一次git rm <file>命令。
- 如果文件处于已更改或已暂存但未提交状态,要从版本库中移除该文件且从本地目录中删除,使用
git mv <file_from> <file_to>: 文件重命名git commit --amend: 启动编辑器,填写提交信息,并覆盖上一次已提交历史,该命令用于撤销上一次提交记录,并用本次提交替换上一次提交。git commit --amend -m 'commit message': 作用同上,但是不启动编辑器。git reset HEAD <file>: 取消暂存git checkout -- <file>: 撤销文件自上次提交以来的所有更改git remote: 展示关联的远程仓库的名字git remote -v: 同上,同时显示远程仓库的 urlgit remote add <shortname> romote/repository/url: 为本地仓库添加远程仓库,并命名为shortnamegit fetch <remote>: 获取远程仓库的最新数据到本地,但是不会自动与本地分支合并,需要手动合并。git pull <remote> <branch>: 拉取指定的远程分支到本地并与当前本地分支合并。git pull: 如果你当前所在分支已经设置为跟踪远程仓库的某个分支,执行该命令,将会自动 fetch 和 merge 远程分支的数据到本地分支git push <remote> <branch>: 将当前分支推送到远程分支git remote show <remote>: 查看远程仓库的详细信息git remote rename <oldname> <newname>: 重命名远程仓库的名字git remote remove <remote>: 删除远程仓库git stash: 贮藏当前工作目录未提交的更改git stash push -m <message>: 贮藏当前工作目录未提交的更改, 同时给该贮藏记录标记 messagegit stash -u: 贮藏当前工作目录未提交的更改,以及未跟踪的文件git stash list: 查看贮藏区列表git stash apply: 应用最近的一次贮藏记录到当前工作目录, 但是之前处于 staged 状态的变更会退回到 unstage 状态git stash apply <stash-name>: 应用指定的贮藏记录到当前工作目录git stash apply --index: 应用最近的一次贮藏记录到当前工作目录,同时恢复暂存区 (staged) 的状态git stash drop <stash-name>: 删除指定的贮藏记录,如果不提供<stash-name>将删除最新的一条贮藏记录git stash pop: 应用最近的一次贮藏到当前工作目录,同时删除该贮藏记录git stash clear: 清除所有贮藏记录git stash branch <branch>: 创建一个新分支<branch>, 并在这新分支上应用上次贮藏的记录,同时删除这条贮藏记录。git rm <file>: 同时从索引和工作空间中删除文件,commit 后版本库和本地的文件都会被删除。git rm --cached <file>: 从索引中删除的文件,但是不会在工作空间中删除,commit 后会在版本库中删除,但是本地会保留。用于取消某个文件的跟踪。
reset 和 checkout 命令
git reset --soft <commit-hash>: 使本地仓库回退到指定的历史提交点,该提交点以后的提交记录都将清除,但是工作空间不会发生变化,不会丢失数据,该命令是工作目录安全的。可用于修改历史提交记录。git reset <commit-hash>: 将本地仓库工作目录的状态回退到指定的 commit hash 对应的版本,该提交点以后的提交记录都将清除,但是工作空间不会发生变化,不会丢失数据,该命令是工作目录安全的。git reset <commit-hash> <file>: 将指定的文件的状态回退到指定的 commit hash 对应的版本,文件的内容不会发生变化,不会丢失数据,该命令是工作目录安全的。git checkout <commit-hash>: git 为你创建一个临时的 HEAD detached 分支,并切换到该分支,同时将工作目录回退到指定的 commit hash 对应的版本。该命令不会影响到其它分支,你可以在这个临时分支上做更改和提交。注意,只要你切换到其它分支,这个临时分支都将被自动删除,如果你要保留在这个临时分支上的变更和提交,你需要新建一个分支:git checkout -b <new-branch>, 这样 git 将切换到新的分支,并自动删除这个临时分支。git checkout -b <branch> <commit-hash>:git checkout <commit-hash>和git checkout -b <branch>命令的简写。git checkout <commit-hash> <file>: 将指定的文件回退到指定的 commit hash 对应的版本,文件的内容会发生变化,会丢失数据,该命令不是工作目录安全的。
git log 查看提交历史
git log --patch(-p): 展示每次提交引入的变更git log -n: 展示最近 n 次提交记录git log --stat / --shortstat: 展示每次提交的变更的统计信息git log --pretty=oneline: 以单行展示每一次提交的简略信息git log --pretty=format:"%h %s": 指定输出的格式Option Description of output %H 提交的完整 hash %h 提交 hash 的简写(前 7 个字符) %an 作者名字 %ae 作者 email %ad author 时间,绝对时间 %ar author 时间,相对时间 %s 提交信息 %cn 提交者名字 %ce 提交者 email %cd 提交时间,绝对时间 %cr 提交时间,相对时间 git log --pretty=format:"%h %s" --graph: adds a nice little ASCII graph showing your branch and merge historygit log --abbrev-commit: Show only the first few characters of the SHA-1 checksum instead of all 40git log --oneline:git log --pretty=oneline --abbrev-commit的简写git log --relative-date: Display the date in a relative format (for example, “2 weeks ago”) instead of using the full date formatgit log --since= / --after=: 展示指定日期之后的的提交历史,可以是"2019-03-23","2 years 1 day 3 minutes ago这样的格式git log --until= / --before=: 展示指定日期之前的的提交历史,同上git log --author=: Only show commits in which the author entry matches the specified string.git log --grep=: Only show commits with a commit message containing the stringgit log -S: Only show commits adding or removing code matching the stringgit show <commit-hash>: 查看指定的 hash 所对应的提交记录git log -- <file>: 查看指定文件的提交历史,只显示提交记录,不包含该文件每次的变更信息git log -p <file>: 查看指定文件的提交历史,包含该文件每次的变更信息gitk <file>: 打开 GUI 查看指定文件的提交历史
分支
git branch <newBranch>: 创建一个新分支,但不会切换到该新分支git checkout <branch>: 切换分支. (注意:如果本地仓库当前不存在branch分支,而要切换的分支名正好匹配唯一远程仓库的某个分支名,使用该命令将自动创建一个跟踪远程同名分支的branch分支,并切换到该分支)git checkout -b <branch>: 创建一个新分支,并切换到该分支git checkout -b <local_branch> <remote/branch>: 创建并切换到一个新的本地分支local_branch, 同时让它跟踪远程remote/branch分支git checkout --track <remote/branch>: 是上面的命令的简写,创建一个与远程branch分支同名的本地分支branch,并跟踪该远程分支git merge <branch>: 将指定分支合并到当前分支git branch -d <branch>: 删除分支git branch: 显示所有本地分支git branch -v: 显示所有分支以及在它们上面的最后一次提交git branch -vv: 显示所有本地分支跟踪远程分支的信息git branch --merged: 显示已经合并到当前分支的分支git branch --no-merged: 显示还未合并到当前分支的分支git push <remote> --delete/-d <branch>: 删除远程<branch>分支git push <remote> <branch>: 将本地分支<branch>推送到远程分支,会在远程生成一个同名的分支git branch -u <remote>/<branch>将当前分支设置为跟踪远程<remote>/<branch>分支
打标签
git tag: 列出已有标签git tag -l 'mode': 使用特定的模式查找标签,例如git tag -l 'v1.8.*',会列出 v1.8 系列git tag <tagName>: 打轻量标签,例如git tag v1.2git tag -a <tagName> -m <message>: 打附注标签,例如git tag -a v1.2 -m 'my version 1.2'git tag -a <tagName> <commit-hash>: 给历史提交打标签git push <remote> <tagName>: 将指定标签推送到远程仓库git push <remote> --tags: 将本地所有标签推送到远程仓库git show <tagName>: 查看标签信息git tag -d <tagName>: 删除本地标签,远程仓库的这个标签不会被删除git push <remote> :refs/tags/<tagName>: 本地删除标签后是用该命令来同步远程仓库
只拉取远程仓库的某个目录或某些目录
git init
git config core.sparsecheckout true
echo '/directory/*' >> .git/info/sparse-checkout
git remote add origin <remote-url>
git checkout -b <local-branch> <remote/branch>
git pull
凭据管理
git config --global credential.helper store: 凭证用明文的形式存放在磁盘中,并且永不过期。这意味着除非你修改了你在 Git 服务器上的密码,否则你永远不需要再次输入你的凭证信息。这种方式的缺点是你的密码是用明文的方式存放在你的 home 目录下git config --global credential.helper 'store --file ~/.my-credentials': "store" 模式可以接受一个--file <path>参数,可以自定义存放密码的文件路径(默认是 ~/.git-credentials )git config --global credential.helper cache: 将凭证存放在内存中一段时间。 密码永远不会被存储在磁盘中,并且在15分钟后从内存中清除。git config --global credential.helper 'cache --time 3600': "cache" 模式有--timeout <seconds>参数,可以设置后台进程的存活时间(默认是 900,也就是 15 分钟)