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 Skovran在Pixabay上发布
git learning
https://blogoasis.github.io/post/dbf237bf.html