Git 学习小笔记(欢迎纠错)

Git 总述

git 是用树形结构管理维护代码各个版本分支的工具,代码的记录类似结点一般保存

从库中拿出一个版本的代码,更新后存成一个新结点,可以随时回滚 / 查看历史版本,以及多人协作

概念
  1. 工作区:仓库的目录文件夹,不涉及分支
  2. 暂存区:暂时存放每个文件的状态,可认为是工作区到版本库的缓存,不涉及分支
  3. 版本库:长期存放所有已经提交到本地仓库的代码版本
  4. 版本结构:树结构,树中每个节点代表一个代码版本

可以认为树随着版本更新不断维护顶端结点 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) 将当前分支推送到远程仓库
git pull 	
# 将远程仓库的当前分支与本地仓库的当前分支合并

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当前指向的版本,说到底还是一个目录,只是有强大的备份能力
# 所以所谓的删除仓库内文件,指的也是更新一个删除后状态的版本

MGC理解——工作区是在本地的文件和工作,把希望保存的文件状态模式放在暂存区,最后将暂存区传到仓库中保存为一个版本备份。

# 加上 --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的仓库
# 例如:git remote add origin git@github.com:xcr/project.git

git push -u (可以无-u) 	
# 将当前分支推送到远程仓库
git push origin 分支(一般默认是master)	
# 将某个分支推送到远程仓库

云端上可以直观地查看提交记录,可以点选版本,浏览代码或回滚

克隆到本地的文件能保持树形结构,但没有 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 分支名	
# 将远程仓库的 指定分支 覆盖到本地仓库当前分支
  1. 跨端的合并,表现出来就是覆盖
  2. 云端仓库内部合并可由鼠标完成,略过

  • 学完以上内容后,看看这张图加深理解

img

stash暂存(使用场合较少)
git stash	# 将工作区和暂存区中尚未提交的修改存入栈中

git stash apply	# 将栈顶存储的修改恢复到当前分支,但不删除栈顶元素
git stash drop	# 删除栈顶存储的修改
git stash pop	# 将栈顶存储的修改恢复到当前分支,同时删除栈顶元素

git stash list	# 查看栈中所有元素
  • 一个可能的使用场景:

对一个新分支,文件的 commit 进行了一半时意外断电,恢复后希望继续从新分支的起点开始提交

此时可以将未提交的文件入栈,接着将已经提交的部分文件合并入主分支。再新开一个分支提交剩余的文件

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值