前言
说来惭愧,关于版本控制工具,此前虽然用过SVN和Git,但都是局限于本地管理,所以并没有远程仓的概念…
远程环境这里使用 GayHub,其他提供远程Git存储库的服务平台其实也大同小异。
本地配置
- Git 安装
- 配置个人信息
# <xxx> : 表示需要替换的内容 git config --global user.name <name> git config --global user.email <email> # ps: 使用config指令查看所有配置 git config --list
- 配置SSH Key
# 检查是否存在SSH Key cd ~/.ssh && ls # 如果出现了 id_rsa.pub 那么直接跳过这一步 #配置SSH Key ssh-keygen -t rsa -C <email>
- 添加SSH Key 到 GayHub
# 打印 id_rsa.pub cd ~/.ssh && cat id_rsa.pub # GayHUb 个人头像 --> Setting --> SSH and GPG keys --> New SSH key
- 测试
ssh -T git@github.com
Git基础概念
- 工作区间:即我们的工程项目文件。
- 缓存区:只能通过
git GUI
或git shell
窗口显示,提交代码、解决冲突的中转站。 - 本地仓库:只能在git shell 窗口显示,连接本地代码跟远程代码的枢纽,不能联网时本地代码可先提交至该处。
- 远程仓库:保存我们代码的服务器。
基本操作
仓库获取
- 从远程拉取
# GayHub 上进入项目首页,点击Code,选择SSH方式(默认),复制项目地址 git clone <URL>
- 在本地创建仓库同步到远程仓
# 本地仓库创建 git init # 添加文件到版本管理器 git add <file> # 重版本控制中移除文件 git rm <file> # 文件重命名 git mv <file> <newname> # 查看当前状态 git status # 创建远程仓库后复制项目地址URL # 关联远程仓库 git remote add <branch> <URL> # 推送到远程仓库 git push -u origin master # ps: 远程仓库空时需要加 -u
拉取
# 下载远程代码并合并
git pull
提交
# 提交到暂存区
git commit
# 推送到远程仓库并合并
git push
分支管理
- 克隆指定分支
# <branch> 是分支名 <URL> 是仓库地址 git clone -b <branch> <URL>
- 切换分支(检出)
git check <branch>
- 更新主分支流到某分支
方法一:
分别克隆两个分支的代码, Beyond Compare
比较并手动合并,再 commint、push
该方法在git分支图上不会留下合并记录,且手动合并的代码被认为是你提交的(可能突然背锅)
由于需要自己比较合并,一般只适用于修改量不大的时候
方法二:
通过 SmartGit合并
例如: 分支dev合并至master
- 检出分支dev、master ( 保留至本地 )
- 保证本地dev、本地master代码与远程分支是一致的
- 当前分支切换至dev
- 选中master分支,右键选择合并
一般选择合并到工作树,检查验证完毕再提交
-
当遇到冲突时,需要解决冲突,常见的有:
- 重命名文件合并冲突 需要通过 git rm/git add 解决
- 增删文件可选择 右键->解决->采用我们的/采用他们的
-
验证合并结果
-
合并提交
- 压缩提交(将两个分支差异的修改合并为一次合并commit提交)
- 提交
- 压缩提交(将两个分支差异的修改合并为一次合并commit提交)
更新子模块
# 有时候项目依赖到其他子项目,需要我们下载子项目
git submodule init
git submodule update
查看修改
# 可以查看每个commit的改动细节
git log -p
# 查看简要统计
git log --stat
# 查看指定commit的指定文件改动细节
git show <commit> <file>
# 显示暂存区和上一条提交之间的不同,即如果执行commit的结果
git diff --staged
# 显示工作区和暂存区之间的不同,即如果所有文件都add的结果
git diff
# 显示工作目录和上一条提交之间的不同,即苏鸥文件都add 再commit的结果
git diff HEAD
提交了错误的commit
- 修改commit
# 将存在问题的文件改好 # 添加到暂存区 git add <file> # 提交修改 git commit --amend
- 回滚
# git reset [--soft | --mixed | --hard] [HEAD] # 回退所有内容到上一个版本 git reset HEAD^ # 回退 hello.php 文件的版本到上一个版本 git reset HEAD^ hello.php # 回退到指定版本 git reset 052e # 补充 HEAD 说明: # ^ # - HEAD 表示当前版本 # - HEAD^ 上一个版本 # - HEAD^^ 上上个版本 # - ... # ~ # - HEAD~0 表示当前版本 # - HEAD~1 上一个版本 # - ...
- 再次提交提交 合并commint
# 合并最近两次提交 git rebase -i HEAD~2
注意:rebase
在 git 中是一个非常有魅力的命令,使用得当会极大提高自己的工作效率;相反,如果乱用,会给团队中其他人带来麻烦。
多人协同开发常见问题
- 提交代码推荐前摇
# 人物:同事A,同事B
# 初始远程仓:版本T
# 由于所有项目组成员都可以修改远程仓库的版本,所有很容易出现一下情况:
# 问题流程: 同事A、B都clone了远程仓版本T,修改后的版本我们记录为TA、TB。假设同事A 先提交,这时远程仓的变为TA了,同事B再提交代码时可能出现两个情况:
# 1. Git自动合并
# 2.你们修改了同一个代码段,提交冲突
# 个人习惯:提交代码前先从远程仓同步代码最后再推送至远程仓
git pull --rebase