一、Git简介
1、Git四个区域
1、工作区:处理工作的区域(即做项目打代码的区域)
2、暂存区:已完成的工作临时存放区域,等待被提交
3、本地仓库:存放数据的地方,但是还在本电脑上,若电脑存储空间损坏还是会造成代码消失
4、Git远程仓库:最终的存放区域,即远程服务器,电脑存储空间损坏也不影响远程仓库数据
2、Git四个状态
1、未跟踪:文件没有加入到git库中,不参与版本控制,使用git add变为暂存
2、已暂存:表示对已修改文件的当前版本做了标记,使之包含在下次提交的列表
3、已修改:表示修改了文件,但还没将修改的结果放到暂存区
4、已提交:表示文件已经安全地保存在本地Git仓库
新建文件 ---> 未跟踪(Untracked)
使用git add .或者git add ‘需要暂存文件名’ ---> 已暂存(Staged)
使用git commit将文件放在本地仓库中 ---> 已提交(Unmodified)
如果已经提交到本地仓库后修改了文件当前文件状态是 ---> 已修改(Modified)
如果已经提交到本地仓库后删除了文件当前状态是 ---> 未跟踪(Untracked)
1.png
3、Git忽略文件.gitignore
格式规范:
- 以 # 开头的是注释
- 以 / 结尾的是目录
- 以 / 开头防止递归
- 以 ! 开头表示取反
- 可以使用glob模式进行文件和文件夹的匹配(glob指简化的正则表达式)
glob模式的正则表达式:
- 星号*匹配零个或多个任意字符
- [abc]匹配任何一个在方括号中的字符(此案例匹配一个a或匹配一个b或匹配一个c)
- 问号?只匹配一个任意字符
- 在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如[0-9]表示匹配所有0到9的数字)
- 两个星号表示匹配任意中间目录(比如a//z可以匹配a/z、a/b/c或a/b/c/z等)
二、Git的使用
三、Git提交到远程仓库
cd到本地仓库
1、git init指令初始化本地仓库
git init
2、git add指令将工作区的文件添加到暂存区
git add .
3、git commit -m 指令将暂存区的修改提交到分支
git commit -m "提交日志"
4、git remote add origin指令把本地仓库与之关联添加后,远程库的名字就是origin
git remote add origin github链接
5、git push -u origin master 指令把本地库的所有内容推送到远程库上
git push -u origin master
6、以后提交就不用加-u了
git push origin master
1、修改git用户名和邮箱
1、修改当前的project的命令
git config user.name 你的名字;
git config user.email 你的邮箱;
2、修改全局的
git config --global user.name 你的名字;
git config --global user.email 你的邮箱;
3、查看当前项目配置
git config --list
4、查看全局配置
git config --global --list
5、发现user.name有多个值
git config --global --replace-all user.email "输入你的邮箱"
git config --global --replace-all user.name "输入你的用户名"
四、Android Studio中Undo Commit,Revert Commit,Drop Commit区别
1、Undo Commit
作用:其实就是撤销了你Commit的这个动作。
适用情况:代码修改完了,已经Commit了,但是还未push,然后发现还有地方需要修改,但是又不想增加一个新的Commit记录。这时可以进行Undo Commit,修改后再重新Commit。
注意:已push情况不会删除commit记录,所以需要force commit操作,否则再次提交会提示需要merge。
2、Revert Commit
作用:将某次提交代码删除掉并新增一个Commit记录。会新建一个 Revert “xxx Commit”的Commit记录,该记录进行的操作是将"xxx Commit"中对代码进行的修改全部撤销掉。
适用情况:如果我们想撤销之前的某一版本,但是又想保留该目标版本后面的版本,记录下这整个版本变动流程,就可以用这种方法。
3、Drop Commit
- 未push的Commit记录:会删除Commit记录,同时Commit中对代码进行的修改也会全部被删除
- 已push的Commit记录:区别在于线上的Commit记录不会被删除
4、reset Commit
作用:是修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本。
适用场景: 如果想恢复到之前某个提交的版本,且那个版本之后提交的版本我们都不要了,就可以用这种方法。
//操作方法
git reset --hard 目标版本号
//撤销commit,并且保存提交过的内容到暂存区
git reset --soft HEAD^
//撤销commit,并且保存提交过的内容到工作区
git reset --mix HEAD^
//撤销commit,并且不保存提交过的内容(慎用)真用了不用慌,可以git reflog查看所有的提交记录,再次reset
git reset --hard HEAD^
操作 | 是否删除对代码的修改 | 是否删除Commit记录 | 是否会新增Commit记录 |
---|---|---|---|
Undo Commit | 不会 | 未Push会,已Push不会 | 不会 |
Revert Commit | 会 | 不会 | 会 |
Drop Commit | 会 | 未Push会,已Push不会 | 不会 |
Reset Commit | soft和mix不会,hard会 | 会 | 不会 |
五、Git撤销已经推送(push)至远端仓库的提交(commit)信息操作
1、撤销提交信息
git reset --soft HEAD^
git reset --soft <版本号>
2、修改代码,重新提交和推送
git add .
git commit -m ""
git push origin master --force
六、Git的amend操作
该操作会修改上一次提交的内容,但不会要求你编辑提交信息,仍保持上一次commit
1、修改还未push的提交
//修改最近一次提交
git commit --amend
//进入注释页面,进行修改(输入i进入编辑状态)
//修改后保存退出(esc退出并输入:wq!)
2、修改已经push的提交
//修改最近一次提交
git commit --amend
//进入注释页面,进行修改
//修改后保存退出
//强制推送
git push --force-with-lease origin master
3、git 使用amend补上遗漏文件
git commit -m 'initial commit'
git add 文件
git commit --amend --no-edit
七、Git多个远程仓库
1、首先添加远程仓库地址
2、切换到新增加的仓库分支develop
3、选中旧仓库分支并合并到当前新仓库分支
八、Git中cherry-pick 多个commit操作
经常需要从一个分支选择性的合并commit到另一个分支,具体可使用cherry-pick实现:
1.单个commit合并
git cherry-pick commit_id
2.多个连续commit合并
commit_id到commit_idn之间,包括两端
git cherry-pick commit_id..commit_idn
commit_id到commit_idn之间,非闭包
git cherry-pick (commit_id..commit_idn]
挑选多个commit:
git cherry-pick commit_id commit_idx commit_idy
3.合并过程中依次解决冲突后,继续合并
git cherry-pick --continue
九、Git中merge后push 到 Gerrit 失败,提示 no new changes ?
需求:git 分支合并
问题:使用 git merge 在本地执行分支合并操作,然后想 push 到 gerrit 上评审入库,可是在提交时,提示:
! [remote rejected] HEAD -> refs/for/dev (no new changes)
分析:no new changes 的意思,是说,这个合并,是个线性的合并。而合并的那些历史的 commit 节点,在 gerrit 上都已经评审过了,都是已有的 change 单,所以 gerrit 认为没有新的提交,就不让你提交评审。
方法1: 在 git merge 的时候,加上 --no-ff 参数,是为了让它生成一个新的 commit,这样就可以提交了~(不过生成的 gerrit change 是看不到改动信息的)
方法2:不经过 gerrit,直接 push 入远程库。(不推荐)
十、Git将代码push到Gerrit
需要Review(走Gerrit)
git push origin HEAD:refs/for/分支名
不需要Review(直接推)
git push origin HEAD:refs/heads/分支名
十、Git将代码迁移新仓库
整个仓库迁移:mirror方式
1、新建文件夹并cd到此目录
2、使用bare的方式克隆老仓库
git clone --bare <老仓库地址>
3、镜像push到新仓库地址
cd old-repository.git
git push --mirror <新仓库地址>
4、删除老仓库(可选)
cd ..
rm -rf old-repository.git
注意:该方式会将新仓库所有其他分支全部删除,只保留老仓库的分支,适用于老仓库换地址迁移,不适用于迁移到新仓库已经有其他分支的场景
仓库某个分支迁移
1、旧仓库克隆本地
git clone <仓库地址>
2、同步修改记录
git fetch
3、添加新仓库地址
//首先确认下已有仓库别名信息
git remote -v
//添加新仓库别名地址信息
git remote add new_origin <新仓库地址>
4、提交老仓库某个分支信息到新仓库某个分支
//需要同步老仓库的分支必须要在本地checkout过
git checkout master
//同步最新提交记录
git fetch
//提交到新仓库对应分支下
git push new_origin 旧仓库分支:新仓库分支
//强制推送
git push --force new_origin 旧仓库分支:新仓库分支
5、提交所有老仓库分支及记录同步到新仓库
git push new_origin --all