这篇笔记记录了我在git学习中常常用到的指令,方便在未来进行查阅。此篇文章也会根据笔者的学习进度持续更新。
网站分享
Git 常用命令大全
Learn Git Branching
基础
$ git init //在当前位置配置一个git版本库
$ git add <file> //将文件添加至暂存区
$ git add . //将文件夹中的所有内容添加至暂存区
$ git commit //将暂存区的内容提交至库中
$ git commit -m "<注释内容>" //提交的同时添加注释(即提交信息)
$ git status //查看暂存区中的内容
$ git log //查看提交记录
其实每一个提交记录都可以看作一个“快照节点”,像一个相片一样记录的当前库内容的所有细节,方便我们恢复到对应提交节点的内容。
每一个这样的节点对应一个又长又复杂的哈希值,用来索引这些提交。
这个过程中可能会进入Vim编辑器,在按下ESC后切换至命令行模式,输入“:wq”即可保存并退出。
git log展示是可能会进入less分页器,按下q键即可退出。
分支
在我们的提交树中,总是有一个名为HEAD的指针指向我们的提交,其所指的地方常常使我们指令所作用的地方。HEAD 总是指向当前分支上最近一次提交记录。大多数修改提交树的 Git 命令都是从改变 HEAD 的指向开始的。
$ git branch //展示所有分支,带*的是HEAD所在的位置
$ git branch <branch_name> //创建分支,默认为当前提交上
$ git branch <branch_name> <hash> //在指定提交节点上创建分支
$ git branch -d <branch_name> //将分支删除
$ git branch -f <branch_name> <hash> //将分支强制移动到某提交上
其实HEAD的实质也是一个哈希值,一般在需要用到哈希值时,可以使用相对位置。如HEAD~就是HEAD的父提交节点。HEAD~2就是父的父。HEAD^就是父。HEAD^2是第二个父(多个父节点时)。在使用merge合并两个分支后,“将目标分支并入当前分支”的“当前分支”就是第一个父parent,“目标分支”就是第二个父,即^2。
$ git merge <branch_name> //将目标分支并入当前分支(多条路径)
$ git rebase <branch_name> //将目标分支嵌入当前分支(一条路径)
$ git rebase <branch_name_1> <branch_name_2> //将分支1嵌入分支2,HEAD指向分支2
在并入分支时可能会产生冲突,命令行中显示“MERGING”的字样,这是需要手动在对应文件做出更改,然后再通过add指令和commit指令重新提交。
$ git checkout <branch_name>/<hash> //将HEAD移动至目标提交(检出)
$ git checkout -b <branch_name> //创建新分支并检出,即HEAD到此分支上
$ git reset <hash> //真撤销
$ git revert <hash> //假撤销,相当于是做了一个回到上一提交的提交
$ git log --oneline --graph --decorate --all //可视化查看提交树
修改提交
$ git commit --amend //可以修改提交信息,可通过该命令添加遗漏文件
$ git commit --amend -m "<新的提交信息>" //直接修改提交信息
$ git cherry-pick <hash> //将对应的提交节点复制为新的提交节点
$ git cherry-pick <hash1> <hash2> //依次生成新创建,<hash>可以是分支或HEAD
$ git rebase -i <hash> //修改范围内的提交
这个指令会让我们进入Vim编辑器,此时按下“i”、“a”、“s”进入编辑模式,按ESC退出该模式。在编辑模式可以对各个节点进行替换删除等操作,将每个提交前的“pick”替换为其他指令可以产生对应的效果,这些指令都写在下方的注释中。
标签
因为分支是需要我们不断操作移动的,而不是固定在某一提交上的,所以就需要用“标签”来标识重要的提交。标签的内容通常就是版本号,格式一般为 [ v <主版本号> . <次版本号> . <修订号> ] ,修订号的更新通常是修复了某些bug或者优化了某些内容,次版本号更新会添加一些功能但与老版本兼容,主版本号通常用于重大更新,调整范围较大,新老版本不兼容。一般非正式发布的都采用v0.x.x,第一个正式发布的项目一般为 v1.0.0 。
$ git tag //查看所有标签
$ git tag <tag_name> //默认在HEAD提交节点上添加标签(无注解,称为轻标签)
$ git tag -a <tag_name> //启用编辑,添加注解(称为注解标签)
$ git tag -am "<注解>" <tag_name> //创建标签的同时添加注解(-m用于编辑信息)
$ git tag <tag_name> <hash> //指定提交节点
$ git tag -d <tag_name> //删除标签
$ git describe //描述离默认的HEAD最近的标签信息,只能描述注解标签
$ git describe <hash> //描述离目标提交最近的标签信息
远程
$ git remote //查看关联的远程仓库名称
$ git remote -v //查看关联的远程仓库的抓详细信息
$ git remote show <rep_name> //查看指定仓库信息
$ git remote add <rep_name> <url> //关联远程仓库并自定义命名
$ git remote rename <old_name> <new_name> //为仓库重命名
$ git remote remove <rep_name> //取消关联
$ git clone <url> //将远程库克隆到本地,当前目录下,默认库名字是origin
$ git checkout <rep_name>/<branch_name> //切换到远程分支
远程分支代表的是远程仓库中的分支,写作“库名/分支名”。可以用于同步跟踪远程仓库中的代码(远程跟踪)。检出点HEAD的移动不会影响远程分支的位置,它只会随着远程仓库中的更新而更新。
$ git fetch //将远程仓库中的提交记录(提交树)拉取到本地,但不会自动合并分支
$ git fetch <rep_name> //指定远程仓库,记住其不改变本地仓库的状态
$ git pull //将远程仓库的提交抓取后,直接与远程分支合并,相当于fetch+merge
$ git pull --rebase //同样的,相当于fetch+rebase
$ git push //将本地的代码上传并且合并,默认跟踪HEAD指向的分支
在执行push命令时,可能会出现历史偏移问题,即在要上传本地提交时远程仓库中出现了新的提交,这时push不会工作,需要我们先将远程仓库中的最新分支合并(rebase或merge)后在进行提交。可以直接git pull或git pull --rebase之后再git push。
$ git push <rep> <place> //指定作用的远程仓库以及分支
$ git push <rep> <source>:<destination> //可以作用远程仓库与本地不匹配的分支
这允许push origin side^:main这样的命令可以执行,如果目标分支不存在,git甚至可以帮你在远程仓库中新创建这样一个分支。
$ git fetch <rep> <place> //获取在place分支上所有本地不存在的提交
$ git fetch <rep> <source>:<destination> //source是远程,destination是本地,少用
注意:sourse可以为空,push中为空时意为删除对应的分支,fetch中为空意为增加对应的分支。
$ git pull <rep> <place> //相当于fetch <rep> <place>完了以后合并
$ git pull <rep> <source>:<destination> //相当于fetch <rep> <source>:<destination>完了以后合并
在锁定main分支的情况下进行push时可能会出现Remote Rejected的字样,这时我们需要新建一个分支,让main分支与远程服务器保持一致,再进行提交。
$ git checkout -b <branch_name> <rep_name/branch_name> //创建新分支并跟踪指定远程分支
$ git branch -u <rep_name/branch_name> <branch_name> //指定跟踪
在远程跟踪关联时,pull的合并目标以及push的目的地都是由这种关联决定的。比如执行这个git checkout -b test main后,在pull时test会代替main进行移动,而main不发生变化。
小结
这篇文章将会作为动态笔记记录,我将把我在日常开发中可能用到的指令更新在这里,方便查阅与使用。
如有补充纠正欢迎留言。