赞
踩
Git是目前世界上最先进的分布式版本控制系统(没有之一)。
开发修改代码区域
Git根目录下 > .git > index的文件中,保存了所有的代码提交记录。
add操作就是将记录保存到暂存区,此时Head依然指向之前的内容,通过commit将暂存区的内容全部提交,之后Head指向最新内容(通过gitk查看)。
Git管理的是修改内容,而不是文件
保存各个版本区域。
CVS及SVN都是集中式版本控制系统,Git是分布式版本控制系统。
集中式必须联网才能工作。如果中央服务器出问题,所有人都受影响。
分布式可以不在一个网络工作,它的中央服务器仅受用来方便交换大家的修改。
都可以管理代码版本。主要区别:
命令 | 功能 | 备注 |
---|---|---|
git config | 可以查看全部配置命令 | |
git config --list | 查看git的配置列表 | 如果没有配置东西,应该是空的 |
git config --global user.name "username"
git config --global user.email "username@email.com"
–global 表示全局的,即当前用户都有效,该配置会出现在 ~/.gitconfig 文件中,~表示当前用户的目录。
不加 --global 表示局部的,只对当前仓库起效的,它的配置信息会在当前仓库根目录/.git/config文件下。
局部配置会覆盖全局配置。
git config --replace-all user.name "name"
git config --replace-all user.email "123@qq.com"
问题原因是修改了git密码。
本地git凭据修改:进入控制面板》用户账号》凭据管理器》windows凭据》普通凭据,找到git,点开编辑密码,更新为最新密码
命令 | 功能 | 备注 |
---|---|---|
git init | 本地创建仓库 | 在一个文件目录执行该指令,会把该目录快速设置成Git的代码仓库 |
ls -ah | 显示隐藏的.git目录:用来跟踪版本 | |
git clone https://git-biz.url.git | 从远程拉取仓库 | 从远程服务器clone工程,也会创建一个代码仓库 |
ssh-keygen -t rsa -C “yourname@example.com” | 本地仓库和远程仓库通信 | 需要SSH进行身份认证,创建SSH私钥和公钥。id_rsa私钥用于验证自己身份。id_rsa.pub公钥用于向服务器表明自己的身份。 |
git remote add | 本地代码库提交到远程 | |
git remote set-url origin http:xxx.git | 更换远程仓库地址,URL为新地址。 | |
git remote -v | 查看远程仓库的地址 |
命令 | 功能 | 备注 |
---|---|---|
git status | 查看当前仓库状态 | 会提示那些文件发生修改,哪些内容需要add&commit。 |
git status -s | 以精简的方式显示文件状态 | |
git status --short | 以精简的方式显示文件状态 |
状态详解:
状态 | 说明 |
---|---|
A | 你本地新增的文件(服务器上没有) |
C | 文件的一个新拷贝 |
D | 你本地删除的文件(服务器上还在) |
M | 文件的内容或者mode被修改了 |
R | 文件名被修改了 |
T | 文件的类型被修改了 |
U | 文件没有被合并(你需要完成合并才能进行提交) |
X | 未知状态(很可能是遇到git的bug了,你可以向git提交bug report) |
? | 未被git进行管理,可以使用git add file1把file1添加进git能被git所进行管理 |
分类 | 命令 | 功能 | 备注 |
---|---|---|---|
add | git add [file1] [file2] … | 添加文件到仓库 | 把文件添加到缓冲区 |
add | git add [dir] | 添加指定目录到暂存区,包括子目录 | |
add | git add . | 添加所有文件到缓冲区 | 不可以添加被手动删除的文件 |
add | git add --all | 添加所有文件到缓冲区 | 可以添加被手动删除的文件 |
add | git add -p | 对于同一个文件的多处变化,可以实现分次提交 | |
add | git add -u | 表示将已跟踪文件中的修改和删除的文件添加到暂存区,不包括新增加的文件,注意这些被删除的文件被加入到暂存区再被提交并推送到服务器的版本库之后这个文件就会从git系统中消失了 | |
add | git add -A | 表示将所有的已跟踪的文件的修改与删除和新增的未跟踪的文件都添加到暂存区 | |
checkout | git checkout ReadMe.txt(文件名) | 将未add提交的修改内容全部还原 | 如果执行add后修改的内容,执行该指令会修改到执行好add后 |
checkout | git checkout – readme.txt | 能将add提交的内容都回退掉 | |
reset | git reset HEAD ReadMe.txt(文件名) | 文件从暂存区回退到工作区 | |
reset | git reset –hard HEAD~5 | 回退5个版本 | hard参数:不仅仅是将本地版本库的头指针全部重置到指定版本,也会重置暂存区,并且会将工作区代码也回退到这个版本。也可以通过commit ID回退到对应版本。 |
rm | git rm ReadMe.txt(文件名) | 删除文件 | |
commit | git commit -m 这是一个注释 | 一次提交缓冲区的所有文件和注释 | 提交缓冲区的所有修改到仓库。如果修改了文件但是没有add到缓冲区,也是不会被提交的。 |
commit | git commit –amend -m | 追加注释,会覆盖上次的注释 | 如果上一个注释写错,可以这样进行修改和追加 |
commit | git commit readme.txt | 提交单个文件 |
$ . //要求输入注释
//在出来的新页面,输入 s,进入INSERT状态
//在#上面,输入注释
//按esc退出编辑状态
//输入“:wq”,重新进入命令状态。
//这个时候会提示有一个变更,需要重新commit
在main分支上开发功能的时候,开发到一半,发现了以前的BUG,这时新建一个BUG分支,在上面修复BUG。但是因为main分支开发的功能开发到一半,会导致BUG分支无法编译通过。这时候可以用git stash
暂存当前的修改。在修改前的分支作为新的BUG分支。等解决BUG后切换回main分支的时候,再把暂存的内容Pop出来。 先checkout一个BUG分支,修改BUG后,用git merge
合并到master分支,并且删除了BUG分支。这时候回到main分支,通过git stash
pop出之前暂存的内容。
git stash //暂存
git stash list // 查看当前暂存内容
git stash apply/pop //内容恢复,后者会删除记录,前者可以通过git stash drop删除暂存记录。
命令 | 功能 | 备注 |
---|---|---|
git log | 查看日志 | |
git log --author=liyong | 查看用户liyong的操作日志 | |
git shortlog | 将开发者操作按照姓名分组 | |
git reflog | 查看操作历史 |
命令 | 功能 | 备注 |
---|---|---|
git diff ReadMe.txt(文件名) | 显示指定内容的前后变化 | |
git diff HEAD | 显示出上次提交节点的差别 | |
git还支持第三方更强大的diff工具:Meld、beyond compare。图形化的log记录:gitk |
命令 | 功能 | 备注 |
---|---|---|
git brach brachName | 创建分支 | |
git branch -vv | 查看当前所有分支 | |
git branch -r | 显示所有远程分支 | |
git branch -a | 显示所有本地分支和远程分支 | *打头表示当前分支;红色表示远程分支。按Q退出 |
git fetch | 取回所有分支(branch)的更新 | 如果看不到远程分支时执行 |
git fetch origin master | 取回特定分支的更新 | git fetch <远程主机名> <分支名> |
git checkout -b newBrachName origin/master | 在origin/master的基础上,创建一个新分支 | 首先保证在origin/master目录下 |
git push origin newBrachName | 将本地创建的分支,推送到远程仓库 | |
git push -u origin master | 将本地master分支提交到远程的master分支,并关联起来 | |
git merge service-v1.0 | 将分支service-v1.0合并到当前分支 | |
git pull origin service-v1.0 | 将分支service-v1.0覆盖当前分支 | |
git pull –rebase | 如果Apush修改前,B push了修改,A push的时候需要先从远程获取最新修改。这个指令不会产生过多的merge历史。 | |
git checkout branchName | 切换分支 | 然后通过$ git branch -a下载代码。 |
git checkout -b branchName | 创建并切换分支 | 然后通过git status 命令查看分支 |
git branch -d branchName | 删除分支 | -d是删除分支,-D是强行删除分支 |
git branch -m 原名 新 | 重命名分支 |
修改分支名:
#本地分支重命名(还没有推送到远程)
git branch -m oldName newName
#远程分支重命名 (已经推送远程-假设本地分支和远程对应分支名称相同)
#a. 重命名远程分支对应的本地分支
git branch -m oldName newName
#b. 删除远程分支
git push --delete origin oldName
#c. 上传新命名的本地分支
git push origin newName
#把修改后的本地分支与远程分支关联
git branch --set-upstream-to origin/newName
Tag用于记录某个commit点或者分支的历史快照。Tag通常打在Master分支上,以保证代码的准确性。
命令 | 功能 | 备注 |
---|---|---|
git tag tagName | 创建Tag,会记录在最后的提交上 | |
git tag | 查看所有Tag | |
git tag -d tagName | 删除tag | |
git tag -a v1 -m “vesion1” b87123665216321635173 | -a制定tag名字,-m制定注释文字 | |
git show tagName | 显示tag的详细信息 | |
git push origin tagName | 推送tag到远程仓库 | |
git push origin –tags | 推送所有本地tag到远程仓库 | |
删除本地tag,再重新push到远程代码库 | 删除远程Tag |
命令 | 功能 | 备注 |
---|---|---|
git pull origin luo-branch | pull代码 | |
git push origin luo-branch | push代码 | |
git revert -m 1 HEAD | 撤回最新mr | 撤回后git push即可提交。注意:会保留mr记录 |
步骤:
4. 代码检出:git checkout master
5. 分支合并:git merge origin/feature
6. 发现有问题,合并撤回:git revert < commit id > -m 1
7. 修改问题后,重新merge 发现第一次merge的东西丢失了。(原因是revert也相当于一次提交,相当于删除了代码)
8. 解决办法:
方法一:idea本地history恢复。
方法二:
git checkout master
# 把master回滚merge之前的状态
git reset head^ --hard
(或 git reset --head "<>")
# 强制推上去
git push -f
# 重新merge feature后再推远程即可
git merge feature
git push
方法三:(官方推荐)
git checkout master
# 从master拉一个新分支 revert_tmp
git checkout -b revert_tmp
# 找到 revert 的那条提交记录,注意了,revert 相关的会有两条记录,第一条是 revert,第二条是 revert 后 merge 的记录,这里取第一条
# 用revert_tmp分支revert之前的revert
git revert <版本号>
# 再用master分支合并此分支代码推到远程即可
git checkout master
git merge revert_tmp
git push
当然也可以直接在master 上revert 之前revert的分支即可(不用新拉分支), 但是注意解决好冲突
回滚操作中: git revert 和 git reset的区别:
两者都是撤回代码,不同在于:
一般与jenkins联合使用,gitlab的某个项目的代码更新了后就触发 webhook中配置的 url ,这个url一般是某一个jienkins中某一个job的url。即gitlab代码更新后就会触发 jinkins的任务自动进行构建。
如下图,输入url和安全令牌(Secret token),勾选推送事件(Push events,此链接将在代码push或者merge时触发)
Url来源是jenkins源码管理 确定的,如下图。
IDEA可以通过rollback进行代码回退,如果一不小心回退了,通过local history可以恢复。
统计代码数量:
git log --author='luo' --since=2019-09-06 --until=2020-01-15 --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }'
git clone支持https和git(即ssh)两种方式下载源码,其中ssh通过配置key可以免密使用git。
git config --global --list 检查邮箱和用户名是否配置
生成授权证书:ssh-keygen -t rsa -C “邮箱”
执行命令后需要进行3次或4次确认:
确认秘钥的保存路径(如果不需要改路径则直接回车);
如果上一步置顶的保存路径下已经有秘钥文件,则需要确认是否覆盖(如果之前的秘钥不再需要则直接回车覆盖,如需要则手动拷贝到其他目录后再覆盖);
创建密码(如果不需要密码则直接回车);
确认密码;
查看公钥私钥是否在系统中生成:
cd ~/.ssh/
ls
id_rsa:这个是私钥
id_rsa.pub:这个是公钥
vim id_rsa.pub
获取)应该是改了git密码但是本地的密码凭据未更新的原因。
windows密码凭据:控制面板->用户控制->凭据管理;
mac密码凭据:应用程序->实用工具->钥匙串->gitlab.……(双击可以查看密码)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。