git常用命令和复杂知识点详解

假设实验文件为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查看日志如下,没有了分叉,提交到远程仓库后也没有分叉。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ellis1970

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值