Git 常用命令和 Git 团队使用规范指南

图片[1]-Git 常用命令和 Git 团队使用规范指南-我的运维技术站

前言

在 2005 年的某一天,Linux 之父 Linus Torvalds 发布了他的又一个里程碑作品——Git。它的出现改变了软件开发流程,大大地提高了开发流畅度,直到现在仍十分流行,完全没有衰退的迹象。其实一般情况下,只需要掌握 git 的几个常用命令即可,但是在使用的过程中难免会遇到各种复杂的需求,这时候经常需要搜索,非常麻烦,故总结了一下自己平常会用到的 git 操作。本文根据团队实践记录 Git 入门指南和 Git 常用命令,文章中不仅记录了 Git 的搭建和使用教程,还参考了大量 Git 团队使用规范上的经验,希望大家可以结合自己团队的实际应用场景让 Git 协作优雅的落地。

基础必读

Git是什么?

对于这个问题,我们可以看一下官方文档:


Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.
Git是一个免费和开源的分布式版本控制系统,致力于高效和快速的处理任何小或者大的项目

Git中的几个概念

工作区、暂存区和版本库

了解Git中的工作区和版本库很重要:

  • 工作区:简单来说,我们当前电脑能够看到的目录。
  • 版本库:使用过Git都知道里面有一个隐藏的目录 .git,这便是我们所说的版本库,其中,版本库又分为暂存区和分支。git add 命令将文件从工作目录提交到暂存区,git commit 命令将文件从暂存区提交到git仓库。
图片[2]-Git 常用命令和 Git 团队使用规范指南-我的运维技术站
Git的过程
文件状态

如果我们想看一下工作区和暂存区文件的状态,可以使用命令 git status,比如我最近学习的Flutter项目:

wangjiedeMacBook-Pro:flu_pro wangjie$ git status
warning: unable to access '/Users/wangjie/.config/git/attributes': Permission denied
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   lib/main.dart

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   lib/HelloWorld.dart

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        .metadata
        //... 省略

其中:

  • Changes to be committed:暂存区的文件。
  • Changes not staged for commit:工作区的文件,还未保存到暂存区。
  • Untracked files:指那些第一次创建,还没有加入版本更新的文件。
分支
  • master:稳定版本代码,不能在master 直接开发。
  • hotfix:基于master,并最后合并到master和develop。生命周期较短,用了修复bug或小粒度修改发布。
  • develop: 开发中代码,一般从feature branches、release 或hotfix合并过来。
  • release:用于发布测试代码,基于develop,修改后又合并回develop。稳定后合并进入master并打tag,生命周期很短,只是为了发布。不同版本的release不一样,比如release/1.0.0、release/2.0.0。
  • feature:功能feature开发的分支,基于develop,各个开发者自己维护,最终合并进入develop。一般按开发的功能命名,也可以按开发者名字命名。

Git commit 编写规范

每次提交,Commit message 都包括三个部分:Header,Body 和 Footer。

<type>(<scope>): <subject>
// 空一行
<body>
// 空一行
<footer>

其中,Header 是必需的,Body 和 Footer 可以省略。

不管是哪一个部分,任何一行都不得超过72个字符(或100个字符)。这是为了避免自动换行影响美观。

Header
Header部分只有一行,包括三个字段:type(必需)、scope(可选)和subject(必需)。

type

type用于说明 commit 的类别,只允许使用下面7个标识。

  • feat:新功能(feature)
  • fix:修补bug
  • docs:文档(documentation)
  • style: 格式(不影响代码运行的变动)
  • refactor:重构(即不是新增功能,也不是修改bug的代码变动)
  • test:增加测试
  • chore:构建过程或辅助工具的变动

如果type为feat和fix,则该 commit 将肯定出现在 Change log 之中。其他情况(docs、chore、style、refactor、test)由你决定,要不要放入 Change log,建议是不要。

scope

scope用于说明 commit 影响的范围,比如数据层、控制层、视图层等等,视项目不同而不同。

subject

subject是 commit 目的的简短描述,不超过50个字符。

  • 以动词开头,使用第一人称现在时,比如change,而不是changed或changes
  • 第一个字母小写
  • 结尾不加句号(.)
Body

Body 部分是对本次 commit 的详细描述,可以分成多行。下面是一个范例。

More detailed explanatory text, if necessary. Wrap it to
about 72 characters or so.

Further paragraphs come after blank lines.

Bullet points are okay, too
Use a hanging indent

有两个注意点。

(1)使用第一人称现在时,比如使用change而不是changed或changes。

(2)应该说明代码变动的动机,以及与以前行为的对比

Footer

Footer部分一般只用于两种情况

不兼容变动

如果当前代码与上一个版本不兼容,则 Footer 部分以BREAKING CHANGE开头,后面是对变动的描述、以及变动理由和迁移方法。

BREAKING CHANGE: isolate scope bindings definition has changed.

To migrate the code follow the example below:

Before:

scope: {
myAttr: ‘attribute’,
}

After:

scope: {
myAttr: ‘@’,
}

The removed inject wasn’t generaly useful for directives so there should be no code using it.

关闭Issue

如果本次commit是针对某个Issue,可以在Footer部分以Close开头,后面用#号标识对应的Issue号码

Revert

还有一种特殊情况,如果当前 commit 用于撤销以前的 commit,则必须以revert:开头,后面跟着被撤销 Commit 的 Header。

revert: feat(pencil): add ‘graphiteWidth’ option

This reverts commit 667ecc1654a317a13331b17617d973392f415f02.

。

Body部分的格式是固定的,必须写成This reverts commit .,其中的hash是被撤销 commit 的 SHA 标识符。

如果当前 commit 与被撤销的 commit,在同一个发布(release)里面,那么它们都不会出现在 Change log 里面。如果两者在不同的发布,那么当前 commit,会出现在 Change log 的Reverts小标题下面。

git 服务端

服务端搭建 Git 很简单,有更多需求不妨试试 Gogs 和 Gitlab

# 安装 git
sudo apt-get install git
yum install git

# 创建一个 git 用户,用来运行 git 服务
sudo adduser git

# 创建证书使用公钥免密码登录(可选)
ssh-keygen -t rsa
vi ~/.ssh/authorized_keys

# 初始化 Git 仓库
sudo git init --bare sample.git
sudo chown -R git:git sample.git

# 禁用 shell 登录
vi /etc/passwd
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

# 在客户端上克隆远程仓库
git clone git@server:/srv/sample.git

git 客户端

Git 客户端可以按个人习惯来选择,遵守团队协作中的 Git 规范标准才是更重要的

Git – https://git-scm.com/
TortoiseGit – https://tortoisegit.org/
SourceTree – https://www.sourcetreeapp.com/

# 以最基本的 Git 命令行为例,先下载 Git
https://git-scm.com/download/

# 配置 git 提交用户名和邮箱,定义别名方便区分
git config --global user.name "你的姓名"
git config --global user.email "you@example.com"

# 克隆仓库
git clone cap@172.28.70.243:/cap/cap.git

$ git clone cap@172.28.70.243:/cap/cap.git
Cloning into 'cap'...
warning: You appear to have cloned an empty repository.
Checking connectivity... done.

# 测试推送
touch README
git add README
git commit -m "add readme"
git push origin master

Counting objects: 3, done.
Writing objects: 100% (3/3), 199 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To cap@172.28.70.243:/cap/cap.git
 * [new branch]      master -> master

git 常用的操作

符号约定

  • <xxx> 自定义内容
  • [xxx] 可选内容
  • [<xxx>] 自定义可选内容
# 初始设置
git config --global user.name "< 用户名 & gt;" # 设置用户名
git config --global user.email "< 电子邮件 & gt;" # 设置电子邮件

# 本地操作
git add [-i] # 保存更新,-i 为逐个确认。
git status # 检查更新。
git commit [-a] -m "< 更新说明 & gt;" # 提交更新,-a 为包含内容修改和增删,-m 为说明信息,也可以使用 -am。

# 远端操作
git clone <git 地址 & gt; # 克隆到本地。
git fetch # 远端抓取。
git merge # 与本地当前分支合并。
git pull [< 远端别名 & gt;] [< 远端 branch>] # 抓取并合并, 相当于第 2、3 步
git push [-f] [< 远端别名 & gt;] [< 远端 branch>] # 推送到远端,-f 为强制覆盖
git remote add < 别名 & gt; <git 地址 & gt; # 设置远端别名
git remote [-v] # 列出远端,-v 为详细信息
git remote show < 远端别名 & gt; # 查看远端信息
git remote rename < 远端别名 & gt; < 新远端别名 & gt; # 重命名远端
git remote rm < 远端别名 & gt; # 删除远端
git remote update [< 远端别名 & gt;] # 更新分支列表

# 分支相关
git branch [-r] [-a] # 列出分支,-r 远端 ,-a 全部
git branch < 分支名 & gt; # 新建分支
git branch -b < 分支名 & gt; # 新建并切换分支
git branch -d < 分支名 & gt; # 删除分支
git checkout < 分支名 & gt; # 切换到分支
git checkout -b < 本地 branch> [-t < 远端别名 & gt;/< 远端分支 & gt;] #-b 新建本地分支并切换到分支, -t 绑定远端分支
git merge < 分支名 & gt; # 合并某分支到当前分支

Git 常用命令

图片[3]-Git 常用命令和 Git 团队使用规范指南-我的运维技术站
  • workspace: 本地的工作目录。(记作 A)
  • index:缓存区域,临时保存本地改动。(记作 B)
  • local repository: 本地仓库,只想最后一次提交 HEAD。(记作 C)
  • remote repository:远程仓库。(记作 D)

以下所有的命令的功能说明,都采用上述的标记的 A、B、C、D 的方式来阐述。

# 初始化 
git init // 创建
git clone /path/to/repository // 检出
git config --global user.email "you@example.com" // 配置 email
git config --global user.name "Name" // 配置用户名

# 操作
git add <file> // 文件添加,A → B
git add . // 所有文件添加,A → B

git commit -m "代码提交信息" // 文件提交,B → C
git commit --amend // 与上次 commit 合并, *B → C

git push origin master // 推送至 master 分支, C → D
git pull // 更新本地仓库至最新改动, D → A
git fetch // 抓取远程仓库更新, D → C

git log // 查看提交记录
git status // 查看修改状态
git diff// 查看详细修改内容
git show// 显示某次提交的内容

# 撤销操作
git reset <file>// 某个文件索引会回滚到最后一次提交, C → B
git reset// 索引会回滚到最后一次提交, C → B
git reset --hard // 索引会回滚到最后一次提交, C → B → A

git checkout // 从 index 复制到 workspace, B → A
git checkout -- files // 文件从 index 复制到 workspace, B → A
git checkout HEAD -- files // 文件从 < span class="built_in">local repository 复制到 workspace, C → A

# 分支相关
git checkout -b branch_name // 创建名叫“branch_name” 的分支,并切换过去 
git checkout master // 切换回主分支
git branch -d branch_name // 删除名叫“branch_name” 的分支
git push origin branch_name // 推送分支到远端仓库
git merge branch_name // 合并分支 branch_name 到当前分支(如 master)
git rebase // 衍合,线性化的自动, D → A

# 冲突处理
git diff // 对比 workspace 与 index
git diff HEAD // 对于 workspace 与最后一次 commit
git diff <source_branch> <target_branch> // 对比差异
git add <filename> // 修改完冲突,需要 add 以标记合并成功

# 其他
gitk // 开灯图形化 git
git config color.ui true // 彩色的 git 输出
git config format.pretty oneline // 显示历史记录时,每个提交的信息只显示一行
git add -i // 交互式添加文件到暂存区

git 命令一览

命令解析
git init初始化本地 git 仓库(创建新仓库)
git config –global user.name “xxx”配置用户名
git config –global user.email “xxx@xxx.com配置邮件
git config –global color.ui truegit status 等命令自动着色
git config –global –unset http.proxyremove proxy configuration on git
git clone git+ssh://git@192.168.53.168/VT.gitclone 远程仓库
git status查看当前版本状态(是否修改)
git add xyz添加 xyz 文件至 index
git add .增加当前子目录下所有更改过的文件至 index
git commit -m ‘xxx’提交
git commit –amend -m ‘xxx’合并上一次提交(用于反复修改)
git commit -am ‘xxx’将 add 和 commit 合为一步
git rm xxx删除 index 中的文件
git rm -r *递归删除
git log显示提交日志
git log -1显示 1 行日志 -n 为 n 行
git log –stat显示提交日志及相关变动文件
git show dfb02e6xxxx显示某个提交的详细内容
git show dfb02可只用 commitid 的前几位
git show HEAD显示 HEAD 提交日志
git show HEAD^显示 HEAD 的父(上一个版本)的提交日志 为上两个版本 5 为上 5 个版本
git tag显示已存在的 tag
git tag -a v2.0 -m ‘xxx’增加 v2.0 的 tag
git show v2.0显示 v2.0 的日志及详细内容
git log v2.0显示 v2.0 的日志
git diff显示所有未添加至 index 的变更
git diff –cached显示所有已添加 index 但还未 commit 的变更
git diff HEAD^比较与上一个版本的差异
git diff HEAD — ./lib比较与 HEAD 版本 lib 目录的差异
git diff origin/master..master比较远程分支 master 上有本地分支 master 上没有的
git diff origin/master..master –stat只显示差异的文件,不显示具体内容
git remote add origin git+ssh://git@192.168.53.168/VT.git增加远程定义(用于 push/pull/fetch)
git branch显示本地分支
git branch –contains 50089显示包含提交 50089 的分支
git branch -a显示所有分支
git branch -r显示所有原创分支
git branch –merged显示所有已合并到当前分支的分支
git branch –no-merged显示所有未合并到当前分支的分支
git branch -m master master_copy本地分支改名
git checkout -b master_copy从当前分支创建新分支 master_copy 并检出
git checkout -b master master_copy上面的完整版
git checkout features/performance检出已存在的 features/performance 分支
git checkout –track hotfixes/BJVEP933检出远程分支 hotfixes/BJVEP933 并创建本地跟踪分支
git checkout v2.0检出版本 v2.0
git checkout -b devel origin/develop从远程分支 develop 创建新本地分支 devel 并检出
git checkout — README检出 head 版本的 README 文件(可用于修改错误回退)
git merge origin/master合并远程 master 分支至当前分支
git cherry-pick ff44785404a8e合并提交 ff44785404a8e 的修改
git push origin master将当前分支 push 到远程 master 分支
git push origin :hotfixes/BJVEP933删除远程仓库的 hotfixes/BJVEP933 分支
git push –tags把所有 tag 推送到远程仓库
git fetch获取所有远程分支(不更新本地分支,另需 merge)
git fetch –prune获取所有原创分支并清除服务器上已删掉的分支
git pull origin master获取远程分支 master 并 merge 到当前分支
git mv README README2重命名文件 README 为 README2
git reset –hard HEAD将当前版本重置为 HEAD(通常用于 merge 失败回退)
git branch -d hotfixes/BJVEP933删除分支 hotfixes/BJVEP933(本分支修改已合并到其他分支)
git branch -D hotfixes/BJVEP933强制删除分支 hotfixes/BJVEP933
git ls-files列出 git index 包含的文件
git show-branch图示当前分支历史
git show-branch –all图示所有分支历史
git whatchanged显示提交历史对应的文件修改
git revert dfb02e6e4f2f7b573337763e5c0013802e392818撤销提交 dfb02e6e4f2f7b573337763e5c0013802e392818
git ls-tree HEAD内部命令:显示某个 git 对象
git rev-parse v2.0内部命令:显示某个 ref 对于的 SHA1 HASH
git reflog显示所有提交,包括孤立节点
git show master@{yesterday}显示 master 分支昨天的状态
git log –pretty=format:’%h %s’ –graph图示提交日志
git stash暂存当前修改,将所有至为 HEAD 状态
git stash list查看所有暂存
git stash show -p stash@{0}参考第一次暂存
git stash apply stash@{0}应用第一次暂存
git grep “delete from”文件中搜索文本 “delete from”
.gitignore

Some common .gitignore configurations

# Compiled source #
###################
*.com
*.class
*.dll
*.exe
*.o
*.so

# Packages #
############
# it's better to unpack these files and commit the raw source
# git has its own built in compression methods
*.7z
*.dmg
*.gz
*.iso
*.jar
*.rar
*.tar
*.zip

# Logs and databases #
######################
*.log
*.sql
*.sqlite

# OS generated files #
######################
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
如何提交 PR

项目富哥运维提交pull request

首先请核对下本地 git config 配置的用户名和邮箱与你 github 上的注册用户和邮箱一致,否则即使 pull request 被接受,贡献者列表中也看不到自己的名字,设置命令:

$ git config --global user.email "you@example.com"
$ git config --global user.name "Your Name"
  • 登陆 github,在本项目页面点击 fork 到自己仓库
  • clone 自己的仓库到本地:git clone https://github.com/xxx/92fuge.git
  • 在 master 分支添加原始仓库为上游分支:git remote add upstream https://github.com/xxx/92fuge.git
  • 在本地新建开发分支:git checkout -b dev
  • 在开发分支修改代码并提交:git add ., git commit -am ‘xx 变更说明’
  • 切换至 master 分支,同步原始仓库:git checkout master, git pull upstream master
  • 切换至 dev 分支,合并本地 master 分支(已经和原始仓库同步),可能需要解冲突:git checkout dev, git merge master
  • 提交本地 dev 分支到自己的远程 dev 仓库:git push origin dev
  • 在 github 自己仓库页面,点击 Compare & pull request 给原始仓库发 pull request 请求
  • a. 等待原作者回复(接受 / 拒绝)
------本页内容已结束,喜欢请分享------

感谢您的来访,获取更多精彩文章请收藏本站。

© 版权声明
THE END
喜欢就支持一下吧
点赞6527赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称 夸夸
夸夸
还有吗!没看够!
表情代码图片

    暂无评论内容