git常见命令及使用
一、前言
使用git命令前,先了解git的几个概念。
git分为如下几个工作区:
工作区(WorkSpace):存放项目文件的地方,或者可以理解为你的编辑器编辑的地方。
暂存区(Stage/Index):临时存放项目文件的改动情况。
本地库(Local Repository):本地库又叫版本库,本地安全存放数据的位置,里面存放着提交到所有版本的数据。
远程库(Remote):托管代码的服务器,服务器安全存放数据的位置,里面存放着提交到所有版本的数据。
各工作区关系及流转如下图所示:
在git中对文件的修改至提交到远程仓库,需要经过几个步骤:在工作区编辑----> 添加到暂存区 ----> 提交到本地仓库 ----> 提交到远程仓库。具体过程如下图:
二、快速开始
开始Git的操作前,通常不要再master跟dev环境进行操作。请先从master分支检出(创建)一个自己的本地分支,在自己的本地分支上操作!这很重要
以下简单介绍常用git命令及场景。
2.1、安装git及配置
①git的安装,浏览器搜索git的下载地址(https://git-scm.com/downloads),直接下载git的windows版本软件,安装过程使用默认即可。可配置一下git的环境变量。
查看一下git的版本信息:即安装成功
②基本配置:用户名,邮件等信息。鼠标邮件,打开git bash,输入以下命令配置用户名,邮箱。可使用git config --list 检查配置信息。
2.2、创建一个被git管理项目
①在gitlab/github上创建一个空项目,假如叫 project-demo
②本地创建一个项目project-demo,在项目的目录上打开git bash,执行命令git init来初始化一个仓库,通过git init
命令把这个目录变成Git可以管理的仓库。执行完后会在当前目录下生成一个.git的目录,里面包含git的版本信息。
git init
③将修改文件添加到暂存区。使用
git add . .号表示添加全部修改到暂存区
git add <文件名> 添加单个文件到暂存
④将修改添加到本地仓库
git commit -m "描述"
⑤将本地git仓库上传至github远程仓库,其中 https://github.com/adams831/project-demo.git是github中copy下来的刚才新建空项目的链接。
git remote add origin https://github.com/adams831/project-demo.git 设置远程地址 git push -u origin master 推送至远程仓库
⑥本地项目已经推送至远程,可执行其他命令。如git pull试试。
2.3、分支操作
①查看分支
git branch 查看本地有哪些分支
git branch -a 查看全部分支(本地分支跟远程分支)
②查看当前分支状态信息,包含被修改的文件信息
git status
③从远程仓库,拉取项目到本地。
git clone <url>
④git pull 拉取更新,把github修改的版本信息更新到本机。比如其他人在远程提交了代码,你本地希望看到其他人的修改,此时需要拉取更新你的分支。
git pull
⑤从master检出(创建)本地分支。项目clone下来后,默认有master分支,此时需要在项目开发功能,需要从master分支上检出一个本地分支,以便在本地分支上修改。然后可以使用git branch看看本地有哪些分支
git branch <本地分支名> //从当前分支检出一个新本地分支
⑥本地分支创建成功后,此时本地分支就跟你的当前分支拥有相同的版本,包括提交历史。我这里的当前分支时master。此时可以切换到新建的分支进行编码工作;使用命令切换分支:
git checkout <要切换到的本地分支名>
当然也可以将创建分支跟切换同时进行,即创建并切换到分支的命令:
git checkout -b <本地分支名>
另外还有像基于远程分支origin/dev在本地创建分支dev并切换到该分支上的操作
git checkout -b dev origin/dev //基于远程的dev分支,在本地创建本地分支dev并切换到本地dev分支
⑦本地分支创建成功后,可在本地分支进行开发。
⑧本地开发完成,需提交相关修改。此时需要进行提交操作
git add .
git commit -m "提交描述"
经过上面两步,已经把修改提交到本地仓库。下一步需要提交到远程仓库。可能会遇到这样的情况,这是因为本地分支没跟远程分支建立关联导致的。git不知道提交到哪个分支
上述图中,git给出了提示:git push --set-upstream origin feature-x 意思是可以使用该命令于远程分支建立关联。
git push --set-upstream origin feature-x
按提示输入上述命令后发现已经能提交到远程了,为了更直观查看本地分支是否跟远程建立了关联可以使用下面的命令:
git branch -vv //查看本地分支跟远程分支的对应关系
可以看到本地分支feature-x 跟远程分支 origin/feature-x已经关联;本地master跟远程分支origin/master也已经关联
还有一种情况是,只有本地分支,还没创建远程分支时,可以使用命令将本地分支推送到远程,此操作能创建远程分支,并建立关联
git push origin -u temp 把分支temp推送到远程(本地分支跟远程建立了关联),此时远程分支的名字也为 temp
至此,已经完成一次完整的代码下载,修改与提交到远程的过程。
三、常用命令
3.0、git配置命令
在git中,我们使用git config 命令用来配置git的配置文件,git配置级别主要有以下3类:
1、仓库级别 local 【优先级最高】
2、用户级别 global【优先级中】
3、系统级别 system【优先级最低】
实际上,三种配置文件的作用范围跟配置的级别是相反的。这也很好理解,想象一下编程语言中的全局变量跟局部变量,局部变量会覆盖全局变量的值。在这里也是一样的,在有相同配置的情况下,local中的配置会覆盖global中的,global会覆盖system中的配置。
各级别配置文件分别放在:
【local】git 仓库级别对应的配置文件是当前仓库下的.git/config。
【global】git 用户级别对应的配置文件是用户宿主目录下的C:\Users\cai\.gitconfig
【system】git系统级别对应的配置文件是git安装目录下的 D:\git\install\Git\mingw64\etc\gitconfig
查看配置信息:可以填写不同级别的参数,对应查看不同级别的配置文件中的信息。如:git config --local --list 查看的是仓库的配置文件信息。
git config [--local|--global|--system] --list
查看全部配置信息:(展示的配置信息按,local,global,system顺序依次展示)
git config --list
git config 常用配置选项
git config -e 编辑配置文件 git config --local -e 编辑仓库级别配置文件 git config --global -e 编辑用户级别配置文件 git config --system -e 编辑系统级别配置文件 git config 添加配置项目 git config --global user.email “you@example.com” git config --global user.name “Your Name”
增加配置项(命令参数 --get)
git config [--local|--global|--system] --add section.key value
获取配置项(命令参数 --get) 查看某个配置项的值
git config [--local|--global|--system] --get section.key
删除配置项(命令参数 –unset)
git config [--local|--global|--system] --unset section.key
给命令取别名,之后就可以使用别名来操作了
git config [--local|--global|--system] alias.别名 命令
3.1、创建版本库
git init 初始化本地版本库
git clone <url> 克隆远程版本库
3.2、修改、拉取与提交
提交
git add . 将工作区的修改全部添加到暂存区 git add <file> 添加指定的修改文件到暂存区 git commit -m "描述" 将暂存区的修改提交到本地仓库 git push 将本地仓库的提交推送到远程
拉取
git fetch <remote> 从远程库获取代码(参数可选,默认origin)
git pull <remote> <branch> 下载代码并快速合并
修改
git diff 查看变更内容
3.3、分支操作命令
查看状态
git status 【命令用于显示工作目录和暂存区的状态。使用此命令能看到那些修改被暂存到了, 哪些没有, 哪些文件没有被Git tracked到。git status不显示已经commit到项目历史中去的信息。看项目历史的信息要使用git log。
文件所处状态介绍:
(1).未跟踪状态(Untracked):
未跟踪状态的文件,是在工作区,但是未纳入Git管理的文件,不参与版本控制。使用git add命令即可将未跟踪文件纳入管理。
(2).位于暂存区待提交状态(Staged):
假如工作区中有两个未跟踪的文件readme.txt和antzone.txt,下面将antzone.txt纳入跟踪。
git add命令将antzone.txt文件纳入跟踪,其实就是提交到暂存区。changes to be committed表示文件已经位于暂存区处于可以提交的状态。
它前面被标注new file(因为第一次被提交到暂存区)。
(3).Modified状态:
纳入跟踪的文件在工作区中被修改后就会处于Modified状态。
查看分支
git branch 查看所有本地分支名称 git branch -a 查看所有分支,包括本地分支和远程分支 git branch -vv 查看所有本地分支和远程分支的对应关系
创建/检出分支
git branch <分支名> 新建本地分支,从哪个分支新建,就会从哪个分支拿全部代码(一模一样),包括所有状态,提交历史等
git checkout -b <分支名> 创建并切换到本地分支dev
git checkout -b dev origin/dev 基于远程分支origin/dev在本地创建分支dev并切换到该分支上
切换分支
git checkout <分支名> 切换到某个本地分支
推送本地分支到远程
git push 【在建立当前分支和远程分支关联的前提下,将当前分支commit内容推送到对应远程分支 git push origin <本地分支名> 【把本地分支提交到远程,远程分支同名(此命令没有创建本地分支与远程分支的关联) git push origin 本地分支名称:远程分支名称 【把本地分支提交到远程,远程跟本地分支名可以不同(此命令没有创建本地分支与远程分支的关联) git push origin -u <本地分支名> 【把本地分支推送到远程(本地分支跟远程建立了关联) git push --set-upstream origin temp 【创建远程分支origin:temp,且将本地分支内容推送到该远程分支,本地分支temp与远程分支origin:temp建立关联
删除分支
git branch -d <分支名> 删除本地分支 git push origin -d <分支名> 删除远程分支 git push origin:test 删除远程分支--用省略本地分支的方式来删除远程分支,这等同于推送一个空的本地分支到远程分支。
3.4、撤销修改
git reset --hard HEAD 撤销工作目录中所有未提交文件的修改内容 git revert <commitId> 撤销指定的未提交文件修改内容 git checkout HEAD file 撤销指定的提交
3.5、合并分支
git merge <branch> 合并指定分支到当前分支
git rebase <branch> 衍合指定分支到当前分支
3.6、标签
标签(标签是指向某个commit的指针,是版本库的快照,标签是跟某个commit绑定的)
可以理解为某个提交的别名,以便根据标签快速找到commit。
注意:标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。
打标签 默认标签是打在最新提交的commit上的。
git tag <name>
给指定提交打标签
git tag <name> <commitId>
查看标签,注意,标签不是按时间顺序列出,而是按字母排序的。可以用git show <tagname>查看标签信息
git tag
还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字
git tag -a <tagname> -m "说明文字" <commitId>
删除本地标签(因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除)
git tag -d <tagname>
删除远程标签
git push origin :refs/tags/<tagname>
将标签推送至远程
git push origin <tagname>
推送全部标签至远程
git push origin --tags
3.7、暂存修改
实际开过过程中,经常有这样的场景:我在自己本地分支开发,此时需要切换到其他分支进行开发;但是你当前本地的分支有修改又暂时不想提交代码。如果你这时候切换分支,会导致将工作区与暂存区的修改带到其他分支去。(以前的版本好像会报错,不让切换)
git 切换分支时会把工作区和暂存区的修改(未add或未commit)内容带过去, 这一点值得注意。这样导致在切换后的分支commit会提交到在其他分支(暂存区)的修改,如果没注意将工作区的修改也add到暂存区了,那么其他分支(工作区)的修改也将被提交。
为什么呢? 因为未add的内容不属于任何一个分支, 未commit的内容也不属于任何一个分支。 也就是说,分支使独立的,但工作区和暂存区是公共的。
使用git stash暂存修改
- 需要说明一点,stash是本地的,不会通过
git push
命令上传到远程。 - 实际应用中推荐给每个stash加一个message,用于记录版本,使用
git stash save
取代git stash
命令。 - 在
git stash show
命令后面添加-p
或--patch
可以查看特定stash的全部diff。
①暂存当前修改(git stash执行完后当前分支工作区跟暂存区就干净了,不会带到其他分支)
git stash 【git stash
会把所有未提交的修改(包括暂存的和非暂存的)都保存起来,用于后续恢复当前工作目录】
②重新应用缓存的stash
git stash list 【查看暂存区记录】
git stash pop 【恢复暂存修改方式一:恢复暂存修改,恢复后,stash内容并不删除】
git stash apply 【恢复暂存修改方式二:恢复暂存修改,恢复的同时把stash内容也删了】
③移除stash
git stash drop stash@{0} 【移除指定的stash 后面跟的是stash list的序号】
或者
git stash clear 【移除所有的缓存stash
④查看指定stash的diff (可以使用git stash show
命令,后面可以跟着stash名字)
git stash show stash@{0} 【查看指定的stash】 git stash show -p stash@{0} 【在git stash show
命令后面添加-p
或--patch
可以查看特定stash的全部diff】
⑤从stash创建分支
git stash branch 【这会创建一个新的分支,检出你储藏工作时的所处的提交,重新应用你的工作,如果成功,将会丢弃储藏。这是一个很棒的捷径来恢复储藏的工作然后在新的分支上继续当时的工作】
⑥暂存未跟踪和忽略的文件
默认情况下,git stash会缓存下列文件:
添加到暂存区的修改(staged changes)
Git跟踪的但并未添加到暂存区的修改(unstaged changes)
但不会缓存以下文件:
在工作目录中新的文件(untracked files)
被忽略的文件(ignored files)
git stash命令提供了参数用于缓存上面两种类型的文件。
使用-u或者--include-untracked可以stash untracked文件。使用-a或者--all命令可以stash当前目录下的所有修改。
3.8、远程操作
git remote -v 查看远程版本库信息 git remote show <remote> 查看指定远程版本库信息(这里的remote就是远程版本库的名字,默认是origin) git remote add <remote> <url> 添加远程版本库
git fetch <remote> 从远程库获取代码
git pull <remote> <branch> 下载代码并快速合并
git push <remote> <branch> 上传代码并快速合并
git push <remote>:<branch/tag> 删除远程分支或者标签
3.9、查看提交历史
git log 命令是查看全部提交日志 --stat 可显示修改文件 git log -2 查看最近2次的提交日志 git log -p 查看历史纪录以来哪几行被修改 git log --stat --summary 查看每个版本变动的档案和行数 git提供了一个命令git reflog用来记录你的每一次命令 git show 查看最新的commit git show <commitId> 查看指定提交的信息
git log修改时间格式?默认的时间格式不好看
git config --global log.date format:’%Y-%m-%d %H:%M:%S’ (显示 2020-09-15 17:34:55)
git显示漂亮日志: git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --