git相关的使用技巧都在这篇文章,随时补充完善ing!!
0、Git的几种状态
原始内容
↕ ← 修改操作
工作区
↓ ← 缓存操作(git add)
缓存区
↓ ← 提交操作(git commit)
本地仓库
↓ ← 推送操作(git push)
远程仓库
1、Git常用操作
1、拉取服务器代码
git pull
提交代码之前,需要先从服务器上面拉取代码,以防覆盖别人的代码。
拉取后代码就处于”工作区“。
2、查看当前工作目录树的工作修改状态
git status
状态有如下几种:
1:Untracked:未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.
2:Modified:文件已修改, 仅仅是修改, 并没有进行其他的操作.
3:deleted:文件已删除,本地删除,服务器上还没有删除.
4:renamed:
3、将状态改变的代码提交至缓存
git add 文件 #添加单个文件
git add -u 路径 #将修改过的被跟踪代码提交缓存(路径下的文件)
git add -A 路径 #将修改过的未被跟踪的代码提交至缓存(路径下的文件)
git add -u ./server/ #将 ./server目录下被跟踪的已修改过的代码提交到缓存中 ;
git add -A ./server/ #将 ./server目录下未被跟踪的已修改过的代码提交到缓存中 ;
add后更改文件处于“缓存区”。
4、将代码提交到本地仓库中
git commit -m "注释部分"
commit操作后更改文件处于“本地仓库”。
5、将代码推送到服务器
git push
push操作后更改文件处于“远程仓库”。
6、代码误提交问题
(1)已修改,未缓存(只修改内容,未进行其他操作)
恢复方法:使用以下任一指令:
方法一:git reset --hard
方法二:git checkout .
方法三:git checkout -- <FILENAME>
(2)已缓存,未提交(已执行git add,未执行git commit)
即缓存区的内容不想要了。
恢复方法:使用以下任一指令:
方法一:git reset --hard
方法二:git reset HEAD
方法三:
git reset
git checkout .
(3)已提交,未推送(已执行git commit,未执行git push)
恢复方法:使用远程仓库覆盖本地仓库。
git reset --hard origin/branch
(4)已经推送(已执行git push)
恢复方法:回滚本地仓库,强制推送覆盖远程仓库。
git reset --hard HEAD^
git push -f
2、分支管理
(1)分支命名
master 分支
-
master 为主分支,也是用于部署生产环境的分支,确保master分支稳定性
-
master 分支一般由develop以及hotfix分支合并,任何时间都不能直接修改代码
develop 分支
-
develop 为开发分支,始终保持最新完成以及bug修复后的代码
-
一般开发的新功能时,feature分支都是基于develop分支下创建的
feature 分支
-
开发新功能时,以develop为基础创建feature分支
-
分支命名: feature/ 开头的为特性分支, 命名规则: feature/user_module、 feature/cart_module
release分支
-
release 为预上线分支,发布提测阶段,会release分支代码为基准提测
当有一组feature开发完成,首先会合并到develop分支,进入提测时,会创建release分支。
如果测试过程中若存在bug需要修复,则直接由开发者在release分支修复并提交。
当测试完成之后,合并release分支到master和develop分支,此时master为最新代码,用作上线。
复制代码
hotfix 分支
-
分支命名: hotfix/ 开头的为修复分支,它的命名规则与 feature 分支类似
-
线上出现紧急问题时,需要及时修复,以master分支为基线,创建hotfix分支,修复完成后,需要合并到master分支和develop分支
(2)常见任务
增加新功能
(dev)$: git checkout -b feature/xxx # 从dev建立特性分支
(feature/xxx)$: blabla # 开发
(feature/xxx)$: git add xxx
(feature/xxx)$: git commit -m 'commit comment'
(dev)$: git merge feature/xxx --no-ff # 把特性分支合并到dev
复制代码
注:对于有删除文件的情况执行git add可能还是要多加些参数
1. 忽略删除的文件
git add --ignore-removal <pathspec>
2. 作用删除的文件
git add --all <pathspec>
修复紧急bug
(master)$: git checkout -b hotfix/xxx # 从master建立hotfix分支
(hotfix/xxx)$: blabla # 开发
(hotfix/xxx)$: git add xxx
(hotfix/xxx)$: git commit -m 'commit comment'
(master)$: git merge hotfix/xxx --no-ff # 把hotfix分支合并到master,并上线到生产环境
(dev)$: git merge hotfix/xxx --no-ff # 把hotfix分支合并到dev,同步代码
复制代码
测试环境代码
(release)$: git merge dev --no-ff # 把dev分支合并到release,然后在测试环境拉取并测试
复制代码
生产环境上线
(master)$: git merge testing --no-ff # 把testing测试好的代码合并到master,运维人员操作
(master)$: git tag -a v0.1 -m '部署包版本名' #给版本命名,打Tag
复制代码
git merge和rebase的区别
git merge 与 git rebase的区别_Michaelliu_dev的博客-CSDN博客_merge和rebase区别
3、Git diff操作
1)git diff : 对比工作区和暂存区(git add 之前)
注:如果已经执行“git add ”,执行此指令不会有任何区别显示。
2)git diff --cached: 对比暂存区(git add 之后)和版本库(git commit 之后)
注:如果已经“git commit”,执行此指令不会有任何区别显示。
3)git diff HEAD: 对比工作区(未 git add)和版本库(git commit 之后)
注:
4、Git缩写A C D M R T U X代表的含义
git中,经常会在一些操作后,出现简写字符用于表达某些状态。
操作截图如下:
在切换分支之后的两行前面分别有两个字符,它们分别代表什么含义呢。
字符含义列表如下:
A: 工作区新增的文件.
C: 文件的一个新拷贝.
D: 你本地删除的文件,服务器上还在。
M: 文件的内容或者mode被修改。
R: 文件名被修改了。
T: 文件的类型被修改了。
U: 文件没有被合并,需要完成合并才能进行提交。
X: 未知状态。
5、Git配置免密登陆(记住密码)
(1)最简介的方式是设置 credential.helper store 配置。
过程很简单,执行如下命令然后再输入一次密码就好了,后续所有的操作就都不用在输密码了。
git config --global credential.helper store
6、git log查看历史提交记录记录相关
关于git log更多使用方法参见:Git-叹为观止的 log 命令 & 其参数_DRPrincess的博客-CSDN博客_git log
(1)git log #这个就是最常用的了。效果如下:
但是,通常要查看的提交记录太多久远了,挨个向下翻肯定是不现实的。为此有一下几种方法:
(2)git log > temp.txt #然在在这个txt文档里面查找
(3)git log --author="johnyxiong" #根据提交者查找提交记录,效果如下:
(4)git log --since="2018.08.08" --until="2018.08.09" #根据起止日期查找,效果如下:
7、查看/修改用户名、邮箱
用户名和邮箱地址的作用
用户名和邮箱地址是本地git客户端的一个变量,不随git库而改变。
每次commit都会用用户名和邮箱纪录。
github的contributions统计就是按邮箱来统计的。
查看用户名和邮箱地址:
git config user.name
git config user.email
修改用户名和邮箱地址:
git config --global user.name "shuozhuo"
git config --global user.email "shuozhuo@tencent.com"
8、提示邮箱不对
或者如下提示。
You can't push commits with committer ‘root’ or email 'root@tencent.com' who is not exit among the registered users
含义很明确。公司代码提交有个规范,必须要是公司的邮箱否则检查不通过。
解决方法也很简单:重新设置下优先就行了。
#修改对应的email
git config user.email shuozhu@tencent.com
#查看修改结果
git config user.email
9、Your branch is ahead of 'origin/master' by 4 commits.
原因:在本地主机中进行了修改,但是没有推送到远程主机。
$ git checkout master
M mod_global_pb
M mod_qd_comm_proj
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 4 commits.
(use "git push" to publish your local commits)
(1)远端覆盖本地的同步。注意:确保本地代码确实不在需要在进行覆盖。
git reset --hard origin/master
或者
git branch -u origin/master
(2)保留本地当前改动。
git push -u origin master
10、kex_exchange_identification: read: Connection reset by peer
Please make sure you have the correct access rights
and the repository exists. 报错,如下。
和 ssh-keygen 、 id_rsa.pub 没啥关系;主要是ssh失效了,按照 这里 操作一下就可以了。即:
执行一下:
git remote set-url origin http://AAAAAAAAAAAA.git
#注:后面的这个http:XXXX.git从下面复制过来就好。
11、Linux下git diff等操作没有颜色
在linux中git安装后颜色是不自动设置的。
下面的命令设置git的颜色:
git config --global color.status auto
git config --global color.diff auto
git config --global color.branch auto
git config --global color.interactive auto
12、Git删除文件
执行git status发现如下:
第二条提示。git checkout 就是丢弃工作期的更改,此时相当于撤销删除;显然不是我们想要的。
第一条提示。即删除文件 git rm file1.txt file2.txt
总结:删除文件和添加文件类似,都是一次commit,本地文件的任何更改都要添加到暂存区然后提交到版本库。 简单来说对于追加提交就是git add,对于删除文件的提交就是git rm。
13、git项目地址替换
这里主要指的就是域名下线,如何切换到一个新的域名。
举个例子:原域名是git.code.ooaa.com,由于证书过期域名被下线了要替换成git.wooaa.com。
Http:
git remote set-url origin https://git.wooaa.com/xxx.git
SSH:
git remote set-url origin git@git.wooaa.com:xxx.git
注:其中xxx为实际仓库路径,一个举例如下.
git remote set-url origin https://git.woa.com/qidian_platform/comm_proj
git remote set-url origin https://git.wooaa.com/xxxxx_platform/qd_cc_proj.git
我们可以通过 git remote -v 查看当前项目在用的地址是啥。