仓库初始化&关联远程仓库
初始化本地仓库
git init
git remote add origin <远程仓库地址>
commit
正常提交
git commit -m 'msg'
修改最后一次commit的备注信息
git commit --amend
跳过验证提交
git commit --no-verify
git commit -n
log
查看提交记录
git log
git log --oneline
查看记录的所有的操作,这条命令是可以找到每一步操作的hash码,方便数据找回。
git reflog
checkout
切换本地指定分支, 如果本地没有会自动关联远程分支。
git checkout <分支名>
在本地基于当前分支新建一个分支
git checkout -b <分支名>
快速切换到上一个分支
git checkout -
放弃指定文件修改
git checkout –- filename
放弃所有文件修改
git checkout .
branch
查看本地分支列表
git branch
查看远程分支列表
git branch -r
查看所有分支列表
git branch -a
创建本地分支
git branch <分支名>
建立本地分支与远程分支的关联联系
git branch --set-upstream-to=origin/<远程分支名> <本地分支名>
git branch -u origin/<远程分支名> <本地分支名>
查看所有本地分支与远程分支的关联关系
git branch -vv
重命名分支
git branch -m <原分支名> <新分支名>
删除分支
git branch -d <分支名>
git branch -D <分支名> // 强制删除
git branch -d -r <分支名> // 删除远程分支
stash
将本地没提交的内容进行缓存并从当前分支暂时移除。
缓存更改
git stash save -m 'msg'
如果更改中有新增的文件
git stash push -u -m 'msg'
查看缓存列表
git stash list
恢复指定缓存
git stash apply stash@{$num}
将列表最新的内容拿出来出来应用到当前分支上,并删除该缓存
git stash pop
git重命名文件
文件重命名必须用命令,如果在vscode上直接用鼠标右键去重命名的话git会识别成你把原文件删了再新建一个新的文件,这样无法看出来更改内容的。
git mv <原文件名> <新文件名>
reset
将当前最新的提交记录的更改内容重置到工作区
git reset --mixed
版本回退
git reset --hard <hash>
cherry-pick
把某一个提交复制到别的分支上,公共文件的修改可以单独提交一个记录,方便提取到别的分支使用。
git cherry-pick <hash>
merge & rebase
两者都是合并分支的操作,下面我们来看看两者的区别 比如说我从master切出了一个开发分支开发,然后master分支有更新,我需要同步到我的开发分支:
merge合并
git checkout <开发分支>
git merge master
这会在 feature 分支中创建一个新的 merge commit,它将两个分支的历史联系在一起,请看如下所示的分支结构:
使用 merge 是很好的方式,因为它是一种 非破坏性的 操作。现有分支不会以任何方式被更改。
另一方面,这也意味着 feature 分支每次需要合并上游更改时,它都将产生一个额外的合并提交。如果master 提交非常活跃,这可能会严重污染你的 feature 分支历史记录。
rebase合并
git checkout <开发分支>
git rebase master
git rebase master这个命令是以master最新的提交为基点重新把开发分支新增的提交记录一个一个的cherry-pick到master进行合并,可能需要处理多次冲突,这会将整个 feature 分支移动到 master 分支的顶端,从而有效地整合了所有 master 分支上的提交。但是,与 merge 提交方式不同,rebase 通过为原始分支中的每个提交创建全新的 commits 来 重写 项目历史记录。
rebase 的主要好处是可以获得更清晰的项目历史。首先,它消除了 git merge 所需的不必要的合并提交;其次,正如你在上图中所看到的,rebase 会产生完美线性的项目历史记录,你可以在 feature分支上没有任何分叉的情况下一直追寻到项目的初始提交。
因为用了rebase合并,更改了历史记录,所以推送代码到远程的话是必须要强推的,在此可以使用这条命令:
git push --force-with-lease origin <分支名>
此命令会检查如果远端有其他人推送了新的提交,那么推送将被拒绝。
git merge和git rebase的正确使用
- 合代码到公共分支的时候使用git merge,书写正确规范的merge commits留下记录,方便代码评审。
- 合代码到个人分支的时候使用git rebase,可以不污染分支的历史提交记录,形成简介的线性记录。
分支管理策略
Git flow
-
主要分支 (The main branch)
- master
- develop
-
辅助分支 (Supporting branch)
- feature branch (功能分支)
- release branch (预发布分支)
- hotfix branch (热修复分支)
master
首先,代码库应该有一个、且仅有一个主分支。master 分支的代码永远是稳定的,可以随时发布到生产环境。
develop
develop 分支用于日常开发,保存了开发过程中最新的代码。
当 develop 分支上的代码达到稳定,并且具备发版状态时,需要将 develop 的代码合并到 master,并且打一个带有发布版本号的 tag。
feature
- 分支来源:develop
- 合并到分支:develop
- 分支命名约定:feature-*
release
- 分支来源:develop
- 合并到分支:develop,master
- 分支命名约定:release-*
预发布分支,它是指发布正式版本之前,我们可能需要有一个预发布的版本测试,并且可以在上面做一些较小 bug 的修复。
预发布分支是从 develop 分支上分出来的,预发布结束以后,必须合并进 develop 和 master 分支。