版本管理-Git的使用/配置和常用命令 Git使用与配置

v2.0 20201229

安装git

git用户配置

设置git commit的身份和邮箱
git config 配置有三个级别:

  • system(系统,相当于系统环境变量级别)
  • global(用户,相当于用户环境变量级别)
  • local(当前仓库)

由于底层配置会覆盖顶层配置,应依照system->global->local的顺序设置;

# 对当前用户进行配置:
git config --global user.name $用户名
git config --global user.email $邮箱

# 查看配置: 
git config --system --list
git config --global --list

远程仓库(Github、GitLab)认证

git SSH签名

参考:Git-设置SSH Key - Grace - CSDN博客

ssh-keygen -t rsa -C        # 生成ssh私钥和公钥
ssh-keygen -t rsa -b 4096 -C "email@example.com"    # 按照需要设置rsa选项生成
cat ~/.ssh/id_rsa.pub        # 查看公钥;复制到github设置里
# linux ~/.ssh/id_rsa.pub
# Windows C:Users<username>.sshid_rsa
ssh -T git@github.com     # 测试连接

记录:创建私人项目A后,重置系统,使得.ssh目录下的私钥被删除后,私人项目A不能push,这时重新生成并添加ssh key。

git GPG签名

(有一些情况不设置这个也可以显示)

基本命令

git init          # 将当前文件夹建立为一个 git repo
git clone -b $branchName $URL $localRepoName # 通过-b指定要克隆的分支,同时也可指定 clone 下来的本地 repo 文件夹名称
git status     # 查看当前更改
git diff $file 
git restore .    # 丢弃(当前文件夹下的全部)修改
git add .         # 添加(当前文件夹下的全部)文件到缓冲区
git reset HEAD # 撤销上一次add的操作
git commit     # 不加-m,用vim写msg,第一行是标题,后面是备注
git commit -m "信息"
git commit -m `...`
git commit --amend # 更改刚刚提交的commit
git fetch             # 默认 track origin(?)的指定分支,这个分支在clone 下来的时候指定了,或者在添加 remote 源的时候通过 -t 指定要 track 哪个分支;(这个分支必须要指定,否则虽然可以 fetch 但 pull 的时候不知道把哪个分支 merge 进来,不会默认 track master 分支或者同名分支;会提示使用  git branch --set-upstream-to=origin/master 这样指定)
git merge xxx     # 合并xxx分支(的指定commit)到当前分支
    # 从目标 commit 和当前 commit (即 HEAD 所指向的 commit)分叉的位置起,把目标 commit 的路径上的所有 commit 的内容一并应用到当前 commit,然后自动生成一个新的 commit。——即merge会进行这样的动作:S1施加当前分支落后的那些commit;S2生成一个新的commit;
git merge --abort    # merge冲突待解决状态下,使用--abort放弃这次merge
git pull                 # pull 相当于先fetch再merge
git log                 # 查看当前分支提交历史

#####远程库#####
git remote -v # 列出远程仓库地址
git remote rm upstream # 删除远程仓库源地址
git remote add upstream [需要更换远程仓库的git地址] # 添加源
git push upstream dev # 把本地仓库地址 提交到新的远程仓库
git push -u upstream dev -f # 如果我们是迁移仓库,想用原有仓库覆盖远程仓库的代码

分支

git branch $newBranchName # 创建新Branch
git checkout $branchName # 切换到新分支
git checkout -b $newBranchName # 如果没有会创建这个新分支
git branch -d $branchToDelete # 删除分支

Commit流程

  1. 从公共代码库 clone 代码;
  2. 使用本地 git repo 查看代码;
  3. 若有编辑代码进行调试的需求,则签出到新分支;
    3.1 编辑和调试代码;
    3.2 暂存代码更改;
    3.3 提交 commit ;
  4. 若有并入公共代码库的需求;
    4.1 fork 创建所属的 project
    4.2 在本地 git repo 添加自己的 fork 作为 remote;
    4.3 确认要 push 的 remote;
    4.4 进行 push;

高级操作1.缩减commit次数,节省空间

假设现有一个项目Proj,其主分支为master,处于v1版本;我在master v1版本的基础上fork出了我的项目Proj1,并在Proj1 br1分支施加了更改v1.1, v1.2, v1.3..., v2.0;现在我希望将我的Proj1 v2.0的版本merge到Proj master上,但不希望保存v1.1...等等这些中间版本;那么我可以这样做:

  • 将更改提交到 Proj1 br1分支上;
  • 在Proj1 br1 v1.0的基础上创建一个分支new;
  • 将当前的更改add和commit作为Proj1 new v2.0;【这样行不通】
  • 可以将Proj1 new提起一个Request来merge到Proj master上;

rebase

rebase到某次commit,以后的更改会保留吗?——可以选择squash
使用rebase缩短Git提交历史的线

高级操作2.配置远程库的SSH v2

注:

用同一台电脑登录不同域名下的远程仓库

git 配置多个SSH-Key - stefanzhlg的博客 - OSCHINA

用同一台电脑登录同一域名下的远程仓库

多台电脑登录同一域名的远程仓库

拷贝原来的sshkey,可以在多台电脑上使用:同一个ssh key用在多台电脑上_澜临一-CSDN博客_二台电脑可以用一个ssh?

附录:config文件

# NAME1([NAME1@gitee.com](mailto:NAME1@gitee.com))
Host [NAME1.gitee.com](http://NAME1.gitee.com/)
    HostName [gitee.com](http://gitee.com/)
    PreferredAuthentications publickey
    IdentityFile C:\Users\<username>\.ssh\id_rsa_gitee1
    User git
Host [NAME2.gitee.com](http://NAME2.gitee.com/)
    HostName [gitee.com](http://gitee.com/)
    PreferredAuthentications publickey
    IdentityFile C:\Users\<username>\.ssh\id_rsa_gitee2
    User git

.ssh目录

id_rsa
id_rsa.pub
id_rsa_gitee1
id_rsa_gitee1.pub
id_rsa_gitee2
id_rsa_gitee2.pub
known_hosts

Git头指针分离状态_start_mao的博客-CSDN博客_git 头指针分离