Git

00 Commit规范和Messages 阅读更多

0.1. 规范 0.1.1. Header 0.1.2. Body 0.1.3. Footer 0.1.4. commit.template 0.2. Messages 0.2.1. 使用祈使句 0.2.2. 首字母大写 0.2.3. 尽量做到只看注释便可明白而无需查看变更内容 0.2.4. 使用信息本身来解释“原因”、“目的”、“手段”和其他的细节 0.2.5. 避免使用无上下文的信息 0.2.6. 限制每行字数 0.2.7. 保持语言的一致性 0.1. 规范 参考 Angular 团队的 commit 规范。 <type>(<scope>): <subject> // 空一行 <body> // 空一行 <footer> 分别对应 Commit message 的三个部分: Header , Body 和 Footer 。 0.1.1. Header Header 部分只有一行,包括三个字段: type (必需)、 scope (可选)和 subject (必需)。 type : 用于说明 commit 的类型。一般有以下几种: feat: 新增feature fix: 修复bug docs: 仅仅修改了文档,如readme.md style: 仅仅是对格式进行修改,如逗号、缩进、空格等。不改变代码逻辑 refactor: 代码重构,没有新增功能或修复bug perf: 优化相关,如提升性能、用户体验等 test: 测试用例,包括单元测试、集成测试 chore: 改变构建流程、或者增加依赖库、工具等 revert: 版本回滚 scope : 用于说明 commit 影响的范围,比如: views, component, utils, test... subject : commit 目的的简短描述 0.1.2. Body 对本次 commit 修改内容的具体描述, 可以分为多行。如下所示: # body: 72-character wrapped. This should answer: # * Why was this change necessary? # * How does it address the problem? # * Are there any side effects? # initial commit 0.1.3. Footer 一些备注, 通常是 BREAKING CHANGE (当前代码与上一个版本不兼容) 或修复的 bug(关闭 Issue) 的链接。 0.1.4. commit.template # 这个命令只能设置当前分支的提交模板 git config commit.template [模板文件名] # 这个命令能设置全局的提交模板,注意global前面是两杠 git config --global commit.template [模板文件名] 新建 .gitmessage.txt (模板文件) 内容可以如下: # headr: <type>(<scope>): <subject> # - type: feat, fix, docs, style, refactor, test, chore # - scope: can be empty # - subject: start with verb (such as 'change'), 50-character line # # body: 72-character wrapped. This should answer: # * Why was this change necessary? # * How does it address the problem? # * Are there any side effects? # # footer: # - Include a link to the issue. # - BREAKING CHANGE # 0.2. Messages 原仓库地址。 0.2.1. 使用祈使句 # good Use InventoryBackendPool to retrieve inventory backend // 用 InventoryBackendPool 获取库存 # bad Used InventoryBackendPool to retrieve inventory backend // InventoryBackendPool 被用于获取库存 commit 信息描述的是引用的变更部分实际上做了什么,它的效果,而不是因此被做了什么。 0.2.2. 首字母大写 # Good Add `use` method to Credit model # Bad add `use` method to Credit model 首字母大写的原因是遵守英文句子开头使用大写字母的语法规则。 0.2.3. 尽量做到只看注释便可明白而无需查看变更内容 # Good Add `use` method to Credit model // 为 Credit 模块添加 `use` 方法 # Bad Add `use` method // 添加 `use` 方法 --- # Good Increase left padding between textbox and layout frame // 在 textbox 和 layout frame 之间添加向左对齐 # Bad Adjust css // 就改了下 css 它在许多场景中(例如多次 commit、多个更改和重构)非常有用,可以帮助审查人员理解提交者的想法。 0.2.4. 使用信息本身来解释“原因”、“目的”、“手段”和其他的细节 # Good Fix method name of InventoryBackend child classes Classes derived from InventoryBackend were not respecting the base class interface. It worked because the cart was calling the backend implementation incorrectly. # Good Serialize and deserialize credits to json in Cart Convert the Credit instances to dict for two main reasons: - Pickle relies on file path for classes and we do not want to break up everything if a refactor is needed - Dict and built-in types are pickleable by default # Good Add `use` method to Credit Change from namedtuple to class because we need to setup a new attribute (in_use_amount) with a new value 信息的主题和正文之间用空行隔开。其他空行被视为信息正文的一部分。 像“-”、“*”和“\”这样的字符可以提高可读性。 0.2.5. 避免使用无上下文的信息 # Bad Fix this Fix stuff It should work now Change stuff Adjust css 0.2.6. 限制每行字数 Pro Git Book建议: 主题最多使用50个字符, 正文最多使用72个字符。 0.2.7. 保持语言的一致性 对于项目所有者而言:选择一种语言并使用该语言编写所有的 commit 信息。理想情况下,它应与代码注释、默认翻译区域(用于本地化项目)等相匹配。 对于贡献者而言:使用与现有 commit 历史相同的语言编写 commit 信息。 # Good ababab Add `use` method to Credit model efefef Use InventoryBackendPool to retrieve inventory backend bebebe Fix method name of InventoryBackend child classes # Good (Portuguese example) ababab Adiciona o método `use` ao model Credit efefef Usa o InventoryBackendPool para recuperar o backend de estoque bebebe Corrige nome de método na classe InventoryBackend # Bad (mixes English and Portuguese) ababab Usa o InventoryBackendPool para recuperar o backend de estoque efefef Add `use` method to Credit model cdcdcd Agora vai

01-Git基础 阅读更多

版本控制演变过程 VCS出现之前 用目录拷区别不同版本 公共文件容易被覆盖 成员沟通成本很高,代码集成效率低下 集中式VCS/SVN 有集中的版本管理服务器 具备文件版本管理和分支管理能力 集成效率有明显地提高 客户端必须时刻和服务器相连 分布式VCS/SVN 服务器和客户端都有完整的版本库 脱离服务端,客户端照样可以管理版本 查看历史和版本比较等多数操作,都不需要访问服务器,比集中式VCS更能提高版本管理效率 Git的特点 最优的存储能力 非凡的性能 开源 很容易做备份 支持离线操作 容易定制工作流程 注意 所有的版本控制系统,只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。 而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。 Microsoft的Word格式是二进制格式,版本控制系统是没法跟踪Word文件的改动的,如果要真正使用版本控制系统,就要以纯文本方式编写文件。 因为文本是有编码的,强烈建议使用标准的UTF-8编码,所有语言使用同一种编码,既没有冲突,又被所有平台所支持。 安装git Linux sudo apt-get install git //Debain or Ubunt sudo yum install git //Redhat or Centos 老版本可能叫 git-core。 Mac OS X 安装homebrew,然后通过homebrew安装Git,具体方法请参考homebrew文档。 直接从AppStore安装Xcode,Xcode集成了Git,不过默认没有安装,你需要运行Xcode,选择菜单“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就可以完成安装了。 Windows 在Windows上使用Git,可以从Git官网直接下载安装程序,然后按默认选项安装即可。 安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功! Git最小化配置 配置user.name和user.email git config --global user.name 'your_name' git config --global user.email 'your_email' Git的三个作用域 优先级: local > global > system 缺省等同于local git config --local #local只对仓库有效 git config --global #global对登录用户所有仓库有效 git config --system #system对系统的所有用户有效 显示config的配置,加--list git config --list --local git config --list --global git config --list --system 设置,缺省等同于local git config --local git config --global git config --system 清除设置 git config --unset --local user.name git config --unset --global user.name git config --unset --system user.name 创建Git仓库 两种场景 把已有的项目代码纳入到Git管理 cd <项目代码所在文件夹> git init 新建的项目直接使用Git管理 cd <某个文件夹> git init project_name #会在当前路径下创建和项目名称相同的文件夹 cd project_name Git暂存区 git add . # 将当前路径下所有的文件都添加到暂存区中 git add <file> # 将<file>t添加到暂存区中 git add -u # 将已经被git追踪的文件进行更新 git reset -head # 重置HEAD、索引和工作区 git mv a b # 将被git追踪的文件a重命名为b并添加到暂存区中 Git版本历史 git log oneline # 查看简洁的历史 git log -n<number> #显示最近的n次日志 git log --all # 查看全部日志 git log --graph # 显示为图片 查看本地分支 git branch -v Git图形界面 # 安装gitk工具 sudo apt-get install gitk # 在git仓库目录下打开工具 gitk .git目录 drwxr-xr-x branches/ -rw-r--r-- COMMIT_EDITMSG -rw-r--r-- config # 本地仓库(local)相关配置 -rw-r--r-- description -rw-rw-r-- FETCH_HEAD -rw-rw-r-- gitk.cache -rw-rw-r-- HEAD # 指向仓库当前工作的分支 drwxr-xr-x hooks/ -rw-rw-r-- index drwxr-xr-x info/ drwxr-xr-x logs/ drwxr-xr-x objects/ #文件夹中的子文件夹都是以哈希值的前两位字符命名每个object由40位字符组成,前两位字符用来当文件夹,后38位做文件 drwxr-xr-x refs/headers # 分支 drwxr-xr-x refs/tags # 里程碑git cat-file # 命令 显示版本库对象的内容、类型及大小信息 git cat-file -t b44dd71d62a5a8ed3 # 显示版本库对象的类型 git cat-file -s b44dd71d62a5a8ed3 # 显示版本库对象的大小 git cat-file -p b44dd71d62a5a8ed3 # 显示版本库对象的内容 git中的对象: commit:一次提交生成一个tree tag:里程碑 tree:保存对应commit时间点,仓库中文件与目录的结构以及其中的内容 blob:表示一个文件,与文件名无关与文件内容有关 通常,blob表示一个文件,tree表示一个文件夹。 在Git中,文件内容相同的文件就是唯一的一个blob。 没有文件也就是没有blob对象的目录是不会被git管理的,因为git要对文件进行版本管理,所以没有必要对空目录生成对象。基于这一点,假设readme文件的全路径是这样:[仓库根目录]/doc/readme。那么tree的数量与全路径中“/”的数量一致。 即,有几层文件夹,就有几个tree。 一个commit对应一个tree,这个是root节点。 分离头指针(HEAD) git checkout <commit ID> 可用于在对应commit下进行实验性尝试,尝试完成后直接切换回原分支即可。 Git认为没有与分支或tag绑定的commit都应该丢弃。 HEAD与branch HEAD可以指向分支的最后一次commit HEAD也可以指向某一个具体的commit HEAD永远指向commit。 git diff <commit ID> <commit ID> # 比较两次commit的差异 git diff HEAD HEAD^1 # 比较HEAD与HEAD前的一个commit # HEAD^^ == HEAD~2

02-常见场景 阅读更多

删除不需要的分支 git branch -d/-D <分支名> 修改最新commit的message git commit -amend # :wq! 保存退出 修改旧commit的message git rebase -i <commitID的parent> # 在交互界面中进行如下操作 # 步骤一,选择要进行的操作 #:wq! # 步骤二,进行操作 # :wq! 已经集成到团队分支中,不可进行这样的操作。 合并多个连续的commit git rebase -i <commitID的parent> # 在交互界面进行如下操作 # 步骤一,选择一个pick和多个squash # : wq! # 步骤二,新增一条commit message # : wq! 合并多个间隔的commit git rebase -i <commitID的parent> # 如果某个commit没有父commit,那么就选择该commit后,手动将它添加到交互界面中 # 将需要合并的commit剪切到一起,需要被合并的修改为squash,不变的依然是pick # :wq! git rebase --continue # 修改commit信息 # :wq! 比较暂存区和HEAD所含文件的差异 git diff --cached 比较工作区和暂存区所含文件的差异 git diff # 比较工作区和暂存区的所有文件 git diff -- <file> # 比较该文件在工作区和暂存区的差别 将暂存区恢复成与HEAD一致 git reset HEAD #针对暂存区全部文件 git rest HEAD -- <file1> <file2># 针对暂存区中某个文件 将工作区文件恢复成与暂存区一致 git checkout # 针对工作区全部文件 git checkout -- <file> # 针对工作区某个文件 消除最近的几次提交 git reset --hard <commitID> # commitID之后的commit记录都会被删除 查看不同提交的指定文件的差异 git diff <branch1> <branch2> # 比较两个分支全部文件的不同 git diff <commitID1> <cimmitID2> git diff <branch1> <branch2> -- <file> # 比较两个分支中指定文件的不同 git diff <commitID1> <cimmitID2> -- <file> 正确删除文件的方法 git rm <file> 临时加塞紧急任务如何处理 git stash # 将当前工作区中文件存入临时堆栈中 git stash list # 查看临时堆栈中内容 git stash apply # 复制临时堆栈的内容到工作区 git stash pop <stash序号> # 提取临时堆栈的内容到工作区,默认为顶部内容 指定不需要Git管理的文件 .gitignore文件 空行不匹配任何文件,因此它可以作为可读性的分隔符。 以#开头的行作为注释。对于以哈希开头的模式,在第一个哈希前面加一个反斜杠(“\”)。 除非使用反斜杠(“\”)引用尾随空格,否则将忽略尾随空格。 可选前缀“!”否定了这种模式;之前模式排除的任何匹配文件将再次包含在内。如果排除该文件的父目录,则无法重新包含文件。出于性能原因,Git不会列出排除的目录,因此无论在何处定义,所包含文件的任何模式都不起作用。在第一个“! ”前放一个反斜杠(“\”)对于以文字“!”开头的模式,例如“\!important!.txt”。 如果模式以斜杠结尾,则为了以下描述的目的将其删除,但它只会找到与目录的匹配项。换句话说,foo /将匹配目录foo和它下面的路径,但是不匹配常规文件或符号链接foo(这与pathpec在Git中的工作方式一致)。 如果模式不包含斜杠/,Git将其视为shell glob模式,并检查相对于.gitignore文件位置的路径名匹配(相对于工作树的顶层,如果不是来自.gitignore)文件)。 否则,Git将模式视为shell glob:“*”匹配除“/”,“?”之外的任何内容。匹配除“/”之外的任何一个字符,“[]”匹配所选范围中的一个字符。有关更详细的说明,请参阅fnmatch(3)和FNM_PATHNAME标志。 前导斜杠与路径名的开头匹配。例如,“/*.c”匹配“cat-file.c”但不匹配“mozilla-sha1 / sha1.c”。 与完整路径名匹配的两个连续星号(“**”)可能具有特殊含义: 前面的斜杠“”表示匹配所有目录。例如,“/foo”在任何地方匹配文件或目录“foo”,与模式“foo”相同。 “**/foo/bar”将文件或目录“bar”与直接位于“foo”目录下的任何位置匹配。 尾随“/”匹配内部的所有内容。例如,“abc/”匹配目录“abc”内的所有文件,相对于.gitignore文件的位置,具有无限深度。 斜杠后跟两个连续的星号,然后斜杠匹配零个或多个目录。例如,“a/**/b”匹配“a/b”,“a/x/b”,“a/x/y/b”等。 其他连续的星号被认为是常规星号,并且将根据先前的规则匹配。 将Git仓库备份 git clone --bare <协议及仓库地址> # 不带工作区的裸仓库 git remote -v # 查看远端仓库 git remote add <remove name> <协议及仓库地址> git push --set-upstream 常用传输协议 常用协议 语法格式 说明 本地协议1 /path/to/repo.git 哑协议 本地协议2 file:///path/to/repo.git 智能协议 http/https协议 http(s)://git-server.com:port/path/to/repo.git 平时接触到的都是智能协议 ssh协议 user@git-server.com:path/to/repogit 工作中最常用的智能协议 哑协议与智能协议 直观区别:哑协议传输进度不可见,智能协议可见 传输速度:智能协议比哑协议快

03-Git与GitHub同步 阅读更多

配置公私钥 创建SSH Key 在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key: ssh-keygen -t rsa -b 4096 -C "youremail@example.com" 在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对: id_rsa是私钥,不能泄露出去 id_rsa.pub是公钥,可以放心地告诉任何人 登陆GitHub 打开“Account settings”,“SSH Keys”页面 点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容 点“Add Key”,就应该看到已经添加的Key 为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。 当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。 把本地仓库同步到GitHub 在本地创建了一个Git仓库后,想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作。 登陆GitHub 在右上角找到“Create a new repo”按钮,创建一个新的仓库 在Repository name填入仓库的名字(如 my_repo),其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库 在GitHub上的这个my_repo仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。 根据GitHub的提示,在本地的my_repo仓库下运行命令: git remote add origin git@github.com:<your Github name>/my_repo.git # 根据github页面给的提示输入命令即可 添加后,远程库的名字就是origin(这是Git默认的叫法,也可以改成别的),但是origin这个名字一看就知道是远程库。 最后,就可以把本地库的所有内容推送到远程库上: git push -u origin master 把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。 由于远程库是空的,第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送到远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。 推送成功后,可以立刻在GitHub页面中看到远程库的内容已经和本地一模一样。 从现在起,只要本地作了提交,就可以通过命令: git push origin master 把本地master分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式版本库! 将本地和远程库集成 将远程库的变更拉取到本地 git fetch <remote name> <branch name> 将拉取的远程库和本地库合并 git merge <remote name>/<branch name> # 将历史相关(父子关系的,即两个分支非fast forward)的分支 git merge --allow-unrelated-histories <remote name>/<branch name> # 将历史不相关的分支合并 # 修改merge message # :wq! 注意: git pull = git fetch + git merge 从远程库克隆 假设我们从零开发,那么最好的方式是先创建远程库,然后,从远程库克隆。 登陆GitHub,创建一个新的仓库,名字叫zero 勾选Initialize this repository with a README,这样GitHub会自动为我们创建一个README.md文件。创建完毕后,可以看到README.md文件 远程库已经准备好了,下一步是用命令git clone克隆一个本地库: git clone git@github.com:<your github name>/zero.git #在页面的右上角可以直接复制该链接 进入本地的目录就可以看到初始化创建的README.md文件 如果有多个人协作开发,那么每个人各自从远程克隆一份就可以了。 GitHub给出的地址不止一个,还可以用 https://github.com/yourgithubname/zero.git 这样的地址。 实际上,Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。 使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。

04-Git多人单分支集成协作 阅读更多

不同人修改不用文件 # 用户一的操作 git branch -av # 查看仓库中全部的分支(包括本地和远程) git checkout -b feature/add_git_commands origin/feature/add_git_commands # 基于远程仓库的分支origin创建本地分支,并切换到新建的分支上 git branch -v # 只查看本地分支 git push <远程仓库名称,默认是origin>/<分支的名称> # 将当前分支推送到远程仓库中对应的分支 # 因为创建时有本地分支和远程仓库中的分支有关联关系,上述命令可以缺省远程仓库中分支的选择 # 用户二的操作 git fetch <远程仓库的名字,默认为origin> # 将远程仓库中分支的变更都同步到本地仓库 git merge <远程仓库名>/<远程仓库分支名> # 将本地当前分支与远程仓库中的指定分支合并 # 填写merge信息,然后 :wq! git push 不同人修改同文件不同区域 开发之前先同步远程仓库 # 操作方式一 git pull # 同步远程仓库中的代码,并且与本地分支进行合并 # 操作方式二 git fetch # 将本地仓库中远程分支与远程仓库中对应的分支进行同步 git merge <远程仓库名>/<远程仓库分支名> # 将本地当前分支与本地仓库的远程分支合并 # 填写merge信息,然后 :wq! 不同人修改同文件同区域 <<<<< # 这里是本地的文件内容 ==== # 这里是远程仓库的文件内容 >>>>> # 直接在文件上进行修改,将需要的内容保留,不需要的内容删除 git commit # 提交解决的冲突 git push # 将解决后的commit推送到远程仓库中 git merge --abort # 放弃解决的冲突 同时变更文件名和文件内容 git存放blob文件时是以文件内容来区分的,并不以文件名来区分;此处的变更文件名操作和变更文件内容的操作能够自动被git处理,原因就在于blob文件并没有发生修改的冲突。 如果既变更了文件名又修改了文件,同时另一个人也修改了该文件的同一位置的内容,就会被git识别为冲突,而不能自动进行处理了。 git mv file1 file2 git pull # git能够智能感知到文件名的变化,因为是git是基于文件内容区分的 同时修改同一文件名 git会报告冲突,自行判断要使用哪个文件名,然后在提交。 git add <需要的filename> git rm <不需要的filename> 禁止向集成分支执行push -f操作 git push -f # 强制更新 禁止向集成分支执行变更历史操作 公共分支禁止rebase。

06-GitHub使用指南 阅读更多

GitHub为什么这么火 共享和搜索开源项目 让Git更容易使用 使协作和编写软件更容易 GitHub的核心功能 code review project management integrarion team management social coding document code hosting 快速搜索感兴趣的开源项目 搜索技巧 in关键字 xxx in:name 项目名包含xxx的 xxx in:description 项目描述包含xxx的 xxx in:readme 项目的readme文件中包含xxx的 xxx in:name,desciption来组合使用 star或fork数查找项目 通过通配符 > < = 即可,区间范围内可通过 num1..num2 xxx stars:>600 xxx forks:>500 xxx forks:100..200 stars:200..300 awesome xxx 分享项目中某一行代码 只需要在具体的网址后面拼接#Lxx(xx为行数),浏览器访问 发现高亮显示了 当然也可以段落进行高亮显示#Lxx-xx 项目内搜索 打开你想要搜索的项目,然后按一下‘T’键。会跳转至一个新的网页,然后输入想要搜索的文件名 搜索某地区大佬 location:shanghai language:java 开源项目怎样保证代码质量 GItHub使用PR进管理。 为何需要组织类型的仓库 仓库 成员 团队

07-常用命令列表 阅读更多

命令 描述 git add <filename> 添加修改后的文件 git commit -m "describe" 提交修改 git status 查看仓库当前状态 git diff 查看文件的区别 git log 查看历史版本 git reset --hard 回退到上一个版本 git reflog 记录每一次执行的命令 git checkout -- <filename> 把工作区的修改撤掉(让文件回到最近一次git add或git commit之前那一刻的状态) git reset HEAD <filename> 把暂存区的修改撤销掉 (HEAD 表示最新版 HEAD^b表示上一版本,HEAD为一个指针) git rm <filename> 删除文件 git push origin master 把本地内容推送到远程(第一次推送分支时,用-u参数) git clone 克隆一个远程仓库到本地(Git支持多种协议) git branch 查看当前仓库中的所有分支(当前分支用*标记出) git branch <branchname> 创建分支 git checkout <branchname> 切换到分支 git merge <branchname> 合并指定分支到当前分支 git log --graph 查看分支合并图 git stash 保存当前工作现场(暂存区) git stash list 显示保存的所有工作现场 git stash pop 恢复之前保存的工作现场并把保存在stash列表中的内容删除 git stash apply 恢复之前保存的工作现场保留保存在stash列表中的内容 git stash drop 把保存在stash列表中的内容删除 git remote 查看远程仓库信息 git push origin <分支名称> 把该分支上的所有本地文件推送到远程仓库 git clone 克隆一个远程仓库到本地 git pull 从远程拉取最新的分支 git tag <name><commit ID> 打一个新标签或者查看所有标签 git show <tagname> 查看tag的说明文字 git push origin <tagname> 推送某个标签到远程 git push origin :refs/tags/<tagname> 删除远程的某个标签