本文记录Git工作中常用的基本命令,备忘。
1. Git初始化配置
# 配置用户信息
git config --global user.name "your name"
git config --global user.email "your email"
#配置别名,提交效率
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
# push推送凭证存储
git config --global credential.helper store
# 查看配置
git config --list
设置的自定义配置,都存储在~/.gitconfig文件中。
2. 本地工作基本命令
# 比较工作目录中当前文件和暂存区域快照的差异
# 只显示尚未暂存的改动,而不是自上次提交以来所做的所有改动
git diff
#查看已暂存的将要添加到下次提交里的内容
git diff --staged
# 取消暂存的文件
git reset HEAD <file>
# 撤销对文件的修改(会丢失本地的修改)
git checkout -- <file>
# 漏提交文件,或者修改上次提交注释
git commit --amend
3. 分支
HEAD
指针,指向当前所在的本地分支, 可以理解为当前分支的别名。
切换分支后,HEAD
指针指向就会改变。
创建一个新的分支,可以理解为创建了一个可以移动的新的指针。
# 创建分支,本质在当前提交对象上创建了一个指针
git branch <branchname>
# 查看各个分支当前所指的对象
git log --oneline --decorate
# 切换分支
(切换分支后,HEAD指针指向就会改变)
git checkout <branchname>
# 创建并切换分支
git checkout -b <branchname>
# 删除分支
git branch -d <branchname>
# 检查每一个分支的最后一次提交
git branch -v
# 检查尚未合并到当前分支的分支
git branch --no-merged
# 检查已经合并到当前分支的分支
git branch --merged
修复线上问题分支合并场景
- 从master拉出bug_fix分支: git checkout -b bug_fix
- 在bug_fix分支修复线上bug,确保修复OK
- bug_fix分支合并到master
- git checkout master
- git merge bug_fix
- bug_fix分支合并到dev(可选步骤)
- git checkout dev
- git merge bug_fix
- 删除bug_fix分支: git branch -d bug_fix
正常情况下,将bug_fix分支合到master并不可能产生冲突,合并是 fast-forward合并, 因为只是将master指针向前推移。
将bug_fix分支合并到dev分支, 如果dev分支此时有新的提交,那么合并就是recursive合并, 并且可能产生冲突。
4. 变基
变基(rebase) 是为了解决不同分支合并产生一次新的提交的问题。
假如将dev_1 分支 通过变基的方式何如到dev分支,进行如下操作:
git checkout dev_1
git rebase dev
git checkout dev
git merge dev_1
变基是将一系列提交按照原有次序依次应用到另一分支上,而合并是把最终结果合在一起
5. 远程仓库操作
#添加远程仓库
git remote add origin https://github.com/dchangjian/learning_git1.git
#推送至远程仓库, -u参数是为了把本地的master和远程master关联起来,以后操作就可以简化
git push -u origin master
git push origin master:master
#推送本地分支到一个命名不相同的远程分支
git push origin dev:dev1
# 查看远程分支
git remote -v
# 显示当前处于哪个分支,哪些分支不在本地
git remote show origin
# 将远程修改拉取到本地,包括新的远程分支
git fetch
# 删除远程分支
git remote rm <>
6. 标签
Git标签分为轻量标签(lightweight) 和 附注标签(annotated)。
轻量标签是特定提交的引用,附注标签是存储在数据库中的一个完整对象。
# 查看所有标签
git tag
# 查看具体的标签信息
git show <tagname>
# 添加 -a 选项创建附注标签
git tag -a <tagname> -m <comment>
# 对过去的提交打标签
git log --pretty=oneline
git tag -a <tagname> <commit_id>
# 推送标签到远程分支
git push origin <tagname>
7. gitignore规则
有些目录或文件是没必要提交的,比如日志文件,开发IDE产生的一些文件等。这时需要配置.gitignore将其忽略。
一些基本的忽略规则如下:
# 忽略 build目录下的所有文件和目录,注意只忽略.gitignore文件所在目录下的build目录
/build
# 只要是mytest目录下的文件,都会被忽略
mytest/
# 忽略 doc目录下的*.txt, 不会递归忽略
doc/*.txt
# 递归忽略doc目录下的*.txt
doc/**/*.txt
8. 常见问题汇总
-
git本地重命名文件夹大小写并提交到远程仓库
比如提交java代码时,不小心把java包名大写并提交了, 这是不符合java编程规范的。你需要这么做:- 先将需要重命名的整个文件夹备份并修改成正确的名字(大小写修改)
- 执行命令:
git rm -r <foldername>
- 将刚刚备份的文件夹又拷贝回原来的目录
- 执行命令:
git add .
- 执行命令:
git commit -m "xxx"
- 执行命令:
git push origin <branchname>
对于文件本身重命名大小写的情况,操作步骤类似: 备份-> git 本地删除-> 拷贝回来->git 添加到暂存区->git提交->git push
-
.gitignore文件更新后按照新规则应该忽略的文件还在远程服务器怎么办?
这种情况也比较常见,比如java工程的build目录不小心提交到远程分支了,你发现这是没必要提交的,然后更新.gitignore文件,将build目录忽略,但是此时build目录已经被git管理了,所以忽略是无效的。
按照如下方法完成:- 进入本地git仓库根目录,执行命令:
git rm -r --cached .
- 执行命令:
git add .
- 执行命令:
git commit -m "xxx"
- 执行命令:
git push origin <branchname>
- 进入本地git仓库根目录,执行命令: