一、git常用命令
0, 回退版本
> git reset --soft key soft回滚后本地会保留修改的记录
> git reset –hard key hard回滚后不会保留记录,直接回到变更后的代码版本
git push origin 分支 –force 该命令提交,log记录就被删除了
1,分支命令
> git branch 查看本地分支
> git branch –a 查看当前所有分支(包括远端分支)
> git branch xxx 创建子分支
> git checkout xxx 切换分支
> git checkout –b xxx 创建并切换到新的分支
> git branch -d xxx 删除分支
> git branch -D xxx 强制删除分支
2,克隆命令
> git clone 仓库名 克隆远端仓库
> git clone --recursive 仓库名 用于循环克隆git子项目.如果Git仓库中含有子 项目,此命令可将子项目一起克隆下来的.
3,add 命令
> git add -u 将新更改的部分添加到本地
> git add . 添加全部改动的文件
> git add test/xxx.c 添加 test 目录下的 xxx.c 文件
4,log 命令
> git log 查看提交日志
> git log --oneline 查看提交日志,显示短的ID,并与提交描述显示在同一行
> git log --oneline --graph 树形结构查看短描述和校验值
5,其他命令
> git init 初始化仓库
> git status 查看当前状态
> git commit -m "日志信息" 将文件提交到本地
> git diff 查看修改信息
> git reflog 可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)
6,git rebase
> git rebase 目标分支 变基
> git rebase -i 分支ID 删除、合并、修改commit (drop squash reword)
> git rebase (--continue | --abort | --skip) (继续变基 | 取消变基 | 对齐引起冲突的commit,该命令慎用)
7,git reset
> git reset --hard 分支ID 版本回退
> git reset --soft HEAD~1 删除提交的commit但不删除add
> git reset --hard HEAD~1 删除提交的commit和add
8,合入其他分支某一次commit的修改
> git cherry-pick commitID
9,push和pull
push:用本地分支合并到远程分支
pull:将远程分支合并到本地分支
> git pull origin master 更新远端版本库到本地
> git push origin xxx 将当前分支的提交推送到远端
> git push origin <本地分支名>:<远程分支名> 推送到远端指定分支
> git push origin --delete XX 删除远端分支
二、更新远端仓库
1. 使用fetch
> git remote -v 查看远程仓库
> git fetch origin master:temp 将远程origin仓库的master分支代码下载到本地新建的temp分支
> git diff temp 比较本地仓库与下载的temp分支
> git merge temp 合并temp分支到本地的master分支
> git branch -d temp 删除temp分支
git branch -D temp 可强制删除temp分支。
2. 使用pull
> git pull <远程库名A> <远程分支名B>:<本地分支名C>
取回远程库A中的B分支,与本地的C分支进行merge。
要是与本地当前分支合并,则冒号后面的<本地分支名C>可以不写。
三、git 推送流程
1. 获取最新代码,合并到本地分支
(1)获取需要推送的远端分支上的修改:
> git fetch -p //获取被删减后的远程分支
(2)使用小乌龟合并,并解决冲突
(3)git commit -m
创建修改日志
(4)编译一下代码。如果不成功,运行rebase --abort
可取消合并。
2. 变基到远端分支
- 运行变基命令
git rebase origin/master
无冲突直接推送。不用看2-6操作
2. 有冲突就需要看提示发生冲突的文件,解决冲突
3. git status
查看改动的文件并git add
,但不commit
4. 继续变基git rebase continue
5. 循环2-4
操作,直到当前分支后面没有|REBASE x/y
,表示变基完成
6. 运行git log --graph
查看变基是否成功
3. 推送
本地的commit都要推送:编译检查后,直接git push origin 分支名
。不用看下面操作。
只推送一个commit:
git rebase -i ID
这个ID是前一个commit
eg:
我们只不需要”规范代码”到“完善I2C”这之间的commit。运行git rebase -i 代码规范完成ID
- 编辑
将第一行的pick
保存,其余全部改成s
pick 的意思是要执行这个 commit
squash 的意思是这个 commit 会被合并到前一个 commit
ESC:命令模式
shift+i:编辑模式
wq:保存退出
q!:不保存退出
- 解决冲突,推送
注:
git在本地会保存两个版本的仓库,分为本地仓库和远程仓库。
- 本地仓库就是我们平时 add、commit 的那个仓库。
- 远程仓库可以用git remote -v查看(这里的远程仓库是保存在本地的远程仓库,等同于另一个版本,不是远程的远程仓库)。
四、git 子仓库
1. Git仓库中包含另外的仓库(子仓库)
添加子仓库
git submodule add [子仓库地址]
删除子仓库
$ git submodule deinit module
$ git rm module
$ rm -rf .git/modules/module
2. clone 一个带有子仓库的仓库
- 方式一
先克隆父仓库
$ git clone [父仓库地址]
查看子仓库,可以看到submodule信息前有个减号’-’
$ git submodule
初始化子仓库
$ git submodule init
克隆/更新子仓库
$ git submodule update
切换到子仓库的master分支,update 后的 submodule 会被 checkout 到 head 的 commit id 上,并不会自动checkout 到 master 分支
$ git submodule foreach git checkout master
- 方式二
直接父、子仓库一起克隆
$ git clone [父仓库地址] --recursive
查看子仓库,可以看到submodule信息前没有减号’-’
$ git submodule
切换到子仓库的master分支,update 后的 submodule 会被 checkout 到 head 的 commit id 上,并不会自动checkout 到 master 分支
$ git submodule foreach git checkout master
3. 如果 submodule 中还带有 submodule,那么可以是用 --recursive 参数
更新带有子仓库的仓库
- 方式一
$ git pull
$ git submodule init
$ git submodule update
- 方式二
$ git submodule foreach git pull origin master
提交子仓库
先在 子仓库下的目录下 push,这是单独更新 submodule 的内容
然后在父仓库的目录下push,这是更新父仓库的 submodule 信息