假设实验文件为test.txt,实验分支为bra01
查看工作区状态
git status / git status --long //查看工作区整体状态
git status -s / git status --short //以缩减格式查看工作区整体状态
git status -v / git status --verbose //在工作区整体状态后,展示已暂存文件文本变化差异
git status -v -v //在工作区整体状态后,展示包括未暂存文件文本变化差异
git status test.txt //查看test.txt状态
查看提交历史
git log //默认格式查看提交历史
git log --author="Name" //查看某个作者的提交
git log --stat //默认格式附加简略统计信息
git log -p / git log -u / git log --patch //默认格式附加文件变化内容信息
git log --graph //默认格式附加点线图,提供和分支相关信息
git log -3 //查看最近的3次提交
查看本地仓库head变化历史
git reflog //本地仓库head变化后,都会记录在reflog命令里
左侧显示命令执行后的commit ID,右侧显示让仓库head变化的命令内容
当本地仓库从新版本回退到旧版本后,再想回退到新版本的话,需使用reflog查看新版本的commit ID
查看文件改动
git diff //查看所有未缓存文件改动
git diff --stat //查看所有未缓存文件改动的摘要
git diff test.txt //查看指定未缓存文件改动
git diff --cached //查看所有已缓存文件改动
git diff --cached test.txt //查看指定已缓存文件改动
git diff head //查看所有未缓存和已缓存文件改动
git diff head^ head //查看上次提交相对于上上次提交的改动
删除未跟踪文件
git clean -f / git clean -nf //删除untracked文件 / 查看删除的文件名
git clean -fd / git clean -nfd //删除untracked文件和目录 / 查看删除的文件名
git clean -xfd / git clean -nxfd //删除untracked文件和目录和ignored文件 / 查看删除的文件名
添加操作
git add test.txt //添加test.txt到暂存区
git add . //添加当前目录下所有改动的文件到暂存区
撤销添加
git reset //撤销添加到暂存区的所有文件
git reset test.txt //撤销添加test.txt到暂存区
提交操作
git commit -m "description" //将已add文件提交到本地仓库
git commit -a -m "description" //自动add已跟踪文件, 然后提交到本地仓库
git commit --amend -m "desc" //用一次新的提交覆盖上一次提交,产生新的commit id
//相当于git reset --soft HEAD^;git commit -m "desc"; 可在git reflog里找到被覆盖的commit id
撤销提交
git reset --hard head^ //回退到上个版本
上面回退版本的reset命令属于git reset [<mode>] [<commit>]模式,这里介绍下用法
mode选项用来控制是否修改工作区和暂存区, 不会动未跟踪文件
--soft //只回退版本,不修改工作区, 把重置所带来的新的差异放进暂存区。
应用情况:上次commit的文件或message错误,可用git reset --soft head^后再重新提交
--hard //重置工作区和暂存区
应用情况:让工作区,暂存区,本地仓库都回退到上个版本,git reset --hard head^
--mixed //默认的模式,重置暂存区,不修改工作区
-------------------------------------------------------------------------------------------------------------------
git revert --no-edit head //提交head版本的逆向操作, 自动生成提交描述
git reset和git revert的区别:
git reset是根据指定的模式,让工作区和暂存区变为commit id的状态,移动head指针到commit id
git revert是创建commit id的逆向提交,中和commit id的提交,head指针前进
文件回滚
1.文件a已修改未add:git checkout a
2.文件a已修改未commit:git reset test.txt,git checkout a
3.文件a已commit:git reset --hard head^
远程仓库操作
git clone url //克隆远程仓库到本地
git remote //查看远程仓库,默认origin
git remote -v //查看远程仓库及url
git remote show origin //查看远程主机详细信息
git pull //更新并合并,相当于git fetch + git merge fetch_head或origin/master
git pull --rebase //更新并变基,相当于git fetch + git rebase fetch_head或origin/master,有unstaged状态文件无法执行此命令
git fetch //更新远程仓库副本,不会更新工作区,可通过git diff head origin/master查看差异
git push //推送本地仓库到远程仓库
git push origin bra01 //将本地分支bra01推送到远程仓库
git push origin --delete bra01 //删除远程分支bra01
临时存储
git stash //临时存储工作区和暂存区内容,可用于之后在本地分支恢复
git stash save "des" //临时存储并增加描述
git stash list //查看临时存储清单
git stash pop //将临时存储栈顶应用至本地分支,并删除栈顶记录
git stash apply stash@{2} //应用指定名字的贮藏
git stash drop stash@{0} //删除指定名字的贮藏
git stash clear //清空临时存储清单
git stash --all //贮藏包括未跟踪的文件
分支操作
git branch //查看本地分支
git branch -r //查看远程分支
git branch -a //查看所有分支
git branch -vv //查看分支跟踪关系,最后一次提交id和msg
git branch bra01 //创建分支
git checkout bra01 //切换分支
git checkout -b bra01 //创建并切换分支
git checkout -b bra01 origin/bra01 //从远程分支检出一个本地分支并创建跟踪关系
git branch -D bra01 //强制删除分支(删除前需切换到其他分支)
git push origin --delete bra01 //删除远程分支
git merge bra01 --no-edit //合并分支bra01到当前分支,使用自动生成的提交信息
git branch -u origin/bra01 / git branch --set-upstream-to= bra01 / git push --set-upstream origin bra01 //建立本地分支和远程分支的跟踪关系
tip:只有建立了跟踪关系的本地分支可以执行简略的git push和git pull
git rebase bra01 //变基操作,合并分叉的提交历史
变基目的:为了使推送到远程仓库的提交不产生分叉。实际情况是只要本地的提交产生分叉,推送后就会使远程仓库的记录也产生分叉。换言之,只要消除了本地提交的分叉,就可以消除远程仓库的分叉。
应用原则(git官方文档原文):总的原则是,只对尚未推送或分享给别人的本地修改执行变基操作清理历史,从不对已推送至别处的提交执行变基操作。
先来看一个没有用到变基的例子:
master和branch1分支有共同的提交节点c0,branch1进行了一次提交c1,master进行了一次提交c2,切换到master分支后,执行合并命令git merge branch1 --no-edit
执行git log --oneline --graph查看提交日志,产生了分叉;git push推送到远程仓库。
本例远程仓库使用的是gitblit,可见远程仓库的日志和本地仓库的日志一样也产生了分叉。变基就是为了消除本次提交产生分叉的情况(对于远程仓库已存在的分叉记录,建议不要管了)
关于通过gitblit搭建远程仓库可以参考上一篇文章,传送门:通过gitblit搭建git远程仓库的步骤_gitblit设置远端服务器-CSDN博客
再来看同样需求,使用变基而不是合并的例子:
master和分支branch2有相同提交节点c4,master提交了c5,branch2提交了c6,切到master分支后,执行git rebase branch2,若没有冲突则变基成功;通过git log --graph --oneline查看日志如下,没有了分叉,提交到远程仓库后也没有分叉。