西门阿浪

V1

2022/04/19阅读:28主题:灵动蓝

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。

  1. 先执行此命令: ssh-agent bash
  2. 再执行: ssh-add ~/.ssh/id_ras 即可。
  • 将生成的公钥配置到GitHub、Gitee中。
  • 验证连通性

配置SSH成功后,验证是否可以连通
ssh -T git@gitee.com || ssh -T git@github.com

3、创建远程库

  1. 将本地库和远程库关联:
    git remote add {origin} git@server-name:path/repo-name.git
    【origin】:自定义的远程仓库连接名,默认为origin。

  2. 直接克隆远程库:
    git clone git@server-name:path/repo-name.git
    【详解】能快速拿取远程库资源,GitHub上的白嫖神器。

2、本地仓库 --> 拉取/同步/解绑 --> 远程仓库

  1. 拉取远程库最新版本数据:
    git fetch {origin}
    【详解】通常配合git merge一起使用

  2. 把远程库origin的变更<同步到>本地库的master分支:
    git pull {origin} {master}
    【master】:完整格式:{远程分支名}:{本地分支名},分支名相同可省略远程名。
    【详解】:git pull = git fetch(拉取分支数据) + git merge(合并分支)

  3. 将本地库和远程库解绑:
    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。这时就需要我们手动解决冲突了。

  1. 首先通过 git status 排查出冲突所属的分支。
  2. 然后 cat 进入指定文件可以自动产生版本的差异。
  3. 解决完成后,可merge。
  4. 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应用到分支里。

分类:

后端

标签:

Git

作者介绍

西门阿浪
V1