https://zhuanlan.zhihu.com/p/52654681
学习网站及本文插图来源
创建版本库
mkdir text
cd text
git init
把文件添加到仓库
- git add: 把要提交的所有修改放到暂存区(Stage),可以add多次,添加多个文件
- git commit:一次性把暂存区的所有修改提交到分支,把所有add的文件一次性提交到分支,相当于游戏的一次次的存档,如此可回到某次commit状态
- git log:查看提交(commit)历史
- git log --pretty=oneline:简化版历史commit信息
- git push:以上两个操作都是针对本地仓库的,push可将修改提交到远程仓库
git add text.txt
git commit -m "提交信息"
回到上一版本
- HEAD:当前版本
- HEAD^:上一个版本
- HEAD^^:上上个版本
- HEAD~100:上一百个版本
- 回退版本命令:git reset
- 查看命令历史:git reflog
git reset --hard HEAD^
# git reset --hard commit_id
工作区和暂存区
- git add:添加到暂存区stage
- git commit:把暂存区的内容提交到分支(提交后暂存区为空,工作区对比仓库无修改,提示“nothing to commit, working tree clean”)
管理修改
- 查看工作区和版本库的区别:git diff HEAD -- readme.txt
撤销修改
- 丢弃工作区的修改: git checkout -- file
- 撤销暂存区的修改:git reset HEAD file
删除文件
- 从版本库中删除文件:git rm fileName & git commit
- 恢复删除的文件:git checkout -- fileName
创建与合并分支
- 每次提交git都把他们挨个按时间先后串成一条线,这条时间线就是一个分支
- 一开始只有master分支,它是一条线,git里master指向最新的提交,HEAD再指向master
- HEAD指向当前分支,当前分支的名字是个指针,指向跟master相同的提交
- 创建一个分支的原理:新增一个指针,用HEAD指向该指针
- commit:在某分支上commit相当于增长时间线,分支的指针移动到该提交,master指针停留原地。
- checkout:HEAD指向该分支指针
- merge:与目标分支指针指向同一个commit
- -d:删除分支指针(删除分支)
- 查看分支:git branch
- 创建分支:git branch <name>
- 切换分支:git checkout <name>
- 创建+切换分支:git checkout -b <name>
- 合并某分支到当前分支:git merge <name>
- 删除分支:git branch -d <name>
解决冲突
- 场景:a分支欲提pr合并到master分支上但是二者有部分文件有冲突
git checkout master
git pull
git checkout a
git merge master
冲突并可以在代码中看到冲突提示!
修改保存
git add xxx.js
git commit -m "conflict fixed"
git push
- 查看分支合并情况:git log --graph --pretty=oneline --abbrev-commit
- 查看冲突文件:git status
- 临时切换分支保存现场:git stash
- 恢复现场:git stash pop(需切回原分支)
- 在本分支最后一次commit基础上合并另一分支的commit:git rebase xxx
git checkout a
git rebase master
冲突!
修改冲突并保存
git add xxx.js
git rebase --continue
标签
- 创建标签: git tag v1.0
- 给某次commit添加标签:git tag v1.0 commitID
- 查看标签: git tag
- 查看标签信息:git show v1.0
- 删除标签:git tag -d v1.0
- 推送标签到远程:git push origin v1.0
- 一次推送所有未推送标签到远程:git push origin --tags
- 删除远程标签:git tag -d v1.0 & git push origin :refs/tags/v1.0