一、什么是版本控制
版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一。
版本控制最主要的功能就是追踪文件的变更。它将什么时候、什么人更改了文件的什么内容等信息忠实地了记录下来。每一次文件的改变,文件的版本号都将增加。除了记录版本变更外,版本控制的另一个重要功能是并行开发。软件开发往往是多人协同作业,版本控制可以有效地解决版本的同步以及不同开发者之间的开发通信问题,提高协同开发的效率。并行开发中最常见的不同版本软件的错误(Bug)修正问题也可以通过版本控制中分支与合并的方法有效地解决。
版本控制常用管理系统:集中式版本控制{CVS,SVN}、分布式版本控制{GIt}
二、git
- git是一个分布式版本控制系统
1. 下载安装Git
到官方网站下载安装包
① 选择Downloads进行下载页面
② 点击Windows,就会跳转页面并自动弹出下载窗口,下载Windows系统版本的git
③ 双击下载好的 Git-2.27.0-64-bit.exe 文件进行安装,一路Next即可
2. 创建本地仓库(版本库)
① 在本地任意地方创建一个目录作为工作目录,并进入该目录
② 右键选择“Git Bash Here”
③ 在打开的命令行窗口输入 git init 即可将此文件夹初始化为一个git本地仓库
git版本库目录结构
.git 文件夹所在目录称为工作目录
# .git文件夹为版本仓库,其结构如下:
config # 文件包含项目特有的配置选项
HEAD # 文件指向目前被检出的分支
index # 文件保存暂存区信息
description # 该文件仅供 GitWeb 程序使用,我们无需关心
COMMIT_EDITMSG # 存放提交日志
hooks/ # 目录包含客户端或服务端的钩子脚本(hook scripts)
info/ # 目录包含一个全局性排除文件, 用以放置那些不希望被记录在 .gitignore 文件中的忽略模式
objects/ # 该目录存储所有数据内容,存放所有对象,即每一次的快照
refs/ # 该目录存储指向数据(分支、远程仓库和标签等)的提交对象的指针
三、git 操作(git v2.27)
git仓库初始化
# 获取git仓库
## 方式一:将一个已存在目录初始化为git仓库
git init # 要在目标目录下执行
## 方式二:克隆远程仓库
git clone <url> [new repository name] # 隐式添加远程仓库(是否重命名可选)
git配置
# 配置工具
git config --[global/system/local] [...] # 命令基本格式
## 三种配置范围:
--local #仓库级 适用于当前仓库,配置文件在当前仓库的 .git\config
--global #全局级 适用于当前系统用户,配置文件在 C:\Users\MAIBENBEN\.gitconfig 命令行下为 ~/.gitconfig
--system #系统级 对系统中所有用户均有效 ,配置文件在 本地git安装路径\Git\etc\gitconfig 命令行下为 /etc/gitconfig
## 权重 local > global > system 推荐使用global配置
## 当三个范围的配置文件存在同名配置,则权重高的在其使用范围内会覆盖权重低的同名配置
git config --list # 查看当前的git配置(按q退出编辑模式)
git config --global color.ui auto #设置有帮助的彩色命令行输出
# 配置全局用户信息
git config --global user.name "[name]" # 配置commit操作关联用户名
git config --global user.email "[email address]" # 配置commit操作关联邮箱地址
# 注:修改后用户名和邮箱只作用于之后的提交,不影响配置修改前的提交;值上的双引号不是必要的
# 设置命令别名
git config --global alias.<别名> <命令> # 适合单个单词命令
## 比如设置 git config --global alias.ci commit 以后可以用ci代替commit
git config --global alias.<别名> '命令' # 适合多个多个单词命令
## 比如设置 git config --global alias.last 'log -1 HEAD' 以后可以用last命令轻松查看最后一次提交信息
git基本文件操作
clear # 清屏命令 (或Ctrl+L)
# 查看当前文件的状态
git status # 查看详细的状态信息
git status -s # 查看简化的状态信息
# 内容差异对比
## 比较工作目录中当前文件与暂存区域快照之间的差异
git diff # 只显示尚未暂存的改动
## 比对已暂存区与最对象区后一次提交的文件差异
git diff --staged # 参数也可以为-cached,两者是同义词
git diff --staged <sha-1> # 对比暂存区和某次特定提交的差异
## 对比对象区和工作区的差异
git diff <sha-1> # 通过sha-1值比较对象区某次提交和工作区的差异
git diff head # 比较对象区最新提交和工作区的差异
## 对比结果示例说明
# 查看文件每一行的修改详情
git blame <file-name> # 可以查看文件每一行修改的具体信息:该行内容修改提交的sha1值(修改者,修改时间,内容)该行内容
# 将工作区的目标文件加入暂存区(将未跟踪状态文件改为已跟踪状态)
git add <file>
# 暂存操作会为每个文件计算校验和(SHA-1哈希算法)
# 然后会把当前版本的文件快照保存到 Git 仓库中 (Git 使用 blob 对象来保存它们)
# 最终将校验和加入到暂存区域等待提交
## 批量添加
git add <file1> [file2] [file n]
git add -A表示添加所有内容,
git add . 表示添加新文件和编辑过的文件不包括删除的文件;
git add -u 表示添加编辑或者删除的文件,不包括新添加的文件
# 将缓存区的文件回退到工作区
git restore --staged <file>
# 提交更新 (建议在功能没有开发完毕前,不要commit)
git commit -m "提交日志" # 提交暂存区操作
git commit -a -m "提交日志" # 跳过暂存区提交(直接从工作区提交)(只适用于已跟踪的文件!)
git commit -am "提交日志" # 相当于先add再commit(只适用于已跟踪的文件!)
# 修补提交
git commit --amend -m "提交日志" # 重新进行最近一次提交(覆盖上一次提交不作为一个新提交)
## 执行这个命令前可以向暂存区添加上次提交遗漏的文件,提交时可以修改提交日志
## 重新提交会覆盖上一次提交信息,会造成上次提交信息的丢失
# 撤销对已提交目标文件新加的修改
git restore <file>
# 移除文件
## git方式
### 移除 已提交且未再次修改 的文件
git rm <file> # 从git仓库和工作目录里同时删除
### 移除 暂存区文件 或 提交后又修改了的文件
git rm -f <file> # 从git仓库和工作目录里同时删除;f即force,强制执行
### 从git仓库删除但保留工作区文件
git rm --cached <file>
### git rm 命令后面可以列出文件或者目录的名字,也可以使用 glob 模式
## 系统方式
### 可以删除任意状态文件,但只是从工作目录删除
rm <file>
# 文件重命名(本质为move移动)
## git mv (git 方式重命名)
git mv <old file> <new file> # 会将旧文件创建一个备份改为新文件名再删除旧文件(若恢复删除,新旧文件会同时存在)
# 实际上进行了3步操作:1.mv <old file> <new file> 2.git rm <old file> 3.git add <new file>
git commit -m "执行重命名"
## mv (系统方式重命名,效果等同在文件夹中直接重命名)
mv <old file> <new file> # 相当于执行了以系统方式删除旧文件,并在工作区添加了一个新文件(不推荐该方式)
git add . # 将文件转为重命名状态
git commit -m "执行重命名"
提交日志查看
# 查看提交历史(按q退出)
git log
## 无参默认情况下,git log 会按时间先后顺序列出所有的提交,最近的更新排在最上面
## 命令会列出每个提交的 SHA-1 校验和、作者的名字和电子邮件地址、提交时间以及提交说明
# 可以灵活添加以下常用参数
-<n> # 查看最近n条提交信息
--graph # 图形化显示日志(会图形化显示分支变化)
--abbrev-commit # 简化的sha-1值
--stat # 附加显示每次文件的变化
--pretty=[自定义格式] # online格式参数为在一行显示 format参数 format:"%h - %an, %ar : %s"
--oneline # 一行显示(--pretty=oneline --abbrev-commi 的合用简写)
更多选项请参考官方文档..
分支操作
Git 的分支就是一条commit链或者称为工作记录线
其实本质上仅仅是指向提交对象的可变指针,是包含所指对象校验和(长度为 40 的 SHA-1 校验和字符串)的文件
Git仓库初始化时会创建一个名字为master的默认分支,该分支和其它自己创建的分支 没有区别
Git有一个名为 HEAD 的特殊指针,始终指向当前所在分支
分支创建时会添加一个指向前一个已提交对象的可变指针
分支切换时会做两件事:一是使 HEAD 指回 master
分支,二是将工作目录恢复成 master
分支所指向的快照内容
# 分支查看
git branch # 查看当前所有的分支名称列表(前面标*的是当前分支,即HEAD指向的分支)
git branch -v # 查看每一个分支的最后一次提交(sha-1值和提交日志)
git branch -a # 查看所有分支(包括远程分支)
git branch -av # 查看所有分支及其最后一次提交(sha-1值和提交日志)
git branch --merged [branch-name] # 查看已经合并到目标分支的分支名称列表(不加分支名目标为当前分支)
## --merged显示的当前(标*的)分支以外的分支可以直接删除,因为这些分支是当前分支提交记录的子集
git branch --no-merged [branch-name] # 查看尚未合并到目标分支的分支名称列表(不加分支名目标为当前分支)
## --no-merged显示的当前分支以外的分支只能加-D强制删除且有可能损失数据操作
# 分支创建
git branch <branch-name> # 创建新的分支但不跳转到该分支
git checkout -b <branch-name> # 创建新的分支并跳转到该分支
## 该命令是 git branch <branch-name> 和 git checkout <branch-name> 两步操作的简写
# 分支重命名
git branch -m <old-branch-name> <new-branch-name>
# 分支切换
git checkout <branch-name> # 切换到目标分支
## 若当前分支的暂存区有文件,且和要切换的分支不在同一commit阶段,则不能直接切换,必须提交或者贮藏当前修改
# 合并分支
git merge [--no-ff] <branch-name> # 将目标分支合并到当前的分支,建议删除前先合并分支
# merge 默认采用 Fast Forward方式(--ff),也可以加--no-ff参数禁用该方式
## Fast Forward 方式
### 1. 本质就是指针移动,中间跳过的commit也会保存
# 分支删除
git branch -d <branch> # 删除分支(注意不可以删除当前所在分支),若存在有风险操作会提示
git branch -D <branch> # 强行删除分支(不会提示不安全操作)
解决合并冲突:
当合并分支时,如果在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,就会产生合并冲突
产生冲突后GIt会暂停下来等待冲突被解决,可以通过 git status 查看未合并的(unmerged)冲突文件
可以打开打开编辑冲突文件,Git会将冲突部分标注出来,解决冲突后要再add将冲突文件标记为冲突已解决,最后再提交即可
关于分支的操作说明
一般项目过程中会存在如下几类分支
- master 分支:产品分支,提交可用于生产阶段的稳定版本
- develop 分支:开发分支,开发阶段使用
- test 分支:测试分支,测试时使用,测试通过后合并到开发分支当中
- bugfix 分支:bug修复分支,在修复bug时使用
远程仓库操作
# 获取远程仓库
git clone <url> [remote-ref-name] # 将当前远程仓库内容克隆到本地,并隐式添加远程仓库配置
## clone操作适合用来初始化仓库
git remote add <remote-ref-name> <url> # 显示添加远程仓库配置,但不会获取远程仓库内容
## romote方式用来关联远程仓库
### remote方式关联,根据URL的类型可以选择两种协议连接方式
#### 1.HTTPS方式
后面需要通过账号密码登录GitHub
#### 2.SSH方式
需要本地先生成SSH密钥。再将公钥保存到GitHub
##### 生成SSH密钥
ls -al ~/.ssh # 先检验本地是否有生成好的ssh,有的话直接用,没有则用下面命令生成
ssh-keygen # 将在当前路径生成一个.ssh文件里面有生成好的公钥和私钥
##### 将生成好的公钥配置到GitHub
###### 生成的公钥在 ~/.ssh/id_rsa.pub 文件中
###### 公钥配置有两种方式。一种是配置到GitHub账户,一种是配置到一个GitHub仓库
###### 配置到用户的途径 【用户】→【settings】→【SSH and GOG keys】→【SSH keys】→ 【new SSH key】
###### 配置到仓库的途径 【目标仓库】→【Setting】→【Deploy keys】→【Add deploy key】(注意勾选写允许)
###### 配置到用户,只要用户有权限操作的项目,连接者都能操作
###### 配置到项目的,只对对应项目有操作权限
# 查看已经配置的远程仓库
git remote # 只显示已配置远程仓库的简称
## -v 指定该参数,显示已配置远程仓库的引用名 + URL
# 查看某个远程仓库的更多信息
git remote show <remote-ref-name>
# 修改远程仓库引用名
git remote rename <old-remote-ref-name> <new-remote-ref-name>
# 修改远程仓库应用地址
git remote set-url <remote-ref-name> <new-url>
# 删除对某个远程仓库的引用
git remote rm # 会删除所有和这个远程仓库相关的远程跟踪分支以及配置信息(rm即remove)
# 从远程仓库获取数据
git fetch <remote-ref-name> # 将数据从远程仓库下载到你的本地仓库
## 它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作
# 拉取远程仓库的数据
git pull <remote-ref-name> <remote-branch-name>
## 获取远程仓库的数据并合并到本地仓库,相当于执行了 fetch + merge
# 推送本地仓库更新到远程仓库
git push -u <remote-ref-name> <remote-branch-name>
## 执行该命令后以后可以直接用git push(若无其它远程仓库配置情况下)
## 推送成功前提是具有该远程仓库的写入权限,且远程仓库内容仍是本地仓库最后一次克隆时的内容
# 第一次通过pull或push连接GitHub时可能会出现一条警告
# Warning: Permanently added the RSA host key for IP address '13.229.188.59' to the list of known hosts
# 这条警告可以不理会,也可以在系统hosts文件添加以下ip映射来解决
13.229.188.59 github.com
## Windows hosts文件地址 C:\Windows\System32\drivers\etc\hosts
## Linux hosts文件编辑地址 /etc/hosts
# 本地与远程分支关联
解决远程无本地分支的情况(创建远程分支)
## 设置上游分支upstream
git branch --set-upstream-to=<remote>/<remote-branch> <local-branch> # 方式一
git push --set-upstream <remote-ref-name> <remote-branch> # 方式二
## pull 和 push 时加 -u 参数也可以设置upstream 方式三
## 设置upstream用来告诉git fetch/git pull/git rebase 哪个分支要合并,也会影响git push
解决本地无远程分支的情况
## 创建新分支并关联远程分支
git checkout -b <new-branch> <remote>/<remote-branch> # 方式一
git checkout -b <new-branch> --track <remote>/<remote-branch> # 方式二
## 方式二和方式一效果相同,新分支名可以省略,默认等同远程分支名
git checkout <remote-branch> # 方式三
## 方式三是一个捷径,当切换分支时若本地没有而远程有,则会自动创建一个跟踪分支
# 删除远程分支
git push <remote-ref-name> --delete <remote-branch>
# 本地分支推送到远程(可用于远程分支的创建与删除,也会自动关联)
git push <remote-ref-name> <local-branch>:<remote-branch> # 将该本地分支推送到远端目标分支
# 当目标远程分支不存在时会创建新的远程分支,<local-branch>值可以为HEAD,即代表推送当前分支
git push <remote-ref-name> :<remote-branch> # 推送的本地分支为空,效果为删除目标远程分支
# 拉去远程分支并关联
git pull <remote-ref-name> <local-branch>:<remote-branch>
## 上面的命令相当于执行了 git pull + git checkout -b <new-branch> <remote>/<remote-branch>
# 清理无效的追踪分支
git remote prune <remote-ref-name> [--dry-run]
## 加--dry-run可以只查看哪些会被删除
- 关于push和pull默认行为
- Git分支可以分为三类:
- 本地分支:本地创建和管理的分支
- 追踪分支:是最后一次获取到的远程分支状态的引用,以
<remote>/<branch>
的形式命名,是只读分支 - 远程分支:在远程仓库的分支
贮藏与清理操作
① 贮藏(stash)
会处理工作目录的脏的状态——即跟踪文件的修改与暂存的改动(默认不包括未跟踪的文件)
贮藏操作会将未完成的修改保存到一个栈上
可以在任何时候重新应用这些改动(甚至在不同的分支上)
如果暂存区有暂时不想提交(因为功能没有开发完)的文件,又需要切换到其它分支,则可以选择贮藏操作
# 贮藏
git stash # 该操作会清空暂存区和工作目录,并保存已跟踪文件的修改信息
git stash --include-untracked # 加 --include-untracked 参数(也可用 -u 代替),使未跟踪文件也可以被贮藏
git stash --patch # 会依次询问每一个符合贮藏条件的文件是否被贮藏(也会显示修改差异)
git stash --keep-index # 加 --keep-index 参数可以使暂存文件保留在索引中
# 查看贮藏信息
git stash list # 显示格式为 <贮藏名>:WIP on <贮藏分支名>:<该分支最后一次提交的校验和> <该分支最后一次提交的日志>
# 删除贮藏信息
git stash drop <贮藏名> # 贮藏名通过上一条之类查看,形式如 stash@{0}
# 贮藏内容恢复
git stash apply [贮藏名] # 恢复最近的一次贮藏,不会重新暂存其贮藏时加入暂存区的文件(加贮藏名则恢复指定贮藏)
git srash apply --index # 恢复最近的一次贮藏,会重新暂存其贮藏时加入暂存区的文件
git stash pop # 应用贮藏然后立即清除该贮藏内容(暂存的文件会恢复暂存,但已暂存文件的新修改会丢失)
# 在贮藏后的分支上创建新分支
## 若想在贮藏后的分支上继续工作,后面恢复贮藏时很可能会造成冲突,建议用以下方式创建新分支
git stash branch <new-branchname> #创建后切换到新分支并恢复贮藏内容(两个分支都会恢复,并清除栈中的贮藏)
② 清理(clean)
可以用来移除工作目录中一些工作或文件(未被忽略且未跟踪的文件)
清除操作不可逆,要谨慎执行!
# 清除
git clean # 从工作目录中移除没有忽略的未被追踪文件(不包括目录),这种方式不可逆
# 加 -f 参数,强制删除,需要配置clean.requireForce 没有显式设置为 false)
# 加 -d 参数,可以删除未被追踪的空目录
# 加 --dry-run(或 -n)参数,改为删除预演,只会显示执行此命令会删除的文件,但不会真的删除
# 安全的清除方式建议
git stash --all # 贮藏操作使得“清除”掉的文件有反悔的可能
标签(版本号)操作
标签(tag)主要用来记录版本号,如v1.1.2,也可用方便地穿梭版本
标签分为两种:轻量级标签和附注标签
- 轻量级标签(lightweight)
- 轻量级标签只是某个特定提交的引用
- 本质是只将提交的校验和存储到一个文件中,而没有其它信息
- 附注标签(annotated)
- 附注标签是一个Git数据库中的完整对象,有自己的sha-1值
- 包含打标签者的名字、电子邮件地址、日期时间, 此外还有一个标签信息
- 可以使用GNU Privacy Guard (GPG)签名并验证
- 通常建议使用附注标签
# 创建标签
## 轻量级标签(lightweight)
git tag <tag-name> # 创建轻量级标签
## 附注标签 (annotated)
git tag -a <tag-name> -m <tag-description> # 在最近一次提交上创建附注标签
git tag -a <tag-name> <某次提交的sha-1校验和> # 给某次提交补加标签
# 从远程获取标签
git pull # pull可以获取远程标签
## 注意如果远程新增标签则pull可以获取,但远程后来又删除标签本地却无法感知,需要手动删除
git fetch <remote-ref-name> tsg [v1.0..] # 只获取远程的标签
# 共享(推送)标签
## git push 不会隐式推送本地标签到远程仓库,必须显式推送
git push <remote-ref-name> <tag-name> # 推送单个标签到远程服务器
git push <remote-ref-name> --tags #会将推送所有远程仓库没有的本地标签(两类标签都会推送)
# 删除标签
git tag -d <tag-name> # 在本地仓库删除选的标签(d即delete)
git push <remote-ref-name> :refs/tags/<tag-name> # 删除远程标签方式一
git push <remote-ref-name> --delete <tag-name> # 删除远程标签方式二
# 查看标签列表
git tag # 查看所有已有标签
git tag -l "v1.2.*" # 通过通配符按一定模式查找标签(用通配符一定要有list属性,也就是-l)
# 查看标签信息和与之对应的提交信息
git show <tag-name>
版本穿梭
# 版本回退
git reset --hard HEAD^ # 回退到上一次提交,^有n个就会回退到倒数第n次提交
git reset --hard HEAD~n # 回退到倒数第n次提交
# 穿梭到任意提交历史版本
git reflog # 查看所有历史记录(包括版本回退),需要良好的提交日志记录
git reset --hard <Sha-1校验和> # 根据sha-1校验和回退到特定提交
# 游离状态版本切换
git checkout <tag-name> # 按标签切换版本
git checkout <sha-1> # 按提交sha1值切换版本
## 注意,不要在这种方式切换得到版本上进行修改提交
## 直接检出标签会使仓库处于分离头指针状态(detached HEAD)
## 这时新的提交将不属于任何分支,只能通过确切的提交哈希才能访问
## 如果要修复旧版本的错误,建议用下面的方式创建新分支后再修改
### 对于标签的切换
git checkout -b <new-branch-name> <tag-name> # 在目标标签的基础上创建新分支
### 对于sha1值的切换,可以先修改,修改后提交,再用提交后的sha1值创建新分支
git checkout -b <new-branch-name> <sha-1>
设置忽略文件
在git管理项目时,有些文件不需要纳入git管理,比如日志文件或者编译过程中创建的临时文件等,
应该将其设置为git管理忽略项以避免提交无用文件,要养成一开始就为新仓库设置好 .gitignore 文件的习惯!
设置方式为 创建 .gitignore 文件,在该文件里定义忽略的文件的模式
该文件一般在根目录,但子目录下也可以定义自己的 .gitignore 文件,但作用域仅为所在子目录
.gitignore 文件的格式规范如下:
-
所有空行或者以
#
开头的行都会被 Git 忽略。 -
可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。
-
匹配模式可以以(
/
)开头防止递归。 -
匹配模式可以以(
/
)结尾指定目录。 -
要忽略指定模式以外的文件或目录,可以在模式前加上叹号(
!
)取反。
glob 模式
- 星号(
*
)匹配零个或多个任意字符 [abc]
匹配任何一个列在方括号中的字符(a或b或c)- 在方括号中使用短划线分隔两个字符, 表示所有在这两个字符范围内的都可以匹配(比如
[0-9]
表示匹配所有 0 到 9 的数字) - 问号(
?
)只匹配一个任意字符 - 两个星号(
**
)表示匹配任意中间目录,比如a/**/z
可以匹配a/z
、a/b/z
或a/b/c/z
等
.gitignore 文件示例
# 忽略所有的 .a 文件
*.a
# 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件
!lib.a
# 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO
/TODO
# 忽略任何目录下名为 build 的文件夹
build/
# 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/*.txt
# 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
doc/**/*.pdf
- 各种语言 .gitignore 文件范例:GitHub - github/gitignore: A collection of useful .gitignore templates
GIt文件状态变化周期
文件状态大体可分为两类,【未跟踪状态】和【已跟踪状态】
- 未跟踪状态(Untracked):既不在上一次快照中 也不在暂存区中的 所有文件
- 已跟踪状态(Tracked):添加到暂存区的以及曾经提交过的文件
- 未提交的(Uncommitted):还未提交的文件修改
- 暂存状态(Staged):添加到暂存区的文件(在暂存区)
- 已修改状态(Modified):提交后已修改了的文件(在工作区)
- 已提交的(Commetted):曾经提交过的
- 未修改状态(Unmodified):提交后未修改的文件(在对象区)
- 未提交的(Uncommitted):还未提交的文件修改
查看文件状态可以通过输入: git status 实现,可以获取比较详细的信息(包括转换到其它状态的命令提示)
也可以简化的状态输出,通过输入 git status -s 实现,显示结果为 文件状态符+文件名
注意文件状态符号有两列,左边代表暂存区状态,右边表示工作区状态,要注意区分:
文件状态 | 出现情景 |
---|---|
?? | 未跟踪文件 |
A | 未跟踪文件 → Add操作 |
AM | 未跟踪文件 → Add操作 → 修改操作 |
M | 已提交文件 → 修改操作 或 未跟踪文件 → Add操作 → 修改操作 → Commit操作 |
M | 已提交文件 → 修改操作 → Add操作 |
MM | 已提交文件 → 修改操作 → Add操作 → 修改操作 |
D | 已提交文件 → 其它操作 → 系统rm → Git rm |
MD | 已提交文件 → 修改操作 → Add操作 → 系统rm |
AD | 未跟踪文件 → Add操作 → 系统rm |
R | 已提交文件 → 修改文件名操作 |
注意 | 左边 暂存区状态 会在下一次提交时提交 右边 工作区状态 需要再次Add暂存后才能提交 |
可视化辅助工具
git自带可视化工具
gui
- 命令打开方式:git gui
- 特点:操作丰富但貌似没有分支变化的可视化现实功能
gitk
命令打开方式: gitk
特点:用来查看提交信息和分支信息
Sourcetree(免费)
- 当前最好用的git可视化工具之一
- 功能强大,
- 支持中文(装好默认就是中文)
- Sourcetree官网网站
- 推荐教程:
连接GitHub
可按以下方式连接GitHub,连接后可以方便地克隆GitHub上地仓库
添加本地仓库并建立与GitHub仓库的联系
1. 添加一个本地Git仓库:【Local】→【Add】
2. 进入该仓库后点击【远端】,建立与GitHub的远程仓库的联系
3. 点击【添加】
4. 填写远端仓库信息
【远端名称】可以自拟也可以选择【默认远端】(即名称为origin)
【URL/路径】填写目标GitHub仓库的路径
【Remote Account】选择前面已连接的GitHub账号
填写好后点击【确定】,即可完成关联
配置SSH
在顶部工具栏【工具】处配置
方式一:选择【添加SSH密钥】→ 选择保存在本地的SSH私钥文件
方式二:选择【选项】→【SSH客户端】→【SSH客户端配置】
配置好后,即可通过SSH的方式在Sourcetree连接GitHub了(注意:还要将公钥保存到GitHub)
TortoiseGit(免费)
- 右键操作十分方便
- 可在官方下载安装中文语言包
- 官方网站:TortoiseGit – Windows Shell Interface to Git
- 安装和简单实用推荐视频教程:2020黑马Git教程(2小时从入门到精通)【已完结】
开发工具连接使用Git
IDEA
①配置git
【Settings】→【Version Control】→【GitHub】→配置本地git
② 连接GitHub
【Settings】→【Version Control】→【GitHub】→【Add account】→输入GitHub账号密码建立连接
③ 将项目地址初始化为git仓库
【VCS】→【Import into Version Control】→【Create Git Repository】→ 选择当前项目所在目录
④ 创建一个仓库并将当前项目分享到该仓库
【VCS】→【Import into Version Control】→【Share Project on GitHub】
通过【Share Project on GitHub】可以创建GitHub仓库,不需要提前在GitHub建立!