Git

git架构

image

Git CMD 和 GUI

Git Bash --基于CMD,Bash在CMD的基础上新增了一些命令和功能,建议使用Bash更方便。

Git GUI --图形操作界面

配置用户

$ git config --global user.name "你的名字或昵称"
$ git config --global user.email "你的邮箱"

# 查看
$ git config user.name
$ git config user.email

ps: 注意git config命令的 --global 参数,
用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,
当然也可以对某个仓库指定不同的用户名和Email地址。

git操作

新建仓库并保存工作内容

# ==================
# 1. 创建仓库
# ==================

# 本地新建仓库(需初始化)后与远程关联
$ git init 
$ git remote add origin "ssh或https"
$ git pull origin master

# 或远程仓库克隆到本地直接使用
$ git clone https://地址

# ==================
# 2. 提交到仓库
# ==================
$ git add .                     # 将当前目录所有文件添加到git暂存区
$ git commit -m "第一次提交"    # 提交并备注提交信息

# ==================
# 3. 提交到远程仓库
# ==================
$ git push origin master  #将本地提交推送到远程仓库

$ git push origin master -f # 强制推送

[ps]: git add

git add . 表示所有文件,也可指定文件,例如:
$ git add filename1.text        # 指定单个文件提交
$ git add file2.txt file3.txt   # 指定多个文件提交

更改仓库地址

# 仓库地址已存在的话先运行删除
git remote rm origin

# 设置地址
git remote add origin http://xxxxx.git

从远程仓库拉取(更新)代码至本地

注意:从远程仓库更新之前应该addcommit保存工作进度。

commit提交工作进度会直接产生版本号,如果自己当前工作做了一半,并不想commit,可以使用git stash临时保存工作进度(往下看)。

从上面架构图中可以看出,有两种方法从远程仓库更新,pull(拉取) 和 fetch(获取) + merge(合并),

# ==================
# 方法一
# pull(拉取)
# ==================
git pull <远程主机名> <远程分支名>:<本地分支名>

# 例:
git pull origin master      # 将远程origin主机的master分支拉取过来和本地的【当前分支】进行合并
git pull origin master:brantest # 将远程主机origin的master分支【拉取】过来,与本地的【brantest分支】合并

# ==================
# 方法二
# fetch(获取) + merge(合并)
# ==================
git fetch <远程主机名> <分支名>
git diff <分支名>   # 与当前工作分支比较差异
git merge <分支名>

# 例1:
git fetch origin master     # 获取 origin 主机的dev分支
git diff origin/master     # 比较差异
git merge master      # 将dev分支与当前工作的分支合并
# 等同于
git pull origin master:master

# 例2:
git fetch origin master:temp  # 在本地新建一个temp分支,并将远程origin仓库的master分支代码下载到本地temp分支
git merge temp      # 将temp分支与当前工作的分支合并


# 一句话总结git pull和git fetch的区别:git pull = git fetch + git merge

origin是什么

在克隆远程项目的时候,本地分支会自动与远程分支建立追踪关系,可以使用【默认】的origin来替代远程仓库名。

例如上面的: git pull origin master,其完整写法为:

git pull https://gitee.com/xxx/xxx.git master:master

git stash暂存

使用git stash临时保存工作进度。该操作会将当前修改过的文件且还未加入commit中的保存起来。也就是架构图中的【工作区】和【暂存区】流程

# 贮藏
$ git stash save "save message"

# 贮藏起来后,分支状态会回到上次commit后的状态

恢复操作

# 准备恢复之前临时保存的工作进度
# 查看贮藏列表
$ git stash list

# 恢复并删除,num是可选项,通过git stash list可查看具体值。
$ git stash pop stash@{num}

# 恢复但不删除,num是可选项,通过git stash list可查看具体值。
$ git stash pop stash@{num}

# 恢复过后可能会有冲突,这时需要解决冲突

# 删除所有的贮藏
$ git stash clear

更新到本地出现冲突的解决办法

git pull后提示

CONFLICT (content): Merge conflict in xxx
Automatic merge failed; fix conflicts and then commit the result.

# 意思为 合并冲突xxx文件 自动合并失败;修复冲突,然后提交结果。

如果有使用git ui管理工具,这步会舒服很多。

例如TortoiseGit工具,直接在项目根目录右键=>TortoiseGit=>点击解决冲突

没有的话,就用bash吧:

检查每一个冲突的文件,手动修改,决定去留

# 1. 查看当前状态
$ git status

# 2. 然后会列出你冲突的文件,接下就自己打开文件一个个解决吧

# 3. 解决完后
$ git add .
$ git commit -m "conflict"

烦死了

如果此时的冲突,令人烦躁,希望「恢复至更新前」或打算「舍弃本地仅要线上版本」时,可以进行如下操作:

(恢复至更新前)舍弃远程的版本,恢复本地版本:

$ git log       # 查看历史版本
$ git log -p -1 # 这个显示最近的一次历史情况

# 例:
$ git log
commit 6a644126a7db0c66faf3b31549b62810f17b56ab (HEAD -> master)
Author: DeQ <630906612@qq.com>
Date:   Wed Nov 18 22:27:48 2020 +0800

    新提交

commit d3ffc145912ac496ff412d4741537ffa2d88b2e6
Author: DeQ <630906612@qq.com>
Date:   Fri Jul 31 10:53:10 2020 +0800

 
# ****例end****


# 恢复到指定版本,commit后面的就是版本号
git reset --hard 版本号
# 例如上面: git reset --hard d3ffc145912ac496ff412d4741537ffa2d88b2e6

# 这时已经恢复到拉取之前的版本状态

舍弃本地的修改,让本地版与远程版一致

$ git fetch --all     # 获取远程仓库
$ git reset --hard origin/master  # 将远程仓库主分支覆盖到当前暂存区和工作区

# 注意:
# 如果你没有commit你的本地修改(甚至于你都没有通过git add追踪过这些文件,当他们被删除时,
# git reset –hard对于这些没有被commit过也没有git add过的修改来说就是具有毁灭性的,destructive!!)
# 也就是那些文件将找不回来!

仓库分支

多人协作开发时,应保持master(主分支)稳定,开发时根据实际情况用分支开发,完毕后再合并到主分支。

创建和推送分支

# 创建分支并将自己的工作切换到该分支下
$ git checkout -b develop   # 在本地新建分支develop,并切换到该分支


# 推送分支, 需要先add和commit
# 推送到远程仓库 的 develop分支 (不存在分支会自动创建)
git push origin develop

从远程仓库更新指定分支

git pull origin develop:develop

其它一些操作

checkout
git checkout -f # -f相当于 “--force”, 强制移动指针,忽略本地变化
# 使用场景就是<复原>,比如写完 a=1; 并提交了;然后我们又试了a等于2等于3,但这部分我们并不想提交版本,这时复原内容,使用该命令即可。

查看分支

查看本地分支

git branch

查看远程分支

git branch -r

查看所有分支

git branch -a 
切换分支
git checkout new-branch
删除分支

git branch -d 分支名

附 (git速查表)

git速查表 https://cheatsheet.wang/

SSH Keys配置

$ ssh-keygen -t rsa -C "youremail@example.com"

# -t:指定要创建的密钥类型
# -C:添加注释;

# 可以直接执行ssh-keygen
ssh-keygen
  • 然后一路回车,使用默认值或根据提示输入希望保存的位置等信息。
  • 默认生成位置在用户主目录里的.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对。
  • id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
  • 将id_rsa.pub文件的内容复制到托管平台的SSH Keys,然后就可以通过ssh连接免密拉取代码了。

指定id_rsa文件转pem操作(可以用来登陆服务器)

# 复制一份id_rsa文件并改名为id_rsa.pem
mv id_rsa id_rsa.pem

# 指定文件转pem
ssh-keygen -p -m PEM -f ./id_rsa.pem