eb本地脚本 常用 Git 使用技巧,收藏了~
只有在遇到问题的时候,才体会到技巧带来的好处!
常见企业工作流程
主要介绍,企业中常用的 Git 工作流程!
Git Flow
Github Flow
Gitlab Flow
日常使用最佳实践
总结日常工作中应该遵循的 Git 使用方式和方法!
常用命令汇总整理
日常使用只要记住 6 个命令就可以了。
# 工作区 -> 暂存区$ git add # 暂存区 -> 本地仓库$ git commit -m "some info"# 本地仓库 -> 远程仓库$ git push origin master # 本地master分支推送到远程origin仓库
# 工作区 <- 暂存区
$ git checkout -- # 暂存区文件内容覆盖工作区文件内容
# 暂存区 <- 本地仓库
$ git reset HEAD # 本地仓库文件内容覆盖暂存区文件内容
# 本地仓库 <- 远程仓库
$ git clone # 克隆远程仓库
$ git fetch upstream master # 拉取远程代码到本地但不应用在当前分支
$ git pull upstream master # 拉取远程代码到本地但应用在当前分支
$ git pull --rebase upstream master # 如果平时使用rebase合并代码则加上
# 工作区 <- 本地仓库
$ git reset # 本地仓库覆盖到工作区(保存回退文件内容修改)
$ git reset --mixed # 本地仓库覆盖到工作区(保存回退文件内容修改)
$ git reset --soft # 本地仓库覆盖到工作区(保留修改并加到暂存区)
$ git reset --hard # 本地仓库覆盖到工作区(不保留修改直接删除掉)
配置实用参数选项
虽然配置比较简单,但是非常有用!另外,关注公众号Java技术栈,在后台回复:面试,可以获取我整理的 Java 系列面试题和答案,非常齐全。
# 用户信息
$ git config --global user.name "your_name"
$ git config --global user.email "your_email"
# 文本编辑器
$ git config --global core.editor "nvim"
# 分页器
$ git config --global core.pager "more"
# 别名
$ git config --global alias.gs "git status"
# 纠错
$ git config --global help.autocorrect 1
# 不加--global参数的话,则为个人配置
$ git config --list
$ git config user.name
$ git config user.name "your_name"
# 如果在项目中设置,则保存在.git/config文件里面
$ cat .git/config
[user]
name = "your_name"
......
到底什么时候使用 merge 操作,什么时候使用 rebase 操作呢?
使用 merge 操作 - Python 中的 Requests 库在使用
支持使用 merge 的开发者,他们认为仓库的提交历史就是记录实际发生过什么,它是针对于历史的一个文档,本身其实是有价值的,我们不应该随意修改。我们改变历史的话,就相当于使用“谎言”来掩盖实际发生过的事情eb本地脚本,而这些痕迹是应该被保留的。可能,这样并不是很好。
# 3rd的两个分支的commit修改相同内容
* 62a322d - (HEAD->master) Merge branch 'hotfix3' into master
|\
| * 6fa8f4a - (hotfix3) 3rd commit in hotfix3
* | 548d681 - 3rd commit in master
|/
* 6ba4a08 - 2nd commit
* 22afcc1 - 1st commit
使用 rebase 操作 - Python 中的 Django 库在使用
支持使用 rebase 的开发者,他们认为提交历史是项目过程中发生过的事情,需要项目的主干非常的干净。而使用 merge 操作会生成一个 merge 的 commit 对象,让提交历史多了一些非常多余的内容。
当我们后期,使用 log 命令参看提交历史的话,会发现主干的提交历史非常的尴尬。比如,同样的修改内容重复提交了两次,这显然是分支合并导致的问题。
# 3rd的两个分支的commit修改相同内容
* 697167e - (HEAD -> master, hotfix) 3rd commit
* 6ba4a08 - 2nd commit (2 minutes ago)
* 22afcc1 - 1st commit (3 minutes ago)
两者的使用原则
总的原则就是,只对尚未推送或分享给其他人的本地修改执行变基操作清理历史辅助卡盟,从不对已经推送到仓库的提交记录执行变基操作,这样,你才可能享受到两种方式带来的便利。
更新仓库提交历史
Git 提供了一些工具,可以帮助我们完善版本库中的提交内容,比如:
合并多个 commit 提交记录
日常开发中,我们为了完成一个功能或者特性,提交很多个 commit 记录。但是在最后,提交 PR 之前,一般情况下,我们是应该整理下这些提交记录的。有些 commit 需要合并起来,或者需要将其删除掉,等等。
# 调整最近五次的提交记录
$ git rebase -i HEAD~5
$ git rebase -i 5af4zd35 # 往前第六次的commit值
reword c2aeb6e 3rd commit
squash 25a3122 4th commit
pick 5d36f1d 5th commit
fixup bd5d32f 6th commit
drop 581e96d 7th commit
# 查看提交历史记录
$ git log
* ce813eb - (HEAD -> master) 5th commit
* aa2f043 - 3rd commit -> modified
* 6c5418f - 2nd commit
* c8f7dea - 1st commit
say.txt$ git add -u# 改变当前最新一次提交记录$ git commit --amend# 改变且息不改变提交信$ git commit --amend --no-edit# 改变当前最新一次提交记录并修改信息$ git commit --amend -m "some_info"# 不使用分页器$ git --no-pager log --oneline -19e1e0eb (HEAD -> master) say file取消多个 commit 中的部分提交我们开发了一个功能,而在上线的时候,产品经理说这个功能的部分特性已经不需要了,即相关特性的提交记录和内容就可以忽略/删除掉了。# 回滚操作(可多次执行回滚操作)# 彻底上次提交记录;也可是PR的提交记录# 默认会生成一个类型为reverts的新commit对象$ git revert 3zj5sldl[4] 合并某些特定的 commit 提交我们不希望合并整个分支,而是需要合并该分支的某些提交记录就可以了。bash# 摘樱桃$ git cherry-pick -x z562e23d使用引用日志记录" data-itemshowtype="0" tab="innerlink" data-linktype="2"># 不使用分页器
$ git --no-pager log --oneline -1
d5e96d9 (HEAD -> master) say file
# 改变提交信息并加入暂存区
$ echo "hello" > say.txt
$ git add -u
# 改变当前最新一次提交记录
$ git commit --amend
# 改变且息不改变提交信
$ git commit --amend --no-edit
# 改变当前最新一次提交记录并修改信息
$ git commit --amend -m "some_info"
# 不使用分页器
$ git --no-pager log --oneline -1
9e1e0eb (HEAD -> master) say file
say.txt$ git add -u# 改变当前最新一次提交记录$ git commit --amend# 改变且息不改变提交信$ git commit --amend --no-edit# 改变当前最新一次提交记录并修改信息$ git commit --amend -m "some_info"# 不使用分页器$ git --no-pager log --oneline -19e1e0eb (HEAD -> master) say file取消多个 commit 中的部分提交我们开发了一个功能,而在上线的时候,产品经理说这个功能的部分特性已经不需要了,即相关特性的提交记录和内容就可以忽略/删除掉了。# 回滚操作(可多次执行回滚操作)# 彻底上次提交记录;也可是PR的提交记录# 默认会生成一个类型为reverts的新commit对象$ git revert 3zj5sldl[4] 合并某些特定的 commit 提交我们不希望合并整个分支,而是需要合并该分支的某些提交记录就可以了。bash# 摘樱桃$ git cherry-pick -x z562e23d使用引用日志记录" data-itemshowtype="0" tab="innerlink" data-linktype="2"># 回滚操作(可多次执行回滚操作)
# 彻底上次提交记录;也可是PR的提交记录
# 默认会生成一个类型为reverts的新commit对象
$ git revert 3zj5sldl
[4] 合并某些特定的 commit 提交
我们不希望合并整个分支,而是需要合并该分支的某些提交记录就可以了。
bash
# 摘樱桃
$ git cherry-pick -x z562e23d
如何找回我们丢失的内容和记录?
我们之前说过,使用下面命令回退内容、强制推送代码、删除本地分支,都是非常危险的操作,因为重置之后我们就没有办法在找到之前的修改内容了。
# 回退
$ git reset --hard
# 推送
$ git push origin master -f
# 分支
$ git branch -D
其实 Git 给我们留了一个后门,就是使用 relflog 命令来找回之前的内容,只不过是相对来说麻烦一些。而原理也很简答,就是在我们使用 Git 命令操作仓库的时候,Git 偷偷地帮助我们把所有的操作记录了下来。
# 查看日志记录
$ git --no-pager log --oneline -1
4bc8703 (HEAD -> master) hhhh
# 回退到上次提交
$ git reset --hard HEAD~1
# 查看引用日志记录
$ git reflog
6a89f1b (HEAD -> master) HEAD@{0}: reset: moving to HEAD~1
4bc8703 HEAD@{1}: commit (amend): hhhh
# 找回内容
$ git cherry-pick 4bc8703
批量修改历史提交
批量修改历史提交虽然不常用,但是理解的话可以省下很多时间!
之前我们学习到的命令都是针对于一个或者多个 commit 提交信息进行修改的,如果我们需要全局修改历史提交呢?当然,Git 中也是支持全局修改历史提交的,比如全局修改邮箱地址,或者将一个文件从全局历史中删除或修改。