西门阿浪
2022/04/19阅读:57主题:灵动蓝
Git技巧小能手
前言
Git是当前最流行的代码版本管理工具,相较于SVN功能更强大。因为Git属于分布式,离线模式下仍然可以工作。且团队合作时,SVN像条单行道,Git更像高速公路。福兮,祸之所伏。Git功能强大的同时,也伴随着更加繁琐的使用命令。
Git的全局信息设置:
1、设置全局用户名: git config --global user.name " your name " 2、设置全局用户名: git config --global user.email " your email " 3、查看全局信息: git config --list

Git常用命令
核心概念
工作区(working tree):文件资源在计算机内的实际物理位置。
暂存区(stage):类似缓存空间,用于保存提交的变更内容。
版本库(Repoistory):有本地仓库和远程仓库之分。

本地库
1、创建本地仓库
git init (PS:生成.git的文件,表示仓库创建成功)
【详解】:后续的所有操作都是基于此版本库,是Git版本管理的基础。
2、提交本地库
git add 文件名 (PS:支持批量操作)
【详解】:将文件交由git管理,把工作区内容复制到暂存区存储。git rm 文件名 (PS:支持批量操作)
【详解】:将文件从工作区和暂存区删除。git commit -m "提交描述"
【详解】:将暂存区的内容提交到版本库的当前分支。
3、仓库状态
git status
【详解】:版本库内各文件状态。
git diff 文件名
【详解】:查看指定文件,在工作区
与暂存区
中的差异。git diff --cached 文件名
【详解】:查看指定文件,在暂存区
与版本库
中的差异。git diff HEAD 文件名
【详解】:查看指定文件,在工作区
与版本库
中的差异。
4、版本回退
git log (PS):commit后面的号码为版本号
【详解】:查看提交版本历史记录。git log --pretty=online
【详解】:仅显示版本号+版本描述。git reset --hard 版本号
【详解】:使版本库回退到指定版本。HEAD^:上一版本。HEAD^^:上两版本。git reset --soft 版本号
【详解】:将版本库回退到指定版本,并将该commitID到最近一次commitID的所有修改内容全部恢复到暂存区。
【应用场景】:有时候手滑不小心把不该提交的内容commit了,想改回来只能再commit 一次,这样又会多一条“黑历史”。
5、撤销更改
git restore 文件名
【详解】:只会撤销工作区内的文件修改,若文件提交到暂存区后,则无法撤销。
文件修改后 尚未add
到暂存区,restore后恢复到修改状态前的版本。文件修改后 已经add
到暂存区,restore后无效。文件修改后 已经add
到暂存区,后又再次修改
,恢复到add刚完成后的版本。
6、命令回退(后悔药)
git reflog
【详解】:查看命令历史记录。
远程库
1、安全通信
准备工作,需要先生成SSH密钥。因为对远程库操作时,需要使用SSH保证安全连接。
-
生成ssh-key
windwos环境下,在cmd窗口执行下列命令生成SSH密钥对。 ssh-keygen -t rsa -b 4096 -C “your_email”
-
添加id_rsa
ssh-add ~/.ssh/id_rsa
【注意】:如果执行ssh-add时出现Could not open a connection to your authentication agent。
先执行此命令: ssh-agent bash 再执行: ssh-add ~/.ssh/id_ras 即可。
-
将生成的公钥配置到GitHub、Gitee中。

-
验证连通性
配置SSH成功后,验证是否可以连通
ssh -T git@gitee.com || ssh -T git@github.com
3、创建远程库
将本地库和远程库关联:
git remote add {origin} git@server-name:path/repo-name.git
【origin】:自定义的远程仓库连接名,默认为origin。直接克隆远程库:
git clone git@server-name:path/repo-name.git
【详解】能快速拿取远程库资源,GitHub上的白嫖神器。
2、本地仓库 --> 拉取/同步/解绑 --> 远程仓库
拉取远程库最新版本数据:
git fetch {origin}
【详解】通常配合git merge一起使用把远程库origin的变更<同步到>本地库的master分支:
git pull {origin} {master}
【master】:完整格式:{远程分支名}:{本地分支名},分支名相同可省略远程名。
【详解】:git pull = git fetch(拉取分支数据) + git merge(合并分支)将本地库和远程库解绑:
git remote remove {origin}
3、提交远程仓库
git push {origin} {master}
【详解】向远程库推送的时候,本地库必须干净。git push -u {origin} {master}
【-u】:记住对应关系,后续推送可以省略参数,直接git push即可。git push -f
【-f】:强制推送
-
non-fast-forward 问题
添加远程库后首次push时,由于远程库与本地库版本不一致导致push失败。
这时候就需要先同步两个库信息。通常情况下可以用git fetch + git merge或者git pull一次搞定。
-
fatal: refusing to merge unrelated histories
当远程库和本地库没有一个共同的commit时,会触发保护机制,github会认为是写错了远程库别名origin,为了防止开发者上传错误不允许提交并报错。
![]()
如果开发者确定是这个 origin,可以使用 --allow-unrelated-histories 告诉git自己的决定。
4、远程库信息查看
查看项目远程地址:
git remote -v查看当前远程库基本信息:
git remote show origin
分支管理
创建分支:
git branch 分支名查看现有分支:
git branch -a
【详解】:本地和远程分支全部列出切换分支:
git switch 分支名创建并切换分支:
git switch -c 分支名合并分支:
git merge 分支名删除分支:
git branch -d 分支名
【详解】:前提是分支没有未合并的变更。
-
分支冲突
开发时,团队成员都从master上开辟一个从分支,由于工作进度各不相同,当有人合并分支后,其它分支必然存在冲突。
当有冲突时,merge是无法通过的,并提示fix conflicts and then commit the result。这时就需要我们手动解决冲突了。
首先通过 git status 排查出冲突所属的分支。 然后 cat 进入指定文件可以自动产生版本的差异。 解决完成后,可merge。 git log --graph --pretty=oneline 可以查看合并结构图
-
临时BUG分支
手上的业务代码还未完成,又急需解决分派过来的BUG,这时候临时分支就能够很好的提高工作效率。但当前分支还不能提交,直接切换分支无法通过,所以就需要借助stash保护现场。
保护现场:
git stash save "描述"
【详解】:能够将还未commit的代码暂存起来,让工作区变得干净。创建临时分支,完成后合并:
git switch -c bugTemp
git switch master
git merge --no-ff -m "描述" 分支名恢复现场:
git stash pop
【详解】:将现场恢复原样,继续未完成的工作。
-
分支移植
想在某个稳定版本上,添加一个刚开发完成的版本中的功能。就可以使用Cherry-pick 命令,将这个功能相关的commit提取出来,合入稳定版本的分支上。
git cherry pick commitID
【详解】:将已经提交的commit,复制出新的commit应用到分支里。
作者介绍