git个人使用笔记
最前面
git,分布式版本控制系统
2002年,BitMover公司出于人道主义精神,授权Linux社区免费使用BitKeeper这个版本控制系统
2005年,开发Samba的Andrew试图破解BitKeeper的协议(这么干的其实也不只他一个),被BitMover公司发现了,于是BitMover公司怒了,要收回Linux社区的免费使用权
于是,Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!
一个月之内,Linux系统的源码已经由Git管理了!
2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等
如果不是当年BitMover公司威胁Linux社区,可能现在我们就没有免费而超级好用的Git了。
以前有个软件也叫GIT(GNU Interactive Tools),结果Git就只能叫
git-core
了。由于Git名气实在太大,后来就把GNU Interactive Tools改成gnuit
,git-core
正式改为git
。
git靠谱查询
git安装与配置
intelij上集成好的git也非常好用,能满足大多数时候的要求;其余使用命令行也很顺手。所以,个人不推荐使用GUI。
其余若有GUI需求,看这里GUI Clients,source tree、tortoisegit、git-fork还不错,望自测。
1.git安装
-
win下git安装
官网下载安装
-
Mac下git安装
## mac自带,没有就brew安装一下 brew install git
-
ubuntu下git安装
sudo apt update sudo apt install git
2.git配置
Git本身支持HTTPS和SSH两种协议,HTTPS每次pull、push时要求输入密码,建议使用SSH。
git配置主要为以下三个步骤
-
1).创建密钥对(若已存在密钥,跳转第二步)
ssh-keygen -t rsa -C "your_email@youremail.com"
创建过程会询问key的存储位置,建议直接Enter;会询问你输入密码,建议不输,直接Enter。 至此,完成生成本地的SSH密钥,默认存储位置为:账号主目录下的.ssh文件夹下。
- Windows 账号主目录:
C:\Users\{username}\
- Mac账号主目录:
~
## mac 下查看密钥生成情况,公钥上传到托管平台,私钥保留在本地 admin@admindeMacBook-Pro-2 ~ % tree ~/.ssh /Users/admin/.ssh ├── id_rsa ## 私钥 ├── id_rsa.pub ## 公钥 └── known_hosts
- Windows 账号主目录:
-
2).添加公钥到GitLab或GitHub 登陆所要连接的日常git托管平台,或公司内网git托管平台,Settings -> SSH keys,新建SSH Key,粘贴公钥。至此添加完成,需测试ssh key是否成功。
## 测试 ssh -T git@github.com ssh -T git@gitlab.com
通常场景:公司内网git托管平台 开放端口为自定义端口,因此需要测试对应端口。
## test ssh -T -p <port> git@gitlab.com ## e.g. ☁ ~ ssh -T -p 22111 git@gitlab.picc0lo.com remote: remote: ======================================================================== remote: remote: Failed to get username: Internal API unreachable remote: remote: ======================================================================== remote: ☁ ~ ssh -T -p 22112 git@gitlab.picc0lo.com Welcome to GitLab, @dave!
-
3).配置基础本地信息
git config
级别-
local 优先级最高
-
global优先级次之
-
system优先级最低
建议:
--global
配置为常用,--local
针对具体不常用平台配置。典型场景:–global配置公司gitlab平台用户信息;针对个人github相关配置,在本地起一个路径,在路径下执行
git init git config --local user.name "your_name" git config --local user.email "your_email@gmail.com"
以后github相关代码在此仓库进行pull、push。
## --global 配置用户名与邮箱 git config --global user.name "your_name" git config --global user.email "your_email@gmail.com" ## 配置本地仓库文件是否大小写敏感,建议配置(不配置也没关系) git config core.ignorecase false ## 查看本地配置信息 git config --list
-
至此,基础配置完成。
-
4).git ssh port
通常场景:公司内网git托管平台 开放端口为自定义端口,因此需要配置对应ssh config
Pair<host,port>
## 配置ssh config sudo vim ~/.ssh/config ## 填充范式 Host {your_gitlab_alias_name} Hostname {your_gitlab_addr} ## default user: git User {your_name} ## default port: 22 Port {your_ssh_port} ## default order: gssapi-with-mic,hostbased,publickey,keyboard-interactive,password PreferredAuthentications {preferred_authentication_method} IdentityFile {key} ## e.g. Host gitlab.picc0lo.com Hostname gitlab.picc0lo.com User dave Port 22112 IdentityFile ~/.ssh/id_rsa
通常场景:公司平台git 与 个人github均使用ssh,想同时使用;可同时配置
## e.g. Host gitlab.picc0lo.com Hostname gitlab.picc0lo.com User dave Port 22112 PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa_gitlab Host github.com Hostname github.com User dave PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa_github
git常用命令/操作
以下按照场景划分
git 有严格的本地仓库/远程仓库划分,所以,严格把控版本发布,只在自己的分支上造次就好。
-
初始化过程
## 新建项目目录 mkdir gitTest ## 切入项目路径 cd gitTest ## 当前路径下初始化生成 .git ,目录变成Git可以管理的仓库 git init ## 新建项目目录,并初始化 git init {project_name}
-
代码clone
## 直接拉取项目(所有分支) git clone {project_url} ## 按照分支拉取项目(仅拉取相应分支) git clone -b {feature_name} {project_url}
-
分支/仓库查看
## 分支查看 git branch ## 查看本地分支 git branch -r ## 查看远程分支 git branch -a ## 查看所有分支 git branch -av ## 查看所有分支,并追查其最近一条提交记录 git branch -avv ## 查看本地分支与远程关联分支 ## 远程仓库地址查看: git remote -v ## 查看有权限的远程分支/仓库 git remote show origin
-
拉取代码
## 1.拉取当前分支代码到本地(已有分支,迭代开发过程中) ## 拉取前先查看并切换到想要拉取的分支 git pull ## 2.拉取指定分支的代码 ## 1)先本地分支与远程想要拉取的分支做关联 git checkout -b {local_feature_name} origin/{origin_feature_name} ## 2)拉取对应远程分支 git pull origin {origin_feature_name}
-
分支检查/切换/删除
## 分支检查/切换 git checkout ## 检测跟踪当前分支 git checkout - ## 切换到上一个分支 git checkout {feature_name} ## 切换到其他分支 git checkout -b {feature_name} ## 创建分支并切换 git branch --track {feature_name} {origin_feature_name} ## 创建分支,并与远程分支建立追踪关系 ## 分支删除 git branch -d {feature_name} ## 删除本地分支 git push origin --delete {origin_feature_name} ## 删除远程分支 git branch -dr {origin_feature_name} ## 删除远程分支
-
信息查看
## 显示有变更的文件 git status ## 版本历史 git log ## 显示当前分支的版本历史 git log --stat ## 显示commit历史,以及每次commit发生变更的文件 git log -S <keyword> ## 搜索提交历史,根据关键词 git log <tag> HEAD --pretty=format:%s ## 显示某个commit之后的所有变动,每个commit占据一行 git log <tag> HEAD --grep feature ## 显示某个commit之后的所有变动,其"提交说明"必须符合搜索条件 git log --follow <file> ## 显示某个文件的版本历史,包括文件改名 git whatchanged <file> ## 显示某个文件的版本历史,包括文件改名 git log -p <file> ## 显示指定文件相关的每一次diff git log -5 --pretty --oneline ## 显示过去5次提交 git blame <file> ## 显示指定文件是什么人在什么时间修改过 ## diff git diff ## 显示暂存区和工作区的差异 git diff HEAD ## 显示工作区与当前分支最新commit之间的差异 git diff <commitHash_A>...<commitHash_B> ## 显示两次提交之间的差异 git diff <feature_A>...<feature_B> ## 显示分支之间的差异 ## show git show <commitHash> ## 显示某次提交的元数据和内容变化 git show --name-only <commitHash> ## 显示某次提交发生变化的文件 git show <commitHash>:<filename> ## 显示某次提交时,某个文件的内容 ## 显示当前分支的最近几次提交 git reflog ## 统计 git shortlog -sn ## 显示所有提交过的用户,按提交次数排序 git diff --shortstat "@{0 day ago}" ## 显示今天你写了多少行代码
-
提交代码
标准流程:先提交修改到本地仓库,再将本地仓库的修改push到远程仓库上自己的开发分支
## 1.提交修改到本地仓库 涉及暂存 ## 1)提交暂存(提交后git status可查看到文件状态不一样了) git add dave mia ## 只暂存dave、mia文件 git add . ## 暂存全部文件 ## 暂存可撤销 git reset dave ## 撤销add a文件 git reset . ## 撤销add 所有文件 ## 2)提交暂存的修改到本地仓库 git commit -m "修改描述信息" ## 查询本地提交记录 git log ## 2.push到远程仓库 ## 1)自己有单独开发分支,且当前分支关联着远程开发分支,可直接push git push ## 2)自己有单独开发分支,如果不确定当前分支关联远程分支,可先关联;也可采用如下push git push origin {origin_feature_name} ## 3)远程分支还未创建,准备推送当前分支,采用如下,将在远程创建分支并关联,推送 git push origin {local_feature_name}:{origin_feature_name} ## 3)当前分支不存在远程分支,push时远程创建分支并与当前关联 git push --set-upstream origin {origin_feature_name} ## 自己无单独开发分支,务必先拉取最新代码,再push ## 保持规范,加上rebase参数 git pull --rebase
-
恢复/撤销
## checkout git checkout <file> ## 恢复暂存区的指定文件到工作区 git checkout <commitHash> <file> ## 恢复某个commit的指定文件到暂存区和工作区 git checkout . ## 恢复暂存区的所有文件到工作区 ## reset git reset <file> ## 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变 git reset --hard ## 重置暂存区与工作区,与上一次commit保持一致 git reset <commitHash> ## 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变 git reset --hard <commitHash> ## 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致 git reset --keep <commitHash> ## 重置当前HEAD为指定commit,但保持暂存区和工作区不变 ## 新建一个commit,用来撤销指定commit;后者的所有变化都将被前者抵消,并且应用到当前分支 git revert <commitHash> ## stash git stash ## 暂存工作目录未提交的变化 git stash pop ## 将缓存堆栈中的第一个stash(最新那个)删除,并将对应修改应用到当前的工作目录下 git stash list ## 查看现有stash list git stash apply ## 默认使用最新的stash应用到工作目录,不删除stash git stash apply <stash_name> ## 使用指定stash应用到工作目录,不删除stash git stash drop stash@{0} ## 应用最新的stash git stash drop <stash_name> ## 删除指定stash git stash drop stash@{0} ## 删除最新的stash git stash clear ## 删除所有缓存的stash
-
定期合并dev分支到自己个人开发分支上去
## 先确定自己处于自己的分支,或本地分支关联着属于你的远程开发分支 ## 可先查看分支 和切换分支 git status -s git checkout {your_feature} ## merge 合并 git merge {dev_feature}
-
远程存在新增分支 更新远程分支列表
git remote update origin -p
-
合并个人分支上的多个commit为一个commit,再merge到主分支
多人合作开发过程典型场景:个人分支提交大量commit,偏离主分支较久,合并过程容易冲突且commit数目过多,不便review等。
想要的效果:针对此阶段性开发过程的merge,merge到主分支后仅存在一个commit
实现方式:
-
新分支diff
更新主分支并新拉取一个分支,借助diff工具,将个人分支的修改悉数挪到新分支,在新分支起一个commit,再merge到主分支;
-
git rebase
借助
git rebase -i
,将个人分支上的commit,squash为一个commit,再cherry-pick
到主分支;
-
git rebase
git rebase -i HEAD~3 ## rebase 3 latest commit
git rebase -i <startpoint> <endpoint> ## rebase range (startpoint,endpoint]
git rebase -i <commitHash> ## rebase range (commitHash,HEAD]
-i(--interactive)
:弹出交互式的界面进行编辑合并。
<startpoint>
<endpoint>
则指定了一个编辑区间(注:该区间左开右闭);不指定
<endpoint>
,则该区间的终点默认是当前分支HEAD
所指向的commit
。 指令解释(交互编辑时使用):p, pick = use commit r, reword = use commit, but edit the commit message e, edit = use commit, but stop for amending s, squash = use commit, but meld into previous commit f, fixup = like "squash", but discard this commit's log message x, exec = run command (the rest of the line) using shell d, drop = remove commit
git rebase 过程,可能会出现冲突;若出现则需要先解决冲突,再继续rebase。
冲突提示信息:git rebase -i resumeerror: could not apply ...
。
## 查看冲突
git status
## 解决冲突之后,本地提交
git add .
## rebase 继续
git rebase --continue
git cherry-pick
git cherry-pick <commitHash> ## cherry-pick commit
git cherry-pick <commitHash> <commitHash> <commitHash> ## multi cherry-pick commit
git cherry-pick <feature> ## cherry-pick latest commit on feature
git cherry-pick A..B ## cherry-pick latest continuous commit, range (A,B]
git cherry-pick A^..B ## cherry-pick latest continuous commit, range [A,B]
## 上面的命令可以转移从 A 到 B 的所有提交。它们必须按照正确的顺序放置:提交 A 必须早于提交 B,否则命令将失败,但不会报错。