git配置user信息
- $ git config --global user.name 'your_name'
- $ git config --global usernemail 'your_email@domain.com'
git config的是三个作用域
缺省等同于local
- git config --local: 只对某个仓库有效
- git config --global: 对当前用户所有仓库有效
- git config --system: 对系统所有登录的用户有效
显示config的配置:
- git config --list --local
- git config --list --global
- git config --list --system
git add将工作目录中修改过的文件提交到暂存区
git add . 或者 git add -u(update)
git mv修改工作目录中某个文件的文件名
git mv <old_file_name> <new_file_name>
git log查看版本演变历史
- git log查看当前分支的详细commit记录
- git log --oneline: 查看commit的记录列表(简洁)
- git log -n4: 查看最近的4次记录(-n后面跟着的数字可自定义)
- git log --all查看所有分支的commit记录
- git log --graph: 图形化
查看分支
- git branch -v 查看本地所有分支
- git branch -av 查看本地和远端所有分支
深入.git文件夹探个究竟
- git cat-file -t <hash>: 查看文件类型
- git cat-file -p <hash>: 查看文件内容
- HEAD文件: cd .git & cat HEAD, 保存了当前所在分支
- config文件: cat .git/config, 当前项目的git配置
- objects文件夹: 存放了文件的内容
git核心对象
- commit
- tree
- blob
HEAD指向什么
- HEAD可以指向当前分支, 然而通过查看分支的内容(cat .git/refs/heads/<branch_name>)其实是一个hash, 通过git cat-file -t <hash>可以知道该hash是一个commit, 所以HEAD最终还是指向一个commit
- 如果是分离头指针情况下(git checkout <commit_hash>),HEAD可以指向当前commit
通过HEAD比较2个commit的差异(git diff)
- git diff <commit_hash1> <commit_hash2>, 这是普通写法
- git diff HEAD HEAD^
- git diff HEAD HEAD^1, 1可以省略
- git diff HEAD HEAD~1, HEAD~1相当于HEAD^
- git diff HEAD HEAD^^
- git diff HEAD HEAD~2 HEAD^ HEAD~1相当于是当前commit的父commit
删除不需要的分支
- git branch -d <branch_name>: 会因为分支还没合并等原因无法删除
- git branch -D <branch_name>: 强制删除, 需要事先确认风险
修改commit的message
- 修改最近一次commit的message: git commit --amend, 然后点击键盘i键入INSERT模式, 编辑完成后输入'wq!'确保写入并退出
- 修改老旧commit的message: git rebase -i <commit_hash> 但是commit_hash要选择我们即将修改的commit的上一个commit. 首先根据我们要操作的类型选择command, 如pick reword edit等. 然后':wq!'保存, 此时git会进入下一个操作界面, 这时候才是真的的修改commit_msg, 输入'i'编辑完成后保存并退出, 这时候就真正的完成了老旧的commit_msg修改
变基
把连续多个commit整理成1个
git rebase -i <commit_hash>, 使用's'选择要合并的commit
把间隔的几个commit整理成1个
git rebase -i <commit_hash>, 但是需要在INSERT编辑阶段, 手动调整commit顺序
比较暂存区和HEAD所含文件的差异
git diff --cached
比较工作区和HEAD所含文件的差异
- git diff
- git diff -- [filename] [filename]: 表示只对比某个文件或指定的多个文件
让暂存区恢复成和HEAD一样
git reset HEAD
让工作区恢复成和暂存区一样(撤销修改)
- 已修改, 未暂存(还未add)
git checkout .
git checkout -- [filename]
git reset --hard
- 已暂存, 未提交(已add, 但还未commit)
git reset
git checkout .
或者
git reset --hard
- 已提交未推送(已add && commit, 但未push)
git reset --hard origin/master
- 已推送(add && commit && push)
git reset --hard HEAD^
git push -f
git push -f指令是强制push到远程仓库, 理论上应禁止使用
取消暂存区部分文件的更改
git reset HEAD -- [filename]
消除最近的几次提交
git reset --hard <commit_hash>
查看指定文件在2个分支或2个commit的差异
- git diff <branch_A> <branch_B> -- <filename>
- git diff <commit_A> <commit_B> -- <filename>
删除文件
git rm <filename>
临时存储文件
- git stash
- git stash list: 查看存储的堆栈
- git stash apply: 将之前存储的内容弹出, 但是stash list的堆栈中内容依旧在
- git stash pop: 讲之前存储的内容弹出, 但是stash list的堆栈中内容也一并删除
指定不需要git管理的文件 .gitignore
- node_modules: 表示忽略node_modules文件或者node_modules文件夹下的所有文件
- node_modules/: 表示忽略node_modules文件夹下的所有文件
- 后面加不加'/'还是有点区别的
github淘项目
- 在输入框写入关键字后, 再加上in:readme表示在readme文件中查找关键字; stars:>1000 举个例子: 'Flutter project in:readme starts:>1000'
- 'code'+'code' filename:<filename>: 这种方式可以搜代码