GIT常用命令与分支管理规范

64 阅读5分钟

仓库初始化&关联远程仓库

初始化本地仓库

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

image.png 查看记录的所有的操作,这条命令是可以找到每一步操作的hash码,方便数据找回。

git reflog

Image_20221205190625.png

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分支有更新,我需要同步到我的开发分支:

image.png merge合并

git checkout <开发分支>
git merge master

这会在 feature 分支中创建一个新的 merge commit,它将两个分支的历史联系在一起,请看如下所示的分支结构:

image.png

使用 merge 是很好的方式,因为它是一种 非破坏性的 操作。现有分支不会以任何方式被更改。 另一方面,这也意味着 feature 分支每次需要合并上游更改时,它都将产生一个额外的合并提交。如果master 提交非常活跃,这可能会严重污染你的 feature 分支历史记录。

rebase合并

git checkout <开发分支>
git rebase master

git rebase master这个命令是以master最新的提交为基点重新把开发分支新增的提交记录一个一个的cherry-pick到master进行合并,可能需要处理多次冲突,这会将整个 feature 分支移动到 master 分支的顶端,从而有效地整合了所有 master 分支上的提交。但是,与 merge 提交方式不同,rebase 通过为原始分支中的每个提交创建全新的 commits 来 重写 项目历史记录。

image.png

rebase 的主要好处是可以获得更清晰的项目历史。首先,它消除了 git merge 所需的不必要的合并提交;其次,正如你在上图中所看到的,rebase 会产生完美线性的项目历史记录,你可以在 feature分支上没有任何分叉的情况下一直追寻到项目的初始提交。 因为用了rebase合并,更改了历史记录,所以推送代码到远程的话是必须要强推的,在此可以使用这条命令:

git push --force-with-lease origin <分支名>

此命令会检查如果远端有其他人推送了新的提交,那么推送将被拒绝。

git merge和git rebase的正确使用

  • 合代码到公共分支的时候使用git merge,书写正确规范的merge commits留下记录,方便代码评审。
  • 合代码到个人分支的时候使用git rebase,可以不污染分支的历史提交记录,形成简介的线性记录。

分支管理策略

Git flow

image.png

  • 主要分支 (The main branch)

    • master
    • develop
  • 辅助分支 (Supporting branch)

    • feature branch (功能分支)
    • release branch (预发布分支)
    • hotfix branch (热修复分支)

master

首先,代码库应该有一个、且仅有一个主分支。master 分支的代码永远是稳定的,可以随时发布到生产环境。

develop

develop 分支用于日常开发,保存了开发过程中最新的代码。

当 develop 分支上的代码达到稳定,并且具备发版状态时,需要将 develop 的代码合并到 master,并且打一个带有发布版本号的 tag。

image.png

feature

  • 分支来源:develop
  • 合并到分支:develop
  • 分支命名约定:feature-*

image.png

release

  • 分支来源:develop
  • 合并到分支:develop,master
  • 分支命名约定:release-*

预发布分支,它是指发布正式版本之前,我们可能需要有一个预发布的版本测试,并且可以在上面做一些较小 bug 的修复。

预发布分支是从 develop 分支上分出来的,预发布结束以后,必须合并进 develop 和 master 分支。