git learning

本文最后更新于:2022年12月3日 凌晨

用一棵树,维护所有的代码历史记录

  • 一个人的代码版本回顾
  • 多个人的代码协同开发
  • 版本管理、可持久化、多人协作

基本概念

  • 工作区:本地看git的文件夹,即当前工作目录,与分支无关
  • 版本库:repository,存储所有提交到本地的代码版本
  • 暂存区:工作区与版本库之间的桥梁,多次本地工作,但是尚未构成一次提交,可以先到暂存区,本次阶段完成后,进入版本库。与分支独立,所有的分支其实是共用一个暂存区

常用命令

配置

  • git config --global user.name xxx:设置全局用户名,信息记录在~/.gitconfig文件中
  • git config --global user.email xxx@xxx.com:设置全局邮箱地址,信息记录在~/.gitconfig文件中
  • ssh-keygen -t ed25519 -C "your_email@example.com": 生成一个新的密钥

本地操作

  • git init : 把当前目录变成一个git仓库
  • git status: 显示状态,untracked就是未加入到暂存区
  • git add <filename>:加入filename到暂存区中
  • git add .:将所有待加入暂存区的文件加入到暂存区(忽略.gitignore)
  • git commit -m "message":把暂存区内容加入到当前分支
  • git commit --amend
  • git diff XX: 查看某个文件相对于当前分支的最新版本修改了哪些内容(即commit的与尚未add的,版本库的内容与尚未add的内容)
  • git rm --cached XX: 将某个文件从暂存区删除出来,并且我也不管理它
  • git restore --staged XX: 将某个文件从暂存区删除,但是还要管理(相比于上面,不需要再次add)
  • git log:查看当前分支的所有版本(从最开始到HEAD所在位置)
  • git reset --hard HEAD^: 将代码回滚一个版本,一个三角一个版本,100个版本加数字
  • git reflog:HEAD的移动记录
  • git reset --hard {hashval}:回滚到任意版本,借助上一条命令得到哈希值
  • git restore <filename>: 撤销该文件所有工作区的修改,回滚到暂存区的阶段,如果暂存区没有内容,那么就是回滚到头节点指向的那个阶段。(即使是删除文件,也可以回滚)
  • git restore --staged XX: 将某个文件从暂存区删除,回到了工作区
  • git branch -d branch_name:删除本地仓库的branch_name分支
  • git branch branch_name:创建新分支

远程操作

  • git remote add origin git@github.com:xxx/XXX.git:将本地仓库关联到远程仓库
  • git remote remove origin:移除远程仓库
  • git push --set-upstream origin branch_name:设置本地的branch_name分支对应远程仓库的branch_name分支
  • git branch --set-upstream-to=origin/branch_name1 branch_name2:将远程的branch_name1分支与本地的branch_name2分支对应
  • git pull:将远程仓库的当前分支本地仓库的当前分支合并
  • git pull origin branch_name:将远程仓库的branch_name分支与本地仓库的当前分支合并
  • git checkout -t origin/branch_name 将远程的branch_name分支拉取到本地
  • git push origin --delete <branch_name>:删除远程分支

栈操作(stash)

  • 可以将某一时刻的工作区与暂存区全部存储到一个栈中
  • git stash:将工作区和暂存区中尚未提交的修改存入栈中
  • git stash apply:将栈顶存储的修改恢复到当前分支,但不删除栈顶元素
  • git stash drop:删除栈顶存储的修改
  • git stash pop:将栈顶存储的修改恢复到当前分支,同时删除栈顶元素
  • git stash list:查看栈中所有元素

细节:

1. add

如果创建一个文件,此时尚未add,则未track任何文件,会提示哪些未track

这个新文件,未add之前,无论如何修改,git status给的提示都一样

add之后,会显示有一个新文件,此时如果继续修改,则变成两份:一份是待提交给版本库的commit,也就是add过的那个版本;另一份是没有add的修改

  • 此时如果继续add,则两次add内容合并,git只显示你创建了一个新文件

  • 此时如果先把之前的commit,则只把add之前的那个版本提交,add后修改的不动,此时查询状态,是修改状态(且尚未提交)。

删除文件的操作也可以加入到暂存区中,删除是一种特殊的修改

2. commit

  • 一次commit之后,就会根据当前在哪一个分支,在这个分支下新开一个节点,之前节点+新commit的这些加入到这个新节点中,然后修改HEAD指针,指向这个新节点

  • 实际上是将暂存区持久化,如果某个文件在工作区,没有被放到暂存区,那么这个文件也不会被提交。

  • 所有的节点都是commit出来的

  • 提交commit一次之后,当前目录下的暂存区清空,git的track状态变为null,即不再追踪任何文件

3. origin

  • 云端只有一个编辑环境,并没有一个运行环境

4. Mac problem

  • mac下有一个DS_Store文件,需要忽略:Add**/.DS_Store into .gitignore for the sub directory

Ref

该图片由Daniel SkovranPixabay上发布


git learning
https://blogoasis.github.io/post/dbf237bf.html
作者
phInTJ
发布于
2022年11月11日
许可协议