Git 介绍
总述
git 是用树形结构管理维护代码各个版本分支的工具,代码的记录类似结点一般保存
从库中拿出一个版本的代码,更新后存成一个新结点,可以随时回滚 / 查看历史版本,以及多人协作
概念
-
工作区:仓库的目录文件夹,不涉及分支
-
暂存区:暂时存放每个文件的状态,可认为是工作区到版本库的缓存,不涉及分支
-
版本库:长期存放所有已经提交到本地仓库的代码版本
-
版本结构:树结构,树中每个节点代表一个代码版本
可以认为树随着版本更新不断维护顶端结点 HEAD 指针(指向一个分支的最新版本)
Git 命令
全局设置
git config --global user.name 名字 # 设置全局用户名,信息记录在~/.gitconfig文件中
git config --global user.email 邮箱 # 全局邮箱地址,信息记录同上
git init # 将当前目录配置成git仓库,信息记录在隐藏的.git文件夹中
常用命令
git add XX # 将文件的修改状态加入暂存区(包括创建,修改,删除)
git add . # 所有未加入的都加入
git commit -m "备注" # 将暂存区内容提交为当前分支的新结点(同时清空暂存区)
git status # 查看仓库状态(未管理文件,未提交文件,暂存区状态改变未更新的文件等)
git diff XX # 查看文件相比暂存区修改了哪些内容
git log # 查看当前分支的所有版本(只能看前面,不能看后面)
git log --pretty=oneline # 用一行来显示,看起来清楚
git push -u # (第二次以后不需要-u) 将当前分支推送到远程仓库
# -u 是 --set-upstream 的缩写
git pull # 将远程仓库的当前分支与本地仓库的当前分支合并
# 注意点:本地未commit,且未放入stash的修改会被覆盖;合并可能要处理冲突
git clone git@远程仓库域名:远程路径.git # 将远程仓库XXX下载到当前目录下
git branch # 查看所有分支和当前所处分支
查看命令
git reflog # 查看HEAD指针的移动历史(更新和回滚)
删除&回滚
git rm 文件名 # 删除工作区和暂存区的文件
git rm --cached 文件名 # 从暂存区里移除
git restore --staged 文件名 # 从暂存区里移除
git restore 文件名 # 从暂存区移出并覆盖工作区
# 若暂存区空,就将仓库HEAD指向版本覆盖到工作区
git checkout -- 文件名 # 同上,这两个命令还可以回滚误删的文件
# 可以将删除后的暂存区commit,就会将删除后的版本加入仓库
# 注意,在使用仓库代码时只关注HEAD当前指向的版本,说到底还是一个目录,只是有强大的备份能力
# 所以所谓删除仓库内文件,指的是更新一个删除后状态的版本
理解:工作区是本地的工作文件,把文件希望被保存的状态放在暂存区,最后将暂存区传到仓库中保存为一个版本备份
# 加上 --hard 后,回滚会删除仓库新版本,同时把工作区文件也回滚到指定版本
git reset --hard HEAD^ # 一个^代表往上回滚一个版本(HEAD指针移动,回退本地仓库)
git reset --hard HEAD~ # 代码库回滚到上一个版本
git reset --hard HEAD~100 # 后面加数字表示回滚次数
git reset --hard 版本号 # (向前或向后)跳转到某一特定版本,版本号是reflog前的哈希值
# 没有 --hard 时,回滚变成直接往回移动 HEAD 指针,不会真正删掉版本。而工作区不会自动改变,需要手动 checkout
git reset # 其他用法相同
远程仓库
远程代管能避免本地仓库意外丢失的情况,有的还提供图形化界面,直观显示版本分支树
本地的
.git
目录内就包含本地仓库,代码的修改记录和版本都在其中类似的,要取得的云端仓库,路径后也有一个
.git
后缀
git remote add origin ssh邮箱:仓库路径.git # 将本地仓库关联到远程仓库
# origin 是惯用的远程仓库名,在远程有一个名叫origin的仓库与本地对应,下面都用origin代称
git push -u origin master # (首次)推送当前分支到远程仓库,master为默认分支
git push # (第二次开始)推送当前分支到远程仓库
git push -u origin 分支名 # 将某个分支推送到远程仓库
云端上可以直观地查看提交记录,可以点选版本,浏览代码或回滚
克隆到本地的文件能保持树形结构,但没有 HEAD 的移动日志
git clone ssh邮箱:仓库路径.git # 将远程仓库下载到当前目录
git push --set-upstream 远程仓库名 分支 # 使本地的该分支对应远程仓库的同名分支
git push -d origin 分支 # 删除远程仓库的某个分支
git checkout -t origin/分支 # 将远程的某个分支拉取到本地
git pull # 将远程仓库的当前分支与本地仓库的当前分支合并
git pull origin 分支 # 将远程仓库的某个分支与本地仓库当前分支合并
git branch --set-upstream-to=origin/分支A 分支B # 将远程的分支A与本地的分支B对应
分支
默认(主)分支是 master,多分支会用于更复杂的版本树,多用在多人开发的情况
创建分支相当于新的头结点,还没有一条实体分支,但分支确实存在,commit 后才会形成。
整个树共用暂存区和工作区
本笔记中的涉及 HEAD 移动的命令都会改变工作区内容,此外有些命令可以不改变工作区
git branch 分支名 # 创建新分支
git branch # 查看所有分支和当前所处分支(*)
git checkout -b 分支 # 创建并切换到这个分支,等于branch + checkout
git checkout 分支名 # 切换到分支
git merge 分支名 # 将分支合并到当前分支上
# 如果当前分支 HEAD 不是引出支路的点,合并会有冲突,需要处理冲突,之后分支上保存处理后的版本
# 合并成功后会直接影响当前工作区的文件
git branch -d 分支名 # 删除本地仓库的此分支(类似释放头结点,如果没有合并就删除会提醒)
git push --set-upstream origin 分支名 # 将远程的某分支与本地当前分支对应,没有就创建
# push的时候对应联系,但平时数据是独立的,而且名字可以不同
git branch --set-upstream-to=origin/分支A 分支B # 将远程的分支A与本地的分支B对应
git push -d origin 分支 # 删除远程仓库的某个分支
git checkout -t origin/分支名 # 将远程的某分支拉取到本地
git pull # 将远程仓库的 对应分支 覆盖到本地仓库的当前分支
# 再 git checkout 就可以覆盖到工作区
git pull origin 分支名 # 将远程仓库的 指定分支 覆盖到本地仓库当前分支
- 跨端的合并,表现出来就是覆盖
- 云端仓库内部合并可由鼠标完成,略过
- 学完以上内容后,看看这张图加深理解
stash暂存(使用场合较少)
git stash # 将工作区和暂存区中尚未提交的修改存入stash中
git stash apply # 将stash存储的修改恢复到当前分支,但不删除元素
git stash drop # 删除存储的修改
git stash pop # 将存储的修改恢复到当前分支,同时删除元素
git stash list # 查看stash中所有元素
可能的使用场景:
一个新分支,文件的 commit 进行一半时意外断电,导致部分内容未 commit。主机恢复后,希望重新提交为新分支结点
此时将未提交的文件加入 stash,再将已经提交的部分合并入主分支,不影响 stash 内的文件,再新开一个分支进行新的 commit
工作区迁移,或是操作问题导致版本不同步,此时新的修改未 commit,可以加入 stash,待其他内容合并、同步版本后再取出