config
# 配置用户名
git config --global user.name username
# 配置邮箱
git config --global user.email username@gmail.com
# 查看配置列表
git config --list
# 配置默认master分支远程主机(很少用)
git config branch.master.remote origin
git config branch.master.merge refs/heads/master
获取代码
git pull <远程主机名> <远程分支名>:<本地分支名>
# 将远程项目克隆到本地
git clone https://gitee.com/dtstack_dev_0/taier.git
# origin是远程主机名,可以通过git branch -a或者git remote -v查看
# master远程分支,localbranch是指定本地分支
git pull origin master:localbranch
# 如果不指定分支,默认远程分支是master,默认本地分支是当前分支
git pull origin
# 如果不指定远程主机名,默认使用的远程主机名是origin
git pull
git pull执行了2个命令:
- git fetch从远程主机获取代码
- git merge FETCH_HEAD将获取到的代码合并到当前分支
基本操作
# 添加到缓存区
git add filename
# 提交代码
git commit -m '提交内容注释'
git commit -a -m '从新提交代码注释'
# 回退版本,reset比较复杂和危险,使用请了解更多知识,知道自己是在执行什么操作
git reset head^
# 丢弃文件修改
git restore filename
# 暂存代码
git stash
push
git push 远程主机 本地分支:远程分支
git push origin master:master
# 远程分支和本地分支相同可以省略
git push origin master
# 如果远程主机是origin,可以省略
git push master
# 默认推送当前分支,所以master也可以省略
# 前提是有相关联的远程分支
git push
# 使用git clone会自动关联
# 如果没有关联,例如本地创建分支要推送到远程,可以使用--set-upstream参数来关联
# 下面的命令就是创建远程分支b1与将本地当前分支关联(远程分支和本地分支最好同名,方便管理)
git push origin --set-upstream b1
# 推送到远程分支,如果没有远程分支则创建
git push origin feature/newbusiness
分支管理
# 切换到dev分支,如果dev分支不存在则创建
git checkout -b dev
# 拉取dev的最新代码,要先关联分支
git pull
# 推送分支
git push
# 如果远程没有分支,通过--set-upstream创建关联
git branch --set-upstream-to=origin/dev dev
删除分支
# 删除本地分支
git branch -d branchName
# -D是强制删除,即使分支还没有合并,所以尽量使用-d参数
git branch -D branchName
# 删除远程分支,--delete等价于-d
git push origin --delete <BranchName>
git push origin --delete dev
# 删除远程端关联
git branch -r -d origin/branch1
# 删除所有分支
git branch | xargs git branch -d
# 删除包含指定字符的分支
git branch | grep 'dev*' | xargs git branch -d
merge
# 先同步代码
git pull
# 切换到dev分支,如果不存在则创建
git checkout -b dev
# 在dev上开发代码完成,切换回master
git checkout master
# 将dev分支代码合并到master
git merge dev
merge基本操作比较简单,稍微麻烦的点的是解决冲突问题。
merge的基本原理:找出dev分支和master分支的最近共同祖先commit点CA,将dev最新一次commit CB和master最新一次commit CC合并后生成一个新的commit CD,有冲突的话需要解决冲突。将以上两个分支dev和master上的所有提交点CA以后的按照提交时间的先后顺序进行依次放到master分支上。
上面的命令就是最常用最基本的命令了,下面是一些其他常见的命令
remote
# 关联两个仓库: github 和码云
git remote add origin github-url
git remote add gitee gitee-url
# 查看远程仓库的数量(简单信息)
git remote -v
# 查看某个远程仓库的具体信息
git remote show origin
help
git help <verb>
git <verb> --help
man git-<verb>
tag
tag的主要作用是快速定位到对应的版本,一般是release的时候时有,有点像书签。
# 查看所有tag
git tag
# 创建tag
git tag v1.2.3
# 查看标签信息
git show v1.2.3
# tagName指定标签名字,-m参数添加标签说明
git tag -a tagName -m "优化登录版本"
# 可以为指定的commit打tag
git tag -a v1.2 3146215f -m "复杂注册页面"
# 将tag推送到远程
git push origin v1.2.3
# 删除分支
git tag -d v1.2.3
rebase
- rebase只是为了使提交历史干净整洁,你完全可以只使用merge
- 不要用rebase对任何已经提交到公共仓库中的commit进行修改
rebase有人叫它重放,某种程度上很贴切,因为这是rebase的一个重要功能,但是,我更喜欢rebase的本意,重建,就是对commit的重建。
rebase最常用也最实用的功能:
- 合并提交(commit),虽然rebase能重新编辑commit但是更多常用的是合并commit
- 重放提交
rebase很强大、很灵活,但是最常用的方式,可以按下面的流程操作;
# 切换到master分支
git checkout master
# 拉取代码
git pull
# 创建并切换到dev分支
git checkout -b dev
# 进行开发提交
git commit -m ''
git commit -m ''
# 合并提交-i进入交互模式,这一步非必须
# 执行这一步可以避免git rebase master解决多次冲突,并且可以将多次提交合并为一次
# rebase很灵活,不一定非要合并为一次,一些关键commit也可以保留
git rebase -i HEAD~n
# 将其他人这段时间提交的commit重放到dev分支(或者说将dev的commit重放到master?)
# dev上的commitId会改变
# git rebase upstream(默认当前分支上游分支) branch(默认head)
# 等价于:git rebase master dev
# 有冲突解决冲突,然后git add,再git rebase --continue
git rebase master
# 切换到master
git checkout master
# 将dev合并到master,肯定是ff(fast foward,快进模式)
git merge dev
# 将修改推送到远程仓库
git push
简单的来说,就是先使用git rebase -i 精简提交信息,然后使用git branch upstream head找到分支开始分叉(diverged)的位置,然后把分叉的部分重新放在上游分支的最后。
git merge是按commit时间顺序排列合并,git rebase都放在最后。