一些具体使用场景
1. 创建本地分支
// 1 创建dev分支
git branch dev
// 2 创建 dev 并且切换到 dev分支上
git checkout -b dev
2. 创建远程分支,(一般在本地创建分支,提交到远程)
git push -u origin dev 其实是 git push --set-upstream origin dev 的简写
git checkout -b dev // 本地创建新的 dev 分支,并且切换到dev分支
git push -u origin dev // 将本地分支 dev 推送到git仓库中
3. 提交代码的步骤
git status // 查看本地修改状态
git add . // 将修改全部提交到本地(暂存区)
// 也可以单个文件提交 eg: git add src/pages/about.vue
git commit -m "message" // 将暂存区代码注释并提交到(本地仓库)
git pull // 拉取git仓库最新改动,如果有冲突合并冲突,没有则继续下一步
git push // 将代码推送到到git仓库
// 或指明将代码推送到git的那个分支
eg: git push origin master 推到远程的master分支
4. 合并分支,在dev分支开发完后,想要合并到master上发布
git checkout master // 切换到aster分支
git pull origin master // 拉取git仓库的改动(这步可省略: 防止git仓库有别人改动过)
git merge dev // 将dev分支的代码合并到本分支(注意我现在在master分支上)
git push // 将合并过的代码推送到git仓库
5. 放弃本地所有修改
📢 注意: 但是此命令不会删除掉刚新建的文件。因为刚新建的文件还没已有加入到 git 的管理系统中。所以对于git是未知的。自己手动删除就好了。
git checkout . // 放弃本地所有修改(内容修改与文件删除)
6. 缓存本地变更
因为在git管理中,如果本地有改动未提交时是无法切换分支的,如果特殊情况下 需要切换分支,可以使用以下
1.缓存本地变更
git stash
2.切换分支
git checkout dev_B
3.提取本地变更
git stash apply
以下是详细的命令解析
1. git branch相关
1.1 不带参数:列出本地所有的分支,当前分支的前面用"*"标记
git branch
1.2 查看远程所有的分支
git branch -r
1.3 查看所有分支列表,包括本地和远程
git branch -a
1.4 创建名为dev的本地分支,创建分支时需要是最新的环境,创建分支但依然停留在当前分支
git branch dev
1.5 删除本地名为dev的分支,如果在分支中有一些未merge的提交,会删除失败,可以用下面的强制删除
git branch -d dev
1.6 强制删除本地名为dev的分支
git branch -D dev
1.7 查看本地分支 对应的远程分支
git branch -vv
1.8 给分支重命名
git branch -m oldName newName
2. git checkout 相关
2.1 放弃单个文件的修改
git checkout filename
2.2 放弃当前目录下的所有修改
git checkout .
2.3 将本地分支切换到 dev
git checkout dev
2.4 如果分支存在 则只切换分支,若不存在则创建并切换到dev分支
git checkout -b dev
2.5 以远程refactor分支为基础创建本地的新分支changeNav
(1.创建一个本地的新分支changeNav,2.拉取远程的refactor分支给本地的changeNav)
git checkout -b changeNav origin/refactor
3. Git add相关
3.1 将某个文件添加到git的暂存区,这个命令是单独添加某个文件
git add [文件路径]
3.2 将本次所有 文件的修改,文件的新建,添加到暂存区。(保存新的添加和修改,注意不包括删除 )
git add .
3.3 (不常用)将本次所有 文件的修改、文件的删除,添加到暂存区。(保存修改和删除文件,但是不包括新建文件)
git add -u .
3.4 (不常用)将文件的修改,文件的删除,文件的新建,添加到暂存区。(保存所有修改)
git add -A .
4. Git commit相关
git commit 主要是将git暂存区里的改动给提交到本地的版本库。每次使用git commit 命令我们都会在本地版本库生成一个40位的哈希值,这个哈希值也叫commit-id,commit-id在版本回退的时候是非常有用的,它相当于一个快照,可以在未来的任何时候通过与git reset的组合命令回到这里.
4.1 将git暂存区里的改动提交到本地版本库,message 是本次提交的标注信息
git commit -m "message"
4.2 将本次修改了 未添加在暂存区的文件 和 已提交到暂存区的文件,合并提交到本地版本库
相当分别执行了(git add . )和(git commit -m "message"),相当于是这两条的的合并写法
git commit -a -m "massage"
4.3 (不常用)追加提交
如果我们不小心提交了一版我们不满意的代码,并且给它推送到服务器了,在代码没被merge之前我们希望再修改一版满意的,而如果我们不想在服务器上abondon,那么我们怎么做呢?
git commit --amend 也叫追加提交,它可以在不增加一个新的commit-id的情况下将新修改的代码追加到前一次的commit-id中
git commit --amend
那么追加提交分两种情况,一是当前最后一次提交是想追加的那版,二是最近一版不是我们想追加的那版
- 假如现在版本库里最近的一版正是我们想要追加进去的那版,此时是最简单的,直接修改工作区代码,然后git add,之后就可以直接进行git push到服务器,中间不需要进行其他的操作如git pull等
- 如果现在版本库里最近的一版不是我们想要追加进去的那版,那么此时我们需要将版本库里的版本回退到我们想要追加的那一版,想要将版本回退到我们想要的哪一版有好几种方法
- 第一种即是我们从服务器上选取我们需要的版本,直接进行挑拣,在服务器的提交管理页面上右上方一般会有一个Download按钮,点击会弹出一个下拉框,选择其中的cherry-pick,复制命令
然后在我们版本仓库对应的目录下运行这个命令,执行完后,使用git log -1 命令,可以查看到现在版本库里最近的一版变成了我们刚才挑拣的这版,此时再在工作区直接修改代码
改完之后进行git add,再执行本git commit --amend命令,之后git push.
- 使用gitk或其他的图形界面化工具,在终端输入 gitk,回车,会弹出gitk的图形界面,在界面的左侧部分陈列着版本库中的一条条commit-id,此时选中我们需要的那一版,右键点击之后会弹出一个
选择菜单,如果是在master 分支上,那么其中会有一项是 Reset master branch to here,点击这项,会弹出一个名为confirm reset的确认box,选择reset type 中的hard项,再点击OK
关闭gitk图形界面,回到终端,运行git log -1命令,发现现在版本库里最近的一次提交已经是我们希望的那一版了,此时再在工作区直接修改代码,改完之后进行git add
再执行本git commit --amend命令,之后git push
- 如果我们知道我们需要的版本与现在最近的版本中间隔着 n 个提交,那么我们可以直接使用git reset --hard HEAD~n命令,关于git reset 命令有详解,此时这个命令执行完后
运行git log -1 命令我们会发现现在版本库里最近的一版就是我们需要的那版,此时再在工作区直接修改代码,改完之后进行git add,再执行本git commit --amend命令,之后git push.
- 如果我们不知道我们需要的版本与现在最近的版本中间隔着 n 个提交,那么我们可以使用git log来查看版本库中的commit-id,找到我们需要的commit-id后,在终端中执行git reset --hard commit-id
时这个命令执行完后,运行git log -1 命令我们会发现现在版本库里最近的一版就是我们需要的那版,此时再在工作区直接修改代码,改完之后进行git add,再执行本git commit --amend命令,之后git push.
5. Git push相关
5.1 如果当前只有一个远程分支,可以用嘴省略的写法,可以使用git branch -r ,查看远程的分支名
git push
5.2 将本地提交推送到远程 master分支上, origin是主机名
git push origin master
5.3 (不常用)如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支,等同于 git push origin --delete master
git push origin :refs/for/master
5.4 (不常用)当遇到这种情况就是不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机,这时需要 -all 选项
git push --all origin
5.5 (不常用)本次提交会强制覆盖掉远程master分支
git push的时候需要本地先git pull更新到跟服务器版本一致,如果本地版本库比远程服务器上的低,那么一般会提示你git pull更新,如果一定要提交,那么可以使用这个命令强制覆盖。
git push --force origin master
5.6 (非常不常用)git push 的时候不会推送分支,如果一定要推送标签的话那么可以使用这个命令
git push origin --tags
6. Git merge相关
6.1 在当前分支BranchA合并dev分支,dev是你想合并到BranchA的分支,用这个命令前需把当前分支先切换到BranchA
git merge dev
6.2 -m是加上合并时的描述性语句,如果出现冲突,那么先解决冲突,再将文件git add,git commit,之后再merge
git merge -m "message" dev
7. git rebase
(不常用)使用git rebase改变分支依赖,假设有以下分支
而且feature-2不依赖于feature-1中的任何变化,就可以用rebase让它基于master。
git checkout feature-2
git rebase master
git rebase对所有涉及的commit("pick")执行默认操作,它只是将历史记录回滚到最后一个公共父节点,并重新生成两个分支的commit。git就会变成历史现在看起来像这样:
8. Git diff相关
8.1 对比工作区(未 git add)和暂存区(git add 之后)的代码改动
git diff
8.2 比较单个文件,工作区与暂存区的 改动
git diff filepath
eg: git diff src/components/online/CoursesContainer.vue
8.3 (不常用)对比暂存区(git add 之后)和版本库(git commit 之后)
git diff --cached filename
8.4 (不常用)对比工作区(未 git add)和版本库(git commit 之后)
git diff HEAD filename
8.5 (不常用)比较工作区(未 git add)与指定的 commit -id 的差异
git diff commit-id filename
8.6 (不常用)比较暂存区(git add 之后)与指定 commit-id 的差异
git diff --cached commit-id filename
8.7 (不常用)比较两个 commit -id 的差异
git diff commit-id commit-id
9. git clone相关
9.1 克隆(拷贝)一个 Git 仓库到本地,本地创建的目录名称会与Git 仓库同名,remoteUrl是远程仓库地址
git clone remoteUrl
eg:git clone https://github.com/OneyJiang/resume.git
9.2 克隆(拷贝)一个 Git 仓库到本地,重新定义本地目录名称为loaclName,当然你可以叫其他名字,我只是举例子
git clone remoteUrl loaclName
9.3 克隆(拷贝)一个指定分支到本地,本地目录名称与分支同名,branchName为要克隆的分支名
git clone -b branchName remoteUrl
9.4 克隆(拷贝)仓库 remoteUrl 中一个指定分支 branchName 到本地,重新定义本地目录名称为 localName
git clone -b branchName remoteUrl localName