前置知识点
- HEAD是一个指针,指向当前所在的本地分支(将HEAD想象为当前分支的别名)
- git有四个存储状态,1、工作态,2、暂存态,3、已提交,4、已推送到远程服务器。
Git一般的操作行为
Git的基本操作
- 安装git
- 新建仓库
- 配置git
- 从远程仓库拉取代码
- 检查git状态
- 对比查看修改了哪些代码
- 最新版本库比较【未正式提交的代码(包含工作区与暂存区)】与最新的commit记录进行比较
- 暂存区与版本库最近一次commit的内容比较
- 暂存区代码与指定历史版本进行比较
- 工作区代码与指定历史版本进行比较
- 比较两个历史记录的改动
- 撤销编辑/文件回滚
- 撤销编辑,恢复到上一次暂存状态;
- 撤销编辑,恢复到上一次提交状态;
- 添加到暂存区/撤销暂存
- 忽略文件/移除文件
- 提交代码/覆盖提交/撤销提交/指定回滚
- 查看提交历史
- 打标签
- 远程仓库的使用
- 查看你已经配置的远程仓库服务器
- 添加一个新的远程Git仓库,同时指定一个方便使用的简写
- 一个仓库多个推送地址
- 远程仓库的重命名(同样也会修改你所有远程跟踪的分支名字)
- 访问远程仓库,从中拉取所有你没有的数据。(它并不会自动合并或修改你当前的工作。当你准备好时你必须手动将其合并入你的工作。
- 从远程服务器上抓取数据并自动尝试合并到当前所在的分支
- 推送到远程仓库
- 强制推送命令,此命令可以用于覆盖远程提交
- 查看某个远程仓库详细信息
- 移除一个远程仓库(应该不会影响服务器的分支,只是删除本地)
- 分支
- 查看分支
- 切换分支
- 新建分支
- 合并分支
- 删除分支
- 比较分支差异
- 比较分支的提交记录
- 比较分支的代码差异
- 清除无意义的分支数据
- 恢复误删分支
- 从历史版本中找回删除的文件
- 拓展
安装
到官网下载安装包安装;
新建仓库的两种方式
- 创建本地仓库,只在本地管理代码
git init //新建一个项目文件夹,在文件夹中执行下方的git初始化代码
- 创建远程仓库,在代码托管平台创建,然后克隆到本地,远程和本地均可管理代码。
git clone 远程仓库地址 [本地文件夹名称] //如果不指定本地文件夹名称,默认名称为远程仓库名称
配置
- 配置昵称与邮箱(全局)任意位置执行下方命令。
$ git config --global user.name "你的昵称"
$ git config --global user.email "你的邮箱"
- 配置昵称与邮箱(局部)在项目文件夹内执行下方命令。
git config user.name "你的昵称"
git config user.email "你的邮箱"
Tip:这个昵称和邮箱仅仅是在查看改动记录时用的,和鉴权没有关系,推送到服务器时是需要账号密码的。(还未试过公开项目是否需要密码)
从远程仓库拉取代码
git pull
Tip:每次编写代码前都应该拉取一次代码,让本地代码处于最新版本,这样可以有效的避免冲突。
检查代码状态
git status
Tip:可以查看各文件状态,例如在工作区,还是在暂存区等。
对比查看修改了哪些代码
git diff //比较工作区和暂存区快照之间的差异
git diff HEAD //与最新版本库比较【未正式提交的代码(包含工作区与暂存区)与最新的commit记录进行比较】
git diff --cached 文件名 //暂存区与版本库最近一次commit的内容比较
git diff --cached hash值 //暂存区代码与指定历史版本进行比较
git diff hash值 //工作区代码与指定历史版本进行比较
git diff hash值1 hash值2 //比较两个历史记录的改动
忽略文件/移除文件
- 忽略文件-不想Git跟踪该文件或目录的变动
在项目根目录创建一个.gitignore文件,把想忽略的文件名或目录填进去。
*.a #忽略所有的.a文件
build/ #忽略任何目录下名为build的文件夹
!lib.a #跟踪所有的lib.a,即便你在前面忽略了.a文件
- 移除文件
- 忘了添加ignore,已经被跟踪,不再跟踪此文件/文件夹。先把该文件添加到.gitignore文件中,再执行删除缓存命令
git rm --cache <file> //删除文件缓存命令。文件从暂存区移除,状态变为工作态。文件被保留在硬盘上。 git rm -r --cached <dir> //删除文件夹缓存命令,因为需要递归。 git rm -f <file> //强力模式。文件从暂存区移除,文件也从硬盘上删除。
- 重命名文件 要在Git中对文件改名,可以使用git mv命令来完成。
git mv oldfilename newfilename
撤销编辑/文件回滚
- 扔掉工作区的内容,代码内容恢复到上一次暂存状态,如果暂存区内无内容,就恢复到commit了;
git restore <file> //会覆盖文件内容
- 扔掉工作区的内容,代码内容恢复到上一次提交状态;
git restore --staged <file> //先把暂存区的代码恢复到工作区状态,不会覆盖代码
git restore <file> //再把工作区的清除,代码恢复到commit,会覆盖代码
添加到暂存区/撤销暂存
- 把新编辑的代码放进缓存区
git add 文件名/目录名
- 修改存储状态,暂存态回到工作态
git restore --staged <file> //这个命令把文件从暂存态改成工作态,不会覆盖代码
提交代码/覆盖提交/撤销提交/指定回滚
- 提交代码
git commit -m "提交信息" //提交暂存区更新
git commit -a -m "提交信息" //自动把所有已经跟踪过的文件暂存起来一并提交,相当于同时执行了git add *
- 覆盖提交
git commit --amend //将暂存区中的文件提交。覆盖上一次提交信息
- 撤销提交
git reset HEAD^ //只是撤销提交,改变状态,不改变文件及代码
- 指定回滚位置
git reset 哈希值 //不会改变文件及代码,只改变状态
查看提交历史
git log //查看历史
git reflog show //这是显示分支管理的命令,找到commitid
远程仓库的使用
git remote -v //查看你已经配置的远程仓库服务器
git remote add <shortname> <url> //添加一个新的远程Git仓库,同时指定一个方便使用的简写
git remote set-url --add <仓库名称> <url> //一个仓库多个推送地址
git remote rename <oldname> <newname> //远程仓库的重命名(同样也会修改你所有远程跟踪的分支名字)
git fetch <remote> //访问远程仓库,从中拉取所有你没有的数据。(它并不会自动合并或修改你当前的工作。当你准备好时你必须手动将其合并入你的工作。
git pull //从远程服务器上抓取数据并自动尝试合并到当前所在的分支
git push <remote> <branch> //推送到远程仓库
git push -f //强制推送命令,此命令可以用于覆盖远程提交
git remote show <remote> //查看某个远程仓库详细信息
git remote remove <remote> //移除一个远程仓库(应该不会影响服务器的分支,只是删除本地)
分支
- 查看分支
git branch //查看本地分支
git branch -a //查看所有分支 本地分支和远程的所有分支
git branch -v //查看每一个分支的最后一次提交信息
git branch --merged //查看哪些分支已经合并到当前分支
git branch --no-merged //查看所有包含未合并工作的分支
- 分支切换
git checkout <branchname>
- 新建分支
git branch 分支名 //创建本地新分支
git checkout 分支名 //导入远程分支。这个命令其实是切换分支用的。但当它发现本地不存在这个分支,会自动找到远程对应的分支然后在本地进行创建。
git checkout -b 分支名 //新建本地分支,并切换到新分支上。
git push --set-upstream 远程仓库名称 分支名称 //本地新建分支,第一次推送的时候需指定远程分支名,不能直接用git push推送
- 合并分支
git merge 分支名 //把分支合并到当前分支
- 删除分支
git branch -d 分支名 //普通删除,一般情况使用普通删除即可。
git branch -D 分支名 //强制删除(好像例如删除那些未合并的分支)
git push 远程仓库名 --delete 分支名 //删除远程分支
- 比较分支差异
- 比较分支的提交记录
git log dev ^master //查看dev分支中有的记录而master分支中没有的提交记录 git log branch1...branch2 //比较两个分支的差异 git log --left-right branch1...branch2 //查看差异记录存在于哪些分支上
- 比较分支的代码差异
git diff 分支名A 分支名B --stat //查看哪些文件被修改了 git diff 分支名A 分支名B 文件名 //查看某个文件具体的代码差异 git diff 分支名A 分支名B //显示全部文件的修改
- 查看分叉历史
git log --oneline --decorate --graph --all
- 清除无意义的分支数据
git branch -vv //查看本地与远程关联失效的分支
- 恢复误删分支
git reflog show //这是显示分支管理的命令,找到commitid git checkout -b 分支名 commitId //通过commitId建立一个新的分支
- 从历史版本中找回删除的文件
git checkout commitid <filename>
拓展
- git pull 和git fetch 的区别,从服务器同步代码时,如果本地当前分支版本落后于服务器对应分支版本,git pull 则会直接更新commit,而git fetch把代码同步过来,自己决定如何操作。