先把清单列出来git cheat sheet
git 命令总结
- git的init和git clone
- git add和git commit 提交二连
- git checkout 反向操作
- git reset 回退HEAD指针
- git revert 同回退HEAD指针
- git branch 分支操作
- git checkout 切换分支
- git status和git log 两个查看状态命令
- git reflog 查看参考日志
- git stash 暂存分支进度
- git push和git pull
- git rebase
- git clean 清除未追踪文件
git的init和git clone
两个初始化的时候会用的命令,一般在刚开始项目的时候来进行使用。这里需要说明的是:
- git init命令是用于初始化git的仓库,也就是隐藏的那个.git文件,这个使用的情况是什么呢,就是我们要把本地的仓库推到远端,就需要在本地先创建仓库,然后用命令remote add进行远端仓库的连接,这时候我们本地其实有两个分支,分别是master和origin/master(一般在下面命令中都用origin)
git remote add 主机名称(origin) 域名
- git clone命令是用于将远端的仓库拉取下来,这个拉取下来是什么情况呢,首先他会把代码和远端的.git文件都拉取下来(会在你的拉去目录下面新建一个整个项目的文件目录,所以不需要先建好主目录再clone),这样其实我们就不需要用init命令了,然后他拉取下来的一定是master分支的一个clone,所以现在你会有一个与远端一样的master分支,然而现在你还有若干个origin的分支(命令默认远端主机为origin),肯定有的是origin/master,还会拉取别的几个最老的分支(太多也不会,我这边试出来是出了master还有四个分支)。
- 还有这个origin我一直在强调是默认的,他其实和master一样都是使用习惯,我们同时也可以再用remote add添加其他的远端仓库,其实没什么神秘的就是一个网址而已。(一般用ssh,也可用https和另外一个方式)
git add和git commit 提交二连
这个就不用多说了,git三个区的概念,注意要理解git是记录差异的系统,整个git仓库里面代码就只有一份(好像是这么说的吧)
git checkout 反向操作
这个点就和上面遥相呼应
git checkout -- .
- 先说这个,这个是从index/stage(就用stage吧)里面取出来放回工作区的,这里有一个注意的是checkout命令是有切换分支的作用的,所以你必须要把文件加上去,这里"–“就代表stage,”."就代表所有文件。
还有一个要注意的点就是他取出来的时候是不会关心你新建的文件的,比如你add完之后再创建一个test.c文件,他是不会根据stage里面的情形把test.c删除的,但是你修改了或者删除了文件都会改回去。我估计这是因为新的文件是一个Untracked的状态
git checkout HEAD .
-
同上面的命令一样,这个里面的"."也是必不可少的,你要告诉git你是要操作文件才行。这个命令从HEAD指向的分支指向的commit里面取出代码将工作区和stage里面全部还原成同样的结构(注意描述的git结构)
-
最后再说一点,经常会有把git checkout回退功能和git reset的功能放在一起比较的说法,有一定的道理。
因为在git checkout和git reset的功能上有很相似的地方因为他们都可以移动指针(尽管checkout有那么多功能),但两个命令在移动指针的功能上有一个最大的差别
- checkout移动的是HEAD指针本身,是为了在不同指向之间进行移动的
- reset移动的是HEAD指针指向的那个指针,是为了对commit进行抛弃的
-
最后再说一点(不好意思),最新版本的git中提倡使用resotre,原因是checkout的功能有点多,其实可以追随一下潮流。
git reset 回退HEAD指针
前面谈到了就直接在这里说,我在这稍微引用一点内容
我也觉得下面这个格式很蠢,想看的直接点链接好了^ _ ^
reset三种模式区别和使用场景
区别:
--hard:重置位置的同时,直接将 working Tree工作目录、 index 暂存区及 repository 都重置成目标Reset节点的內容,所以效果看起来等同于清空暂存区和工作区。
--soft:重置位置的同时,保留working Tree工作目录和index暂存区的内容,只让repository中的内容和 reset 目标节点保持一致,因此原节点和reset节点之间的【差异变更集】会放入index暂存区中(Staged files)。所以效果看起来就是工作目录的内容不变,暂存区原有的内容也不变,只是原节点和Reset节点之间的所有差异都会放到暂存区中。
--mixed(默认):重置位置的同时,只保留Working Tree工作目录的內容,但会将 Index暂存区 和 Repository 中的內容更改和reset目标节点一致,因此原节点和Reset节点之间的【差异变更集】会放入Working Tree工作目录中。所以效果看起来就是原节点和Reset节点之间的所有差异都会放到工作目录中。
使用场景:
--hard:(1) 要放弃目前本地的所有改变時,即去掉所有add到暂存区的文件和工作区的文件,可以执行 git reset -hard HEAD 来强制恢复git管理的文件夹的內容及状态;(2) 真的想抛弃目标节点后的所有commit(可能觉得目标节点到原节点之间的commit提交都是错了,之前所有的commit有问题)。
--soft:原节点和reset节点之间的【差异变更集】会放入index暂存区中(Staged files),所以假如我们之前工作目录没有改过任何文件,也没add到暂存区,那么使用reset --soft后,我们可以直接执行 git commit 將 index暂存区中的內容提交至 repository 中。为什么要这样呢?这样做的使用场景是:假如我们想合并「当前节点」与「reset目标节点」之间不具太大意义的 commit 记录(可能是阶段性地频繁提交,就是开发一个功能的时候,改或者增加一个文件的时候就commit,这样做导致一个完整的功能可能会好多个commit点,这时假如你需要把这些commit整合成一个commit的时候)時,可以考虑使用reset --soft来让 commit 演进线图较为清晰。总而言之,可以使用--soft合并commit节点。
--mixed(默认):(1)使用完reset --mixed后,我們可以直接执行 git add 将這些改变果的文件內容加入 index 暂存区中,再执行 git commit 将 Index暂存区 中的內容提交至Repository中,这样一样可以达到合并commit节点的效果(与上面--soft合并commit节点差不多,只是多了git add添加到暂存区的操作);(2)移除所有Index暂存区中准备要提交的文件(Staged files),我们可以执行 git reset HEAD 来 Unstage 所有已列入 Index暂存区 的待提交的文件。(有时候发现add错文件到暂存区,就可以使用命令)。(3)commit提交某些错误代码,或者没有必要的文件也被commit上去,不想再修改错误再commit(因为会留下一个错误commit点),可以回退到正确的commit点上,然后所有原节点和reset节点之间差异会返回工作目录,假如有个没必要的文件的话就可以直接删除了,再commit上去就OK了。
基本已经讲的很通透了这里,所以我们这里要说的是如果我们用命令
git reset HEAD
会实现什么效果?默认为mixed模式,本身HEAD指针是不调整的,然而最近一次commit的内容被更新到了stage里面,工作区没有任何变动,是不是和上面的两个checkout加在一块感觉是完整的一套操作。但是不是的,只是这三个功能正好互补了而已,要明白这里面的本质思路。
git revert 同回退HEAD指针
顺带一提这里有一个git revert操作,和git reset操作一样是用来调整HEAD指针的,不过提交结构是不同的,上面的是舍弃提交将指针向前一动,而这个是复制一份前面的提交指针向后移动。这个操作方便取消自己的回退,而git reset想取消就得用git reflog来查找自己舍弃的commit的id号来进行回撤。
git branch 分支操作
- 什么都不加,查看本地分支和现在所在的分支
- 直接加一个名字,创建一个以此为名的分支
- 参数-D加名字,删除以此为名的分支
- 参数-a,查看所有分支(本地和远程)
- 参数-r,查看远程分支
- 参数-v,查看本地所有分支上一次commit信息,可附加-a查看远程
- 参数-vv,查看本地所有分支与远程分支关联信息(这个在建立分支时很重要)。可附带-a但远程分支因为没有关联远程分支,只有上一次提交信息
git checkout 切换分支
- 加上一个名字,切换到对应名字的分支,没有报错
- 参数-b加名字,创建一个以此为名的分支并切换到他
- 加上一个名字,如果这个名字对应origin里面的一个分支,那么会自动创建本地的同名分支并同步origin中的内容。这个操作在实际下拉别人分支时使用。
这里想说一下,在分支切换的时候我们是要保证自己的git当前分支是干净的(git status命令)。因为我们在这个工作情景下就不需要考虑三个区交互的情况,用这个命令的时候我们一定是在这个分支上面开发完成了之后在考虑分支之间的交互,如果要在这里再考虑三个区交互就太过多余,根本不符合程序开发的精神。
这里有什么启示,我们程序的规则都是人来制定的,而不是现已存在的自然规律,我们开发的时候目标是为了实用而不是为了完整的逻辑链,因而在学习和掌握程序规则的时候要有明确的场景观念和目的观念,只有在这种思维之下才能更好更快地进行掌握。
git status和git log 两个查看状态命令
- git status查看当前分支状态
- git log查看提交记录
- 这两个敲上去看就完事了,注意git status只能显示当前分支的状态,git log不加参数显示当前分支提交记录,可以加分支名来显示其他分支的提交记录。
git log 常用参数
- 参数 --pretty=oneline,将每个commit信息展示在一行
- 参数 --abbrev-commit,将每个commit的哈希值只显示固定的前几位
- git log还可以用简单的形式去加参数,常用的有 :
- 参数 --oneline显示为单行信息
- 参数 --graph显示树形结构
- 参数 --all显示所有的分支信息,和前两条合用效果极好看。
- 参数 --stat和 -p显示提交的改动记录,前者主要显示文件的增减,后者以diff形式显示文件的具体增加删除。
- 参数 --decorate会在输出的同时显示关联引用(比如分支,tag之类的信息)(这个感觉不太清楚怎么用)。
git reflog 查看参考日志
- reflog:Reference logs(参考日志)
git reflog可以显示可引用的历史版本记录,所有的HEAD指针改动操作会被他记录下来,常用于处理误操作之后进行的commit回退等。 - 注意这个reflog并不是Git仓库的一部分,而是本地所特有的,他记录了你从建立仓库以来的所有操作以供参考。
- 能引起指针变化的操作总结
git checkout branchName:切换分支 。
git commit:提交。
git reset commit:重置。
git checkout commit:签出某一个提交。
git merge:合并操作。
git rebase:基变。
git pull:相当于 fetch + merge 。
git pull : Fast-forward:没有冲突,快速前进。
git pull --rebase:相当于fetch + rebase。
git clone:初始化ref 。
- 具体用法参考
git stash 暂存分支进度
前面有说,当我们切换分支的时候一定要确保分支上面是干净的,但是如果我们有一个不相关的任务需要切换到别的分支上面工作,而现下工作又只进行了一半怎么办呢。可行的方法是现在直接来一个commit然后在别处工作,但是当你回到工作现场的时候就会有一个无用commit,强迫症想要整理他还得花些功夫,这对于我们来说太不优雅。于是我们就有了这样一个命令来进行分支上面的暂存现在已经完成的进度,先让他变成一个干净的分支,之后回来的时候再用list,apply,drop,pop(都是在git stash下的操作)等一系列操作进行恢复。
- git stash直接暂存当前分支修改。
- git stash list列出当前暂存的内容及暂存时的message。
- git stash save “message” 暂存内容的同时进行内容编辑。
- git stash pop弹出暂存栈(后进先出)最上层内容并与当前分支合并。
- git stash apply保留暂存栈不变并取出最上层内容与当前分支合并,可以加暂存内容名称来使用指定的暂存内容。
- git stash drop + 暂存内容名称,删除特定暂存内容。
- git stash clear清空暂存内容。
- git stash show展示当前工作区与暂存栈顶内容的差异。
git push和git pull
git rebase
git clean 清除未追踪文件
这个操作在实际中我们经常对一个分支修修补补,结果要更新到大佬提交的东西,自己写的垃圾都是报废的。这时我们需要的其实是上面的git checkout回退功能。但有一个很大的问题,对于我们自己新创建的文件和文件夹,git管理中心有一种叫untrack的状态,他对于你无论是暂存区还是工作区的操作都是不参与的,即你git checkout HEAD .了所有改动,又git pull了所有更新,untrack依旧在那里,不增不减。这其实是一个非常好的特性,用起来很方便。不过既然是特性就要有相应的操控手段,如果你不想要这些untrack的文件又因为体量太大不好一个一个删除,git clean就是你无二的选择了。
- git clean的基本功能是清除当前文件夹下的untrack文件,但是在使用的时候需要搭配参数进行。
- -n 这是最先需要使用的,他表示不进行真正的删除列出所要删除的文件与文件夹,一定要先进行确认再删除。
- -d 表示除文件之外的文件夹也要删除,注意如果没有这个选项,只会删除单独新建的文件,对于单独新建的文件夹中的文件是不进行删除的。
- -f 表示强制执行,即只要没有-n那么就直接全删不进行确认。(常用)
- -i 与上相对,表示进行交互界面删除。(不常用)
- -x 连 gitignore 的untrack 文件/目录也一起删掉 (慎用也就是不用,一般这个是用来删掉编译出来的 .o之类的文件用的)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)