虽然下面写了一大堆,但是现在谁TMD还用命令行啊!
#配置设置
#--global表示该用户的配置,--system表示系统上所有用户的配置
#创建用户
$ git config --global user.email "这里写邮箱"
$ git config --global user.name "这里写名字"
#避免git gui乱码
$ git config --global gui.encoding utf-8
#避免git status乱码
$ git config --global core.quotepath off
#禁止混合换行符
$ git config --global core.safecrlf true
#查看所有配置
$ git config --list
#查看所有配置以及源文件
$ git config --list --show-origin
#删除某项配置
$ git config --global --unset user.email
一个文件新创建时,处于untracked状态,等待加入仓库。
add操作之后,文件转为staged(绿色)状态,等待提交。
commit提交操作之后,文件已正式加入仓库。
当文件进行了任何修改,其状态变为modified(红色),需要再次add和commit。
#将工作目录初始化为仓库,在对应目录下创建一个.git文件夹
$ git init
#添加/更新文件,允许通配符
$ git add <FILENAME>
#从仓库和磁盘中移除文件
$ git rm <FILENAME>
#从仓库中移除文件,文件回到untracked状态
$ git rm --cached <FILENAME>
#提交文件到仓库
#备注是必需的,如果没有备注,git会强制打开记录文件让你输入备注信息
#--amend可以用本次提交覆盖上一次提交,使用上一次提交的信息
#--all或-a会提交所有修改或者删除的内容,省去一次add操作,但不影响untrack的文件
$ git commit -m "这里是备注"
#查看仓库当前状态
#--short或-s表示简洁模式
$ git status
#查看工作区和暂存区的差异
$ git diff
#查看工作区和特定版本仓库的差异,HEAD表示当前版本
$ git diff <commit>
#查看暂存区和特定版本仓库的差异,默认为HEAD
$ git diff --staged/cached <commit>
#查看两个版本仓库的差异
$ git diff <commit1> <commit2>
#移动或者重命名,仅对暂存区或者仓库中的文件有效
#其他方式的重命名git无法识别,会认为是删除和新建文件
$ git mv <file_src> <file_dst>
#撤销文件的暂存状态,用仓库中的文件代替暂存区
$ git reset HEAD <file>
#将仓库回滚到特定版本
$ git reset <commitID>
#将仓库和本地代码回滚到特定版本
$ git reset --hard <commitID>
#用git仓库中的内容替换工作区内容
#当我们要撤销对文件作出的修改,回到上一个commit版本时使用
$ git checkout -- <file>
#新建克隆远程库
#这会在当前目录下创建一个对应的文件夹,并将其初始化为一个git仓库
#此处url可以是http协议或者git协议,具体可以在github上查看
#可以起一个别名,影响生成的目录名
$ git clone <url> 别名
#显示远程库
$ git remote
#添加远程仓库,origin是远程库的别名,后面的.git内容是SSH地址
$ git remote add origin git@github.com:XXX/XXXX.git
#远程库重命名
$ git remote rename <old_name> <new_name>
#删除远程库
$ git remote remove <remote>
#从远程库中拉取所有你还没有的数据
$ git fetch <remote>
#下载远程代码更新仓库,默认是merge方法
#--rebase或-r表示用rebase方法合并仓库,会使得log更干净
$ git pull
#将当前分支master关联并推送到远程库origin中
$ git push -u origin master
#关联后,再推送只需要以下操作即可
$ git push
#回滚远端的已提交记录,不会删除之前的commit,而是生成新的commit
$ git revert <commit>
#创建新的名为testing的分支
#可以用<commitID>指定创建分支的版本
$ git branch testing
#切换到testing分支
$ git checkout testing
#上面两条可以合并为:
$ git checkout -b testing
#注意,涉及远程分支的操作建议不要-b,可能会出现冲突问题
#比较两个分支有哪些不同的提交,只列出后者的提交
$ git log master..dev
#比较两个分支有哪些不同的提交,列出双方的提交
$ git log master...dev
#合并分支,将testing合并到master上
$ git checkout master
$ git merge testing
#使用rebase衍合分支
#区别在于,merge在log上会体现为两个分支的合并
#而rebase则是将一个分支嫁接到另一个分支上,log不体现分支
#注意:公共分支禁止rebase!
$ git rebase testing
#删除已合并的分支
git branch -d testing
#强制删除未合并的分支
git branch -D testing
分支的合并问题
当testing分支是master分支的直接后继时,合并操作就仅仅是简单地将master指针后移到testing位置。
如果两个分支分别处在不同的岔路上,git会创建一个新的快照来合并两个分支。
如果不同分支不存在冲突,即不存在重复的文件修改,则git会自动进行合并。
反之,则需要手动解决冲突,决定保留哪些内容。手动解决后用git add报告
或者通过git merge --abort
取消未成功的合并
#帮助文档
#其中verb的取值可以是add, pull等动词指令
$ git help <verb>
$ git <verb> --help
$ man git-<verb>
#简易帮助文档 -h
$ git add -h
#查看当前HEAD指向的节点及其所有的父节点
#详见https://git-scm.com/book/zh/v2/Git-基础-查看提交历史
#-n来只显示最近n次的提交
#--oneline单行简洁模式
#--patch或-p显示每次提交的修改内容,--stat显示较为简单的信息
#--pretty=格式,用特定格式显示提交历史
#--graph,用流程图的形式展现提交历史
$ git log
#恢复错误的reset操作
#当将HEAD reset到一个较为早期的节点,可能会失去对后来节点的引用
#下面的指令会列出HEAD所有的提交历史,可以据此查找到目标的commit ID
$ git reflog
当一项工作尚未完成时需要转向新的工作,可以用存储操作将未提交的修改保存起来,以创造一个干净的工作目录,也便于后续恢复原来的工作。
#会把所有未提交的修改(包括暂存的和非暂存的)压入栈
#-u表示适用于untracked文件
$ git stash push
#弹栈,恢复之前缓存的工作区
$ git stash pop
#恢复之前缓存的工作区,但不弹栈
$ git stash apply
#列出所有的存储
$ git stash list
#删除一项存储,默认删除最新的
$ git stash drop <stash@{0}>
#清空存储
$ git stash clear
本地分支领先于远端分支时,可以push,pull无效果
本地分支落后于远端分支时,可以pull,push无效果
本地分支与远端分支各有领先时,无法push,要先pull解决冲突
pull的时候不允许有未commit的内容,如果不想放弃修改,建议使用stash进行暂存
merge与rebase时出现冲突,建议使用vscode手动解决冲突,解决后要stage以及commit保存更改
一般本地分支同步master时使用rebase,但当版本差异太大、冲突太多时建议使用merge,可以减少冲突数量
忽略文件,文件中指定模式的文件不会被添加到git仓库之中。可以使用glob简化的正则表达式。
评论区