先把清单列出来git cheat sheet
git 命令总结
git的init和git clone
-
git init
命令用于初始化 git 的仓库,也就是隐藏的那个 .git 文件,这个使用的情况是什么呢,就是我们要把本地的仓库推到远端,就需要在本地先创建仓库,然后用命令git remote add
进行远端仓库的连接,这时候我们本地其实有两个分支,分别是 main 和 origin/main 。
命令:git remote add 主机名称(origin) 域名
-
git clone
命令用于将远端的仓库的某一分支拉取下来,默认拉取的分支是 main 分支。git clone
会在当前目录下建立仓库名,同步 main 分支的所有内容,同时同步 .git 目录的信息。- 参数
--depth
可以指定拉取 commit 的深度,设置为1则只拉取最近的一个 commit,加快拉取速度。 - 参数
--branch
可以指定拉取的分支名,默认拉取 main 分支,可以更改成你想要的分支。
- 参数
git add和git commit 提交二连
这个就不用多说了,git三个区的概念,注意要理解git是记录差异的系统,整个git仓库里面代码就只有一份(好像是这么说的吧)
git checkout 反向操作
用于在 git add 和 git commit 之后进行反悔操作。注意这里的操作都只能是本地操作,如果已经 push 到了远端则需要用 push 进行远程删除。
-
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 的部分功能,原因是 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 revert 同回退HEAD指针
顺带一提这里有一个 git revert
操作,和 git reset
操作一样是用来调整HEAD指针的,不过提交结构是不同的,上面的是舍弃提交将指针向前一动,而这个是复制一份前面的提交指针向后移动。这个操作方便取消自己的回退,而 git reset
想取消就得用 git reflog
来查找自己舍弃的commit的id号来进行回撤。
git branch 分支操作
- 什么都不加,查看本地分支和现在所在的分支
- 直接加一个名字,创建一个以此为名的分支
- 参数
-d
或--delete
加名字,查询分支是否已经被合并,如果被合并则删除此分支,否则会失败并警告 - 参数
-D
加名字,强制删除此分支 - 参数
-a
,查看所有分支(本地和远程) - 参数
-r
,查看远程分支 - 参数
-v
,查看本地所有分支上一次commit信息,可附加-a
查看远程 - 参数
-vv
,查看本地所有分支与远程分支关联信息(这个在建立分支时很重要)。
git checkout 切换分支
- 加一个名字,切换到对应名字的分支,如果没有这个分支则报错
- 参数
-b
加一个名字,以当前所在分支commit内容作为基础,创建一个新的分支并切换 - 加上一个名字,如果这个名字对应origin里面的一个分支,那么会自动创建本地的同名分支并同步origin中的内容。
这个操作通常在拉取别人的分支时使用。
这里想说一下,在分支切换的时候我们是要保证自己的git当前分支是干净的(git status
命令)。因为我们在这个工作情景下就不需要考虑三个区交互的情况,用这个命令的时候我们一定是在这个分支上面开发完成了之后在考虑分支之间的交互。如果要在这里再考虑三个区交互就太过复杂并且毫无意义,不符合程序开发的目的。
这里有一个重要的启示:程序的规则都是由人来制定的,而不是现已存在的自然规律。制定开发规则的目标是为了实用,而遵循规范的操作手册比考虑所有的corner case更加合理。
因而在学习和掌握程序规则的时候要有明确的场景观念和目的观念,在这种思维之下才能更好地进行掌握。
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之类的文件用的)。