Git
Q:git的作用 ?A:版本控制
安装git
git配置
查看配置列表
git config -l
查看系统配置
git config --system --list
# git/etc/gitconfig 系统级的配置
查看全局配置
git config --global --list
# 用户目录下的 .gitconfig
设置用户名与邮箱
git config --global user.name "user" # 用户名
git config --global user.email 338148639@qq.com # 邮箱
Git基本理论
Git本地有三个工作区域
- 工作目录(working Directory)
- 暂存区(stage/Index)
- 资源库(repository/Git Directory)
如加上远程git仓库(Remote Directory)就可以分为四个工作空间
Worspace-工作区:存放代码的地方
Stage/Index-暂存区:用于临时存放改动,保存即将提交到远程的文件
Repository-本地仓库:本地代码存放仓库
Remote-远程仓库:代码托管服务器
使用git
本地项目搭建
-
新建本地仓库
新建一个目录做本地仓库命名为git-local
-
初始化本地仓库
在控制台进入git-local目录,执行
git init命令进行初始化
克隆远程仓库
git clone [url]
Git文件操作
git文件的4种状态
版本控制就是对文件内容的控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态
- Untracked-未跟踪:该状态标识此文件不被git库管理,不参与版本控制。可通过
git add加入git库此时状态变为Stage。 - Unmodify-未修改:表示文件已经被git库管理,并且和git库中的文件内容一致。如果文件被修改状态变为Modified。如果不希望该文件参与版本控制,则使用
git rm命令移除git库此时该文件状态为Untracked。 - Modified-已修改:表示文件已经被git库管理,并且和git库中的文件内容不一致。使用
git add可以将对文件的修改保存到git库中,此时文件的状态为Stage。或者使用git checkout舍弃修改,使用git库中文件内容覆盖文件当前内容,此时文件状态变为Unmodify。 - Stage-暂存:表示文件存放在暂存区,使用
git commit则将修改同步到本地git库中,此时文件与git库中文件保持一致,该文件状态为Unmodify。使用git reset Head取消暂存,文件状态又变为Modified。
查看文件状态
# 查看指定文件状态
git status [filename]
# 查看所有文件状态
git status
提交文件
# 添加所有文件到暂存区
git add .
# 提交暂存区到本地仓库
git commit -m "message"
忽略文件
创建**.gitignore**文件,配置忽略文件
.gitignore文件书写规则
/mtk/ # 过滤整个文件夹
*.zip # 过滤所有.zip文件
/mtk/do.c # 过滤某个具体文件
!src/ # 不过滤该文件夹
!*.zip # 不过滤所有.zip文件
!/mtk/do.c # 不过滤该文件
配置语法:
- 以斜杠
/开头表示目录 - 以星号
*通配多个字符 - 以问号
?通配单个字符 - 以方括号
[]包含单个字符的匹配列表 - 以叹号
!表示不忽略(跟踪)匹配到的文件或目录
此外,git 对于 .ignore 配置文件是按行从上到下进行规则匹配的,意味着如果前面的规则匹配的范围更大,则后面的规则将不会生效。
example
-
test/*
说明:忽略目录 test下的全部内容。注意!不管是根目录下的 /test/ 目录,还是某个子目录 /child/test/ 目录,都会被忽略。
-
/test/*
说明:忽略根目录下的 /test/ 目录的全部内容
SSH公钥
设置免密登录git
执行ssh-keygen -t rsa命令生成秘钥
生成. ssh目录下id_rsa.pub和id_rsa,将id_rsa.pub中内容复制到github或gitee的ssh公钥中实现免密登录。
id_rsa.pub 为公钥
id_rsa 为私钥
设置shh秘钥之后,使用ssh链接方式链接git仓库。即可不用输入账号密码,进行操作。
命令补充
git remote
# 不带参数,列出已经存在的远程分支
git remote
# 添加一个远程仓库
# git remote add origin(可修改) branch_Name(为空时默认为master) url
# 关联之后可以用git remote -v 来检查是否关联成功
git remote add url
# 列出详细信息 在每一个名字后面列出其远程url 显示对应的克隆地址。
git remote -v | --verbose
# 删除远程源
git remote rm 源名
git fetch
git fetch命令通常用来查看其他人的进程,因为它取回的代码对你本地的开发代码没有影响。
# 将某个远程主机的更新,全部取回本地
git fetch <远程主机名>
# 取回origin主机的master分支
git fetch origin master
git log
# 查看提交历史
git log
# 查看最近n次commit提交历史
git log -p -n
# 查看某次commit的内容
git show commitId
git reset
git reset是直接删除指定的commit
如果已经push尽可能不要使用reset
# 回到其中你想要的某个版
git reset --hard <commit_id>
# 回到最新的一次提交
git reset --hard HEAD^
# 此时代码保留,回到 git add 之前
git reset HEAD^
git revert
git revert是用一次新的commit来回滚之前的commit
# 撤销指定的版本,撤销也会作为一次提交进行保存
git revert <commit_id>
git revert 和 git reset的区别
- git revert是用一次新的commit来回滚之前的commit,此次提交之前的commit都会被保留
- git reset是回到某次提交,提交及之前的commit都会被保留,但是此commit id之后的修改都会被删除
代码合并
# 在本地新建一个temp分支,并将远程origin仓库的master分支代码下载到本地temp分支;
git fetch origin master:temp
# 比较本地代码与刚刚从远程下载下来的代码的区别;
git diff temp
# 合并temp分支到本地的master分支;
git merge temp
# 如果不想保留temp分支,删除;
git branch -d temp
开始使用
第一次上传
git init
# git@github.com:xiaoxin-99/test.git
git remote add origin <url>
touch README.md
git add README.md
git commit -m "add README"
# 第一次push
# (1)直接 git push origin branch 推向制定的分支
# (2)使用 git push --set-upstream origin branch
# 这样关联有一个好处,以后就不用每次git push都用第(1)种方法
git push --set-upstream origin master
# 或者使用
git push -u origin master
新建hello并上传
touch hello
echo "hello git" > hello
git add hello
git commit -m "add hello"
git push
修改hello并上传
echo "hello git !" > hello
git add hello
git commit -m "update hello"
git push
commit之前撤回修改
# 在README内容后追加"update" >> 追加 > 覆盖
echo "update" >> README.md
# 查看README.md内容
cat README.md
# 从本地仓库,恢复对README.md修改
git checkout -- README.md
cat README.md
push之前撤回修改
cat hello
echo 'update' >> hello
cat hello
git commit -m 'update hello'
git reset --hard HEAD^
cat hello
删除 hello 文件
# 取消跟踪hello文件并删除本地文件
git rm hello
# 取消跟踪hello文件但不删除本地文件
git rm --cached hello
git commit -m "rm hello"
git push
撤回已经push的修改
# 查看需要原本的版本的 commit id
git log
git revert <commit id>
git push
再探Git
冲突
场景再现
在A工作空间
echo "hello git !" > hello
git add hello
git commit -m "update hello"
git push
发生冲突
在B工作空间
echo ":)" > hello
git add hello
git commit -m ":) hello"
# 报错! 版本冲突
git push
解决
cat hello
# <<<<<<< HEAD
# hello git
# :)
# =======
# hello git !
# >>>>>>> 1e6f9813a94eb6535e7c73bdc17b565bdf205530
说明
其中特殊标识<<<<<<<和=======之间的内容是当前分支所更新的内容,特殊标识=======和>>>>>>>之间的内容是所合并的版本更改的内容。所以只需要手动解决这个冲突就可以
# -e:激活转义字符
echo -e "hellogit ! \n:)" > hello
git add hello
git commit -m "hello :)"
git push
查看修改
进入B工作空间
git pull
cat hello
冲突解决!
Git分支
从使用场景上解释Git分支
Git 的分支,就是开发过程中,要选择的一条路,你可以选择和其他小伙伴一起走同一条路,也可以自己走一条路,路与路之间相互没有影响,作为路的主人,你也随时可以让两条路合并。
命令
# 查看分支列表
git branch
# 查看远程分支列表
git branch -r
# 查看本地和远程的所有分支
git branch -a
# 查看分支信息
git branch -v
# 新建分支
git branch <branch name>
# 新建分支并切换到该分支
git branch -b <branch name>
# 合并分支到当前分支
git merge <branch name>
# 删除分支
git branch -d <branch name>
# 强制删除
git branch -D <branch name>
# 删除远程分支
git push origin --delete <branch name>
操作
# 创建一个文件夹,并初始化 Git
mkdir GitDemo
git init
# 初次提交,创建 master 分支
touch master.txt
git add.
git commit -m '添加master文件'
# 从master分支末尾,创建并切换 featureA 分支,并创建一个提交
git checkout -b featureA
touch A.txt
git add.
git commit -m '添加A文件'
# 从master分支末尾,创建并切换 featureB 分支,并创建一个提交
git checkout master
git checkout -b featureB
touch B.txt
git add.
git commit -m '添加B文件'
# 切换 master 分支
git checkout master
# master 合并 featureA 分支
git merge featureA
# master 合并featureA 后再合并 featureB 分支
git merge featureB
相关名词
branch 分支
remote 远程
pull 拉
push 推