本地仓库命令
1.历史 log/relog
commit后才算一个历史版本,仅add不算
1.1 log
# 从最新提交开始,显示所有提交记录(hash,作者信息,标题和时间)
git log
# 输出概要日志,等于git log --pretty=oneline --abbrev-commitgit log --oneline
# 查看
git log [--reverse|--oneline]
## --reverse 按时间正序排列的信息
## --oneline 每个提交在一行内显示
## --graph 提供类似 GUI 工具的 log 展示
## --all 展示所有
## --grep 过滤 --grep='homepage'
## --author 显示某用户的提交 --author="username"
## n 指定最近几个提交可带 -/+ 数字 git log n 5
## -p 显示某文件的所有修改 git log -p <file>
git log --oneline -5
git log --graph --date=relative --pretty=tformat:'%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%an %ad)%Creset'
查找 Commits 和更改
# 通过 commit 信息查找 (所有分支)
git log --all --grep='<search term>'
# 通过 commit 信息查找 (包含 reflog)
git log -g --grep='<search term>'
# 通过更新的内容查找
git log -S '<search term>'
# 通过日期范围查找
git log --after='DEC 15 2019' --until='JAN 10 2020'
1.2 reflog
git reflog 记录所有行为,包括 rebase,merge, reset
当不小心硬回滚或变基错误,都可找到commit,然后回滚。只在本地有用。
git reflog
## reflog查看本地以往版本号
git reflog -5
2.搜索 grep
# 从当前目录的所有文件中查找文本内容
git grep "Hello"
# 在某一版本中搜索文本
git grep "Hello" v2.5
3.分支 brand
3.1 初探
在学习Git分支前,先从git的目录树入手。
$ tree -a .git
.git
├── ......
├── HEAD
└── refs
├── heads
│ └── master
├── remotes
│ └── origin
│ └── HEAD
└── tags
refs记录当前分支的引用信息,含本地、远程分支,标签。
heads记录本地所有分支,remotes和HEAD一样,指向对应某远程分支。
cat .git/refs/heads/mastera16b5382a9b646a...
hash值是commit节点hash值。HEAD存储当前在哪个本地分支。查看内容:
cat HEADref: refs/heads/master
在本地master上。通过 git branch
创建其他分支。
注:本地分支未被跟踪的文件,所有分支均可看到该文件,且其他分支都可修改提交,但commit后就只能由commit分支查看
3.2 创建
master分支需先commit才能生成master分支,否则报错:fatal: Not a valid object name: 'master'.
## 创建分支
git branch feature/dev
## 本地关联远程分支
git branch --set-upstream-to=origin/xxx
git branch --set-upstream-to origin xxx
3.3 查看
## 查看分支
git branch [-r][-a]
## -r 查看远程分支
## -a 查看远程全部分支,白色表本地有,红色仅远程存在
3.4 修改
## 修改分支
git branch [-M old new]
## 修改分支名称
3.5 删除
## 删除分支
git branch [-d branchName]
# 删除远程仓库不存在的分支
git fetch -p
# 移除所有包含 `greenkeeper` 的分支
git fetch -p && git branch --remote | fgrep greenkeeper | sed 's/^.\{9\}//' | xargs git push origin --delete
3.6 对比
## 查看我的分支和 master 的不同
git diff master..my-branch
3.7 切换 checkout/branch
可基于分支,提交,标签切换到对应记录。一般用来热修复或老版本加新特性。
# 切换到分支
git checkout feature/dev
# 创建并切换分支,等价 git branch dev && git checkout dev
git checkout -b dev
git checkout --track origin/feature-test
# 放弃单文件修改,注意不要忘记中间的"--",不写就成了检出分支了!
git checkout -- filepathname
# 放弃所有文件修改
git checkout .
# 跳到之前分支
git checkout -
# 切换到其他分支并查看分支信息
git branch -vv* feature/dev a16b538
#加入到代码库中,观察objects目录变化 feature/wuya
#a16b538 加入到代码库中,观察objects目录变化 master
#a16b538 加入到代码库中,观察objects目录变化
分支当前的指针指向最近一次commit节点。谁创建的分支,就沿用谁指针。
注:未被放入代码库的文件在分支切换时被抛弃,造成严重后果。
3.8 合并 merge/rebase
分支合并有:merge和rebase两种。两者都从一个分支获取并合并到当前分支。
3.8.1 merge
merge:自动创建新commit,如果冲突,需修改后重新commit。
每次都记录详细的commit,但commit频繁时,分支较乱。
3.4.8.2 rebase
rebase:找公共节点,直接合并前commit历史,也叫变基。得到简洁的分支历史,去掉merge commit。但如果合并出问题,无痕迹,不好定位。
- git rebase --abort:放弃合并,回到rebase前状态。
- git rebase --continue:结合"git add 文件"命令,一步步地解决冲突。
- git rebase --skip:引起冲突的commits丢弃掉。
例1:引用网上归纳的git rebase工作流:
git rebase while(存在冲突) {
#找到当前冲突文件,编辑解决冲突
git status # 显示工作路径下已修改的文件
git add -u
git rebase --continueif( git rebase --abort )
break;
}
注:最好不在公共分支用rebase,如果前后基本没人动分支,推荐rebase。
例2:想要 rebase 最近 3 个提交:
-
git rebase -i HEAD~3
-
保留第一行 pick,剩余提交替换为 squash 或 s
-
清理提交日志并保存
pick 64d26a1
feat: add index.jss 45f0259
fix: update index.jss 8b15b0a
fix: typo in index.js
git 提交分支
git add .git commit --fixup HEAD~1 #或用哈希值(fed14a4c)
git rebase -i HEAD~3 --autosquash #保存并退出文件(VI输:wq)
rebase 时在每个提交上执行命令
如果特性多,一个分支有多个提交。或测试失败,希望找到导致测试失败的提交。用 rebase --exec 命令在每个提交上执行命令。
# 在最近3个提交上运行 `npm test` 命令
git rebase HEAD~3 --exec "npm test"
3.9 分支
3.9.1分支合并
# 将dev合并到master
git checkout master
git merge dev
git merge --no-ff branchName
合并完后,删除dev分支
#删除dev分支时,注意当前所在的分支不能是dev分支
git branch -d dev #本地删除分支dev
git branch -D issues1234 #本地强删分支issues1234
git push origin :issues1234 #推到远程
3.9.2部分合并
从多个分支挑取部分 commit 合并到同个地方。
类似变基,挑的 commit 若无冲突则追加。有就中断,解决后 --continue
git cherry-pick commit-sha1
git cherry-pick master~4 master~2
git cherry-pick startGitSha1..endGitSha1
3.9.3总结
常从master创建新分支,具体操作如下:
# master创建新分支:
git checkout master
git checkout -b issues1234 #从master分支创建issues1234分支
git push origin issues1234
git add ..
git commit -m "***"
git push origin issues1234
注意:将本地分支branch1推到远端的branch2操作步骤:
git push origin branch1:branch2
总结
- master - 主分支,用于发布生产环境,且只能从其他分支合并,不能修改。
- develop - 主开发分支,用于部署到测试环境(FAT),包含发布下个 release 代码,主要从其他分支合并,如 feature 分支。
- feature - 主要开发新功能,开发完成后合并 develop 分支进入下个 release。一旦该需求上线,便将其删除。
- release - 当发布新 release 时,基于 Develop 分支创建 release 分支,完成 release 后,合并到 master 和 develop 分支。
- hotfix - 在 master 发现新 Bug ,需创建 hotfix, 完成 hotfix 后合并回 master 和 develop 分支,hotfix 的改动进入下个 release