# git命令总结 **Repository Path**: dreamboycx/git-command-summary ## Basic Information - **Project Name**: git命令总结 - **Description**: 总结git命令 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-04-28 - **Last Updated**: 2022-09-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README > git命令学习和总结 # git基本介绍 ## 简介     许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别。这么做唯一的好处就是简单,但是特别容易犯错。有时候会混淆所在的工作目录,一不小心会写错文件或者覆盖意想外的文件。为了解决这个问题,人们很久以前就开发了许多种本地版本控制系统,大多都是采用某种简单的数据库来记录文件的历次更新差异。其中最流行的一种叫做 RCS,现今许多计算机系统上都还看得到它的踪影。 RCS的工作原理是在硬盘上保存补丁集(补丁是指文件修订前后的变化);通过应用所有的补丁,可以重新计算出各个版本的文件内容。     接下来人们又遇到一个问题,如何让在不同系统上的开发者协同工作? 于是,集中化的版本控制系统(Centralized Version Control Systems,简称CVCS)应运而生。 这类系统,诸如 CVS、Subversion 以及 Perforce等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。 多年以来,这已成为版本控制系统的标准做法。     这种做法带来了许多好处,特别是相较于老式的本地 VCS 来说。 现在,每个人都可以在一定程度上看到项目中的其他人正在做些什么。 而管理员也可以轻松掌控每个开发者的权限,并且管理一个 CVCS 要远比在各个客户端上维护本地数据库来得轻松容易。事分两面,有好有坏。 这么做最显而易见的缺点是中央服务器的单点故障。 如果宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。 如果中心数据库所在的磁盘发生损坏,又没有做恰当备份,毫无疑问你将丢失所有数据——包括项目的整个变更历史,只剩下人们在各自机器上保留的单独快照。 本地版本控制系统也存在类似问题,只要整个项目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险。     于是分布式版本控制系统(Distributed Version Control System,简称 DVCS)面世了。 在这类系统中,像 Git、Mercurial、Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照, 而是把代码仓库完整地镜像下来,包括完整的历史记录。 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。 因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。     更进一步,许多这类系统都可以指定和若干不同的远端代码仓库进行交互。籍此,你就可以在同一个项目中,分别和不同工作小组的人相互协作。 你可以根据需要设定不同的协作流程,比如层次模型式的工作流,而这在以前的集中式系统中是无法实现的。 ## 特点 - 直接记录快照,而非差异比较 - 近乎所有操作都是本地执行 - Git保证完整性 - Git一般只添加数据 ## 概念 ### 工作区 就是你在电脑里能看到的目录 ### 暂存区 英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。 ### 版本库 工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库 ### 文件的三种状态 - 已修改(modified):表示修改了文件,但还没保存到数据库里。 - 已暂存(staged):表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。 - 已提交(committed):表示数据已经安全地保存在本地数据库中。 ![](https://gitee.com/dreamboycx/git-command-summary/raw/master/images/dd0d0a6c47cc4ad8a17eb7090dbda6dc.png) # git基本配置 Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量。 这些变量存储在三个不同的位置: - /etc/gitconfig 文件: 包含系统上每一个用户及他们仓库的通用配置。 如果在执行 git config 时带上 --system 选项,那么它就会读写该文件中的配置变量。 (由于它是系统配置文件,因此你需要管理员或超级用户权限来修改它。) - ~/.gitconfig 或 ~/.config/git/config 文件:只针对当前用户。 你可以传递 --global 选项让 Git 读写此文件,这会对你系统上 所有 的仓库生效。 - 当前使用仓库的 Git 目录中的 config 文件(即 .git/config):针对该仓库。 你可以传递 --local 选项让 Git 强制读写此文件,虽然默认情况下用的就是它。。 (当然,你需要进入某个 Git 仓库中才能让该选项生效。) 每一个级别会覆盖上一级别的配置,所以 .git/config 的配置变量会覆盖 /etc/gitconfig 中的配置变量。 在 Windows 系统中,Git 会查找 $HOME 目录下(一般情况下是 C:\Users\$USER )的 .gitconfig 文件。 Git 同样也会寻找 /etc/gitconfig 文件,但只限于 MSys 的根目录下,即安装 Git 时所选的目标位置。 如果你在 Windows 上使用 Git 2.x 以后的版本,那么还有一个系统级的配置文件,Windows XP 上在 C:\Documents and Settings\All Users\Application Data\Git\config ,Windows Vista 及其以后的版本在 C:\ProgramData\Git\config 。此文件只能以管理员权限通过 git config -f 来修改。 你可以通过以下命令查看所有的配置以及它们所在的文件: ``` git config --list --show-origin ``` ## 用户信息 安装完 Git 之后,要做的第一件事就是设置你的用户名和邮件地址。 这一点很重要,因为每一个 Git 提交都会使用这些信息,它们会写入到你的每一次提交中,不可更改: ``` git config --global user.name "John Doe" git config --global user.email johndoe@example.com ``` 再次强调,如果使用了 --global 选项,那么该命令只需要运行一次,因为之后无论你在该系统上做任何事情, Git 都会使用那些信息。 当你想针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运行没有 --global 选项的命令来配置。 很多 GUI 工具都会在第一次运行时帮助你配置这些信息。 ## 检查配置信息 如果想要检查你的配置,可以使用 git config --list 命令来列出所有 Git 当时能找到的配置。 ``` git config --list user.name=John Doe user.email=johndoe@example.com color.status=auto color.branch=auto color.interactive=auto color.diff=auto ... ``` 你可能会看到重复的变量名,因为 Git 会从不同的文件中读取同一个配置(例如:/etc/gitconfig 与 ~/.gitconfig)。 这种情况下,Git 会使用它找到的每一个变量的最后一个配置。 你可以通过输入 git config : 来检查 Git 的某一项配置 ``` git config user.name John Doe ``` # git基本命令 ## 最基本的命令 ``` git clone //项目地址 git pull //从服务端下拉更新最新代码 git add . //把文放入缓存区 git commit -m '说明' //提交到本地 git push //推送到服务器 ``` ## 关于分支的命令 ``` 1.git branch 查看本地已经存在的分支,并且在当前分支的前面加 "*" 标记 2.git branch -r 列出远程分支 3.git branch -a 列出本地分支和远程分支 4.git branch branchName 创建一个新的本地分支,但不进行分支切换 5.git branch -m/-M oldBranchName newBranchName 重命名分支,如果newBranchName名称已存在,则需要使用-M强制重命名,否则,使用-m进行重命名 6.git branch -d/-D branchName 删除分支。-d会在删除前检查合并状态(其与上游分支或者与head)-D会直接删除 7.git push origin -d branchName 删除远程的branchName分支 8.git branch -d -r origin/branchName 删除本地远程分支信息,如果需要删除远程分支,需要再推送到服务器git push origin :branchName 9.git branch -v 查看一个分支的最后一次提交 10.git branch -vv 查看本地分支对应的远程分支 11.git push origin branchName:branchName 将本地存在而远程不存在的分支推送到远程仓库 12.git pull origin branchName:branchName 将远程存在而本地不存地的分支拉到本地仓库 ``` ## 关于标签的命令 ``` 1.查看标签:git tag 2.创建标签:git tag 标签名 如:git tag v1.1.0 或: git tag -a v1.1.0 -m "备注" 3.推送标签:git push origin --tags(一次将本地所有不在远程仓库的标签全部推送) 或: git push origin v1.1.0 4.查看标签的版本信息:git show 标签名 如:git show v1.1.0 5.补打标签:git tag -a v1.1.0 9fbc3d0 6.删除本地标签:git tag -d v1.1.0 然后推送一个空的同名标签到远程达到删除标签:git push origin :refs/tags/v1.1.0 7.获取远程版本:git fetch origin tag v1.1.0 8.检出标签:git checkout v1.1.0 ``` ## 其它命令 - git status 检查当前或者所有文件状态 - git diff <--staged/--cached>查看文件修改的内容(带参数是指查看在暂存区里的文件变化内容) - git log 显示当前分支的的版本历史 * git log [分支名] 查看某分支的提交历史,不写分支名查看当前所在分支 * git log --oneline 一行显示提交历史,--pretty=online的简写 * git log -n 其中 n 是数字,查看最近 n 个提交 * git log --author [贡献者名字] 查看指定贡献者的提交记录 * git log --graph 图示法显示提交历史 * git log -p/--patch 显示每次提交的所引入的差异 * git log --stat 附带总结性选项,在每次提交的下面列出所有被修改过的文件、有多少文件被修改了以及被修改过的文件的哪些行被移除或是添加了。 在每次提交的最后还有一个总结 * git log --pretty 可以使用不同于默认格式的方式展示提交历史。--pretty=online/short/full/fuller/format * git log --name-status 显示新增、修改、删除的文件清单。 - git reset [commit_id] 恢复某个提交点的代码 * git reset --mixed 默认选项,更新索引 * git reset --hard [commit] 回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可; * git reset --soft [commit] 彻底回退到某个版本,本地的源码也会变为上一个版本的内容,撤销的commit中所包含的更改被冲掉; - git checkout 切换分支或者撤销修改 * git checkout -b branchName 创建并切换到新的分支 * git checkout -p branchName 比较两个分支间的差异。也可以比较单个文件的差异 * git checkout -- 放弃工作区中的某个文件修改 * git checkout . 放弃工作区中的所有文件修改 - git tag 标签相关功能 * git tag -l/--list 默认选项,列表出所有标签 * git tag -a "v1.0" 创建标签 * git tag -m "version" 注释标签 * git tag "v1.0" 轻量标签,不需要参数 - git rm 删除文件 * -f 强制删除 * --cached 从git仓库里删除,git不再跟踪文件变化 - git reflog 显示当前分支的最近几次提交 - git show [commit_id/version] 显示某次提的元数据和内容变化 # git常见功能使用 __1.本地删除文件后重新远程下载该文件__ ``` //表示回退到当前版本,HEAD指向当前版本 //如果你修改或者删除了该文件,版本已改变 git reset --hard HEAD //或者 git checkout -- ... ``` __2.本地删除文件后让git远程也删除该文件__ ``` git rm file.txt //删除文件 git commit -m "del" //此步不需要git add git push origin master //推送到远程 ``` __3.git回退到某个提交点__ ``` git reset --hard HEAD^ //回退到上个版本 git reset --hard HEAD~3 //回退到前3次提交之前,以此类推,回退到n次提交之前 git reset --hard commit_id //退到/进到 指定commit的sha码 ``` __4.git打版本号并推送到远程__ __5.git如何将本地分支同远程分支进行关联__ git查看本地分支关联(跟踪)的远程分支之间的对应关系,本地分支对应哪个远程分支 ``` git branch -vv ``` 将本地分支同远程分支进行关联,可以分为以下2种情形: **情形1:本地已经创建了分支dev(以dev为例,下同),而远程没有** 可以通过以下2种方法在远程创建分支dev,并与本地分支进行关联: ``` 方法1: git push -u origin dev 方法2: git push --set-upstream origin dev ``` **情形2:远程已经创建了分支dev,而本地没有** 在本地创建分支并与远程分支进行关联,也有2种方法: 方法1分为两步: ``` step1:先将远程分支pull到本地 git pull origin dev step2:再在本地创建分支并与之关联,又有2种方法 (1)git checkout -b dev origin/dev (2)git checkout -b dev --track origin/dev #可以简写为git checkout --track origin/dev ``` 方法2:可以在pull远程分支的同时,创建本地分支并与之进行关联 ``` git pull origin dev:dev-------两个dev分别表示远程分支名:本地分支名 ``` __6.撤消对文件的修改__ 如果已修改了文件,想撤消修改,还原成上次提交的样子 ``` git checkout -- ... ``` # git命令学习地址 - [Git - Book](https://git-scm.com/book/zh/v2) - [Git教程-廖雪峰](https://www.liaoxuefeng.com/wiki/896043488029600/) - [Git 教程 | 菜鸟教程](https://www.runoob.com/git/git-tutorial.html) - [看完这篇还不会用Git,那我就哭了!_仓库_命令_操作](http://news.sohu.com/a/539329020_121124379)