bash脚本入门与Git统计实践:从基础到高级技巧

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本压缩包包含多个bash脚本实例,重点介绍 countGitLines.sh 脚本,它专门用于统计git项目中每个贡献者的代码行数。通过此脚本学习bash脚本的基础结构、编写技巧,以及如何与git版本控制系统集成,提升软件开发的自动化能力。实践项目将帮助你掌握在Linux和Unix系统中自动化任务的重要性,并理解如何通过脚本进行版本控制数据分析。
bashScripts:一些bash脚本

1. bash脚本基础结构介绍

1.1 脚本的组成元素

一个基本的bash脚本包含几个核心部分:shebang(即 #!/bin/bash ),脚本声明,变量声明,函数定义,以及主逻辑部分。shebang告诉系统使用哪个解释器来执行脚本。变量在脚本中存储临时数据,函数用来封装重复使用的代码块,而主逻辑部分则包含了执行的命令序列。

#!/bin/bash
# 这是一个注释

# 变量声明示例
name="John"
echo "Hello, $name"

# 函数定义示例
function greet {
    echo "Hi, $1"
}

# 主逻辑部分
greet "$name"

1.2 执行权限和运行方式

要运行一个bash脚本,首先需要确保脚本文件具有执行权限。可以通过 chmod +x script_name.sh 命令来赋予执行权限。然后通过命令 ./script_name.sh 直接运行脚本,或者使用 bash script_name.sh 命令在当前shell环境中执行。

1.3 脚本调试技巧

在脚本开发过程中,调试是不可或缺的环节。可以通过在脚本中添加 set -x 来开启调试模式,这样在执行脚本时会显示执行的命令和参数。此外,使用 set +x 可以关闭调试模式。正确使用条件判断和错误代码检查也是脚本调试的重要手段。

2. countGitLines.sh 脚本功能与实现

2.1 脚本目的和应用场景

2.1.1 代码行数统计的重要性

在软件开发领域,代码行数统计是一个常见的需求,它通常用于评估项目规模、估算开发时间、跟踪代码变更以及遵守编码标准。虽然代码行数并非衡量软件质量的唯一或最佳指标,但它提供了一种简单直观的项目状态快照。对于个体开发者而言,代码行数统计有助于开发者了解自己的开发进度,而项目经理和团队领导则可以利用这些数据进行项目管理和团队协作。

2.1.2 countGitLines.sh 的目标用户和使用场景

countGitLines.sh 脚本的主要目标用户是那些在使用Git进行版本控制的开发者。该脚本的设计旨在为用户提供一个简单、快速且可靠的方式来统计特定Git仓库或分支中的代码行数。它可以帮助开发者在以下几种场景中使用:

  • 周期性代码审查 :项目经理或代码审查者可以定期使用该脚本获取代码行数报告,从而评估项目的进展情况。
  • 项目健康检查 :开发者可以通过定期检查代码行数来评估自己是否偏离了项目的原始规划。
  • 绩效评估 :对于某些公司,代码行数可以作为绩效评估的一个参考指标,尽管不应成为决定性因素。

2.2 脚本设计与编写

2.2.1 理解脚本需求和功能边界

在开始编写 countGitLines.sh 脚本之前,首先需要明确脚本的需求和功能边界。该脚本的目的是提供一个简洁明了的统计结果,应该避免复杂性,保持易于理解和使用。功能边界需要涵盖:

  • 支持多行和单行统计。
  • 能够处理不同类型的文件,如 .c , .h , .py , .java 等。
  • 支持统计特定分支或整个仓库的代码行数。
  • 提供一个清晰的输出格式。

2.2.2 选择合适的脚本语言和工具集

选择合适的脚本语言对于开发一个有效且高效的工具至关重要。对于 countGitLines.sh 脚本,bash是一个自然的选择,因为大多数Linux和Unix系统默认安装了bash解释器。而且,bash对于系统级的操作和管道处理提供了良好的支持,这对于与Git命令行工具的集成非常关键。此外,利用现有的bash特性,如数组、条件语句和函数,可以实现清晰和高效的代码结构。

2.2.3 构建脚本的主要逻辑流程

接下来,我们需要构建脚本的主要逻辑流程:

  1. 解析输入参数以确定操作的范围(例如,是统计当前目录下的所有代码,还是特定分支或标签)。
  2. 使用 git ls-files 命令获取Git跟踪的文件列表。
  3. 遍历文件列表,并使用 wc -l 命令统计每个文件的行数。
  4. 根据文件类型过滤统计结果(如果需要)。
  5. 输出最终的代码行数统计结果。

2.3 脚本测试与部署

2.3.1 编写测试用例验证脚本功能

编写测试用例是确保脚本按预期工作的重要步骤。测试用例应包括:

  • 测试脚本在不同目录下的表现,包括空目录。
  • 测试脚本对不同类型的文件统计的准确性。
  • 测试脚本在不同Git仓库结构中的稳定性。
  • 检查脚本的输出格式是否如预期那样易于阅读。

2.3.2 脚本的部署和维护策略

一旦 countGitLines.sh 脚本开发完成并通过测试,下一步是部署。部署策略应包括:

  • 将脚本放置在所有用户的 PATH 环境变量中,以便可以全局访问。
  • 创建一个简单的文档,说明如何使用脚本以及它的功能。
  • 建立一个版本控制系统,如Git,以便跟踪脚本的变更和维护。
  • 定期检查用户反馈,对脚本进行更新和改进。
#!/bin/bash

# countGitLines.sh - Count the lines of code in a Git repository

function usage() {
  echo "Usage: $0 [branch_or_tag]"
  exit 1
}

# Check for input arguments
if [ $# -gt 1 ]; then
  usage
fi

# Set the target branch or tag if specified, otherwise default to the current branch
TARGET_BRANCH=${1:-$(git symbolic-ref --short HEAD)}

# Count lines of code
git ls-files | xargs wc -l | awk '{total += $1} END {print total}'

以上是一个简单的 countGitLines.sh 脚本示例,它利用bash脚本语言编写,并展示了如何实现统计当前Git分支的代码行数。在部署之前,应该编写相应的测试用例来确保脚本按预期工作。此外,还应该考虑如何将脚本集成到开发流程中,比如通过自动化测试或者集成到CI/CD流程中去。

在接下来的章节中,我们将继续深入探讨如何将Git版本控制系统与脚本集成,并探讨如何通过脚本实现错误处理和命令别名技巧。

3. Git版本控制系统基础与集成

3.1 Git基础概念回顾

Git作为目前最流行的分布式版本控制系统之一,它的出现极大地方便了软件开发中的源代码管理和版本控制。不管是个人开发者还是大型团队,Git都提供了许多强大的工具来提高开发的效率和协作的灵活性。

3.1.1 版本控制系统的必要性

版本控制系统能够记录源代码历史变化,协助开发者追踪和管理代码的变更。它也支持多人协作开发,让多个开发人员可以同时在一个项目上工作,而不会互相干扰。此外,版本控制系统还能够在出现错误时恢复到之前的版本,增强了项目的容错性。

3.1.2 Git的基本工作原理和术语

Git主要通过工作区、暂存区、本地仓库和远程仓库四个层次来保存项目文件的不同状态。核心概念包括提交(Commit)、分支(Branch)、合并(Merge)、快进(Fast-forward)等。例如,提交操作会把暂存区的内容保存到本地仓库中,而分支是Git用来同时处理多个版本的一种方式。

3.2 Git在脚本中的应用

将Git命令集成到脚本中,可以自动化执行许多版本控制任务,提高工作效率,并减少手动操作带来的错误。

3.2.1 Git命令的脚本化方法

大部分Git操作都可以通过命令行工具完成,利用bash脚本可以将这些命令组合起来,实现更复杂的操作逻辑。比如,可以编写一个脚本来自动化地创建新分支,推送至远程仓库,并进行代码的合并。

#!/bin/bash

# 创建并切换到新分支
git checkout -b new-feature

# 在新分支上进行一些提交操作...

# 将新分支推送到远程仓库
git push origin new-feature

# 代码审查通过后合并到主分支
git checkout master
git merge new-feature

3.2.2 脚本与Git仓库的交互方式

脚本与Git仓库的交互可以分为两种:一种是通过命令行直接调用Git命令;另一种是使用Git的钩子(Hook)机制。例如,通过在 .git/hooks 目录下编写脚本,可以实现在特定Git操作(如提交、推送)发生时自动执行。

3.3 脚本集成到Git工作流

将脚本集成到Git工作流程中,可以进一步提升工作效率,实现诸如自动化测试、代码质量检查等功能。

3.3.1 在Git钩子中使用脚本进行自动化任务

通过Git钩子,可以在特定事件发生时执行脚本。常见的如 pre-commit 钩子可以用来检查代码风格, pre-push 钩子可以用来运行自动化测试。

#!/bin/sh

# pre-commit 钩子脚本
if ! npm run lint; then
    echo "代码风格检查失败!"
    exit 1
fi

3.3.2 脚本化处理分支管理和代码合并流程

通过脚本,可以处理分支的创建、合并和删除等操作,确保分支管理的规范化。这对于大型团队协作尤其重要。

#!/bin/bash

# 创建新分支
git checkout -b feature-branch

# ... 在新分支上开发 ...

# 将新分支的更改合并到主分支
git checkout master
git merge feature-branch

脚本和Git的集成不仅提高了开发效率,也确保了版本控制流程的规范和自动化,有助于减少人为错误,并保持项目的结构清晰。随着对Git的深入理解和脚本的灵活运用,开发团队能够更好地适应敏捷开发模式,快速响应市场和项目需求的变化。

4. 错误处理与命令别名技巧

4.1 错误处理在脚本中的重要性

4.1.1 理解脚本中的潜在错误类型

在编写bash脚本时,潜在的错误类型可以从几个不同的角度来理解。第一,从语法的角度来看,脚本中可能会出现语法错误,比如拼写错误、缺少分号、括号不匹配等。这些错误通常会在脚本执行之前被shell检测到,并给出错误提示。第二,运行时错误可能在脚本执行过程中出现,例如无效的变量使用、权限问题或文件不存在。第三,逻辑错误可能导致脚本运行结果与预期不符,这更难以发现,并且可能需要仔细的调试和测试。

理解这些错误类型对于设计有效的错误处理机制至关重要,这样脚本才能在遇到错误时给出适当的反馈,而不会突然中断,或者更糟糕地,继续执行出错的逻辑。

4.1.2 错误处理的策略和方法

要实现有效的错误处理,可以采取以下策略:

  • 使用条件检查 :在脚本中使用条件语句来检查可能出错的操作,并在操作失败时执行适当的错误处理代码。
  • 捕捉信号 :捕捉并处理在脚本执行期间可能收到的信号,如SIGINT、SIGTERM等。
  • 定义退出策略 :通过 trap 命令来定义脚本在退出时需要执行的清理操作。
  • 明确错误消息 :在输出错误消息时,应提供足够的信息来帮助定位问题。
  • 使用错误码 :为脚本定义一个清晰的退出码集合,这样外部调用者可以根据脚本退出码判断脚本执行的最终状态。

以下是展示如何在脚本中实现错误处理的简单示例:

#!/bin/bash

# 捕捉退出信号
trap 'echo "脚本因为一个错误而终止了执行"; exit 1' SIGINT SIGTERM

# 模拟命令执行
command_to_run

# 如果命令失败,返回错误码
if [ $? -ne 0 ]; then
    echo "执行出错,命令失败"
    exit 1
fi

echo "脚本执行成功"
exit 0

在上述代码中, $? 变量存储了上一个命令的退出码。如果退出码不等于零(表示命令执行失败),则打印错误信息并退出。

4.2 别名技巧的使用

4.2.1 提高命令行效率的别名设置

命令别名是bash脚本和命令行环境中一个提升效率和易用性的功能。通过别名,用户可以简化常用的长命令或命令组合,将其缩短为一个容易记忆的名称。

例如,如果你发现自己频繁地输入 ls -lha 来查看文件的详细列表,你可以设置一个别名:

alias ll='ls -lha'

使用这个别名,你只需要输入 ll 就可以执行 ls -lha 命令。别名在 .bashrc .bash_profile 文件中定义后会持续有效,直到注销当前的shell会话。

4.2.2 别名与脚本的结合使用

除了在命令行中使用别名外,它们也可以在脚本内部使用,以提高脚本的可读性和易用性。考虑一个脚本,它经常需要执行一些复杂的命令序列,可以把这些命令序列设置为别名,然后在脚本中直接调用这些别名。

例如,脚本可能需要将当前目录中的 .log 文件压缩并上传到远程服务器:

alias compress_and_upload='tar -czf logs.tar.gz *.log && scp logs.tar.gz user@remotehost:/path/to/destination'
compress_and_upload

通过使用别名,脚本变得更短,更易于理解和维护。需要注意的是,通常不推荐在脚本中直接定义别名,因为这样做可能会与用户的环境设置产生冲突。更好的做法是,在脚本执行开始时检查是否存在某个别名,如果不存在,则临时定义一个。在脚本结束时,再清理掉这些临时定义的别名。

# 检查别名是否存在
if ! type compress_and_upload >/dev/null 2>&1; then
    alias compress_and_upload='tar -czf logs.tar.gz *.log && scp logs.tar.gz user@remotehost:/path/to/destination'
fi

compress_and_upload

# 脚本结束前清理别名
if ! type compress_and_upload >/dev/null 2>&1; then
    unalias compress_and_upload
fi

在上述脚本中, type 命令用于检查别名 compress_and_upload 是否已经被定义。如果没有定义,则定义它,并在脚本结束前使用 unalias 命令删除定义的别名,以防止影响后续的命令行会话或脚本运行。

5. 文本处理使用 awk sed

5.1 awk sed 的基本用法

5.1.1 文本处理工具的快速入门

文本处理是脚本编写中的一个重要环节,无论是日志分析、数据整理还是自动化报告生成,几乎都会涉及到对文本数据的处理。在Linux和Unix世界中, awk sed 是处理文本文件的两个强大工具,它们各有所长,能够高效地解决各种文本处理的需求。

sed (stream editor)是一个流编辑器,它可以对文本文件或输入流进行过滤和转换。 sed 的工作原理是逐行读取输入,对每一行进行处理,并输出处理后的内容。它支持正则表达式,并且有很强的文本替换能力,通常用于实现简单的文本转换和替换操作。

awk 则是一个编程语言,用于处理模式匹配的文本数据。它不仅拥有 sed 的文本处理能力,还能进行更复杂的文本分析和报告生成。 awk 有一个完整的编程语法,可以使用变量、条件语句、循环语句等编程结构,因此它可以完成更为复杂的数据处理任务。

5.1.2 awk sed 的核心功能和特性

sed 的核心功能包括但不限于:

  • 文本插入、删除、替换
  • 多种编辑命令,如 d 删除行, p 打印行, s 进行替换操作
  • 脚本编程,可以包含复杂的控制流和函数

awk 的核心功能包括但不限于:

  • 强大的文本模式匹配
  • 可以定制字段分隔符,将输入行拆分成多个字段
  • 进行复杂的统计和报告工作
  • 条件语句和循环语句支持
  • 支持数组操作

5.2 脚本中整合 awk sed

5.2.1 实际案例分析:如何在脚本中应用 awk sed

假设我们需要编写一个脚本来处理服务器上的日志文件,提取特定信息,并生成一个简单的报告。下面是一个示例脚本,其中整合了 awk sed

#!/bin/bash

LOG_FILE="/path/to/server.log"
REPORT_FILE="/path/to/report.txt"

# 使用`sed`进行文本预处理:删除不需要的行,并替换掉特定的字符
sed -e '/DEBUG/d' -e 's/ERROR/>ERROR/g' $LOG_FILE > temp.txt

# 使用`awk`进行数据处理和报告生成
awk -F "[ :]" '{print $4 " " $5}' temp.txt | sort | uniq -c | sort -nr > $REPORT_FILE

# 删除临时文件
rm temp.txt

在上述脚本中:

  • sed 命令首先删除了所有包含”DEBUG”的日志行,并将所有”ERROR”字符串替换成”>ERROR”,输出到一个临时文件 temp.txt
  • awk 命令读取临时文件,以空格和冒号为字段分隔符,提取第四个和第五个字段,并对这些数据进行排序和统计,最后将结果输出到报告文件 report.txt

5.2.2 复杂文本处理场景下的脚本优化策略

在处理更复杂的文本处理场景时,脚本的优化策略可能包括:

  • 分阶段处理 :像上面的例子一样,将处理流程分解为多个阶段,每个阶段负责一部分特定的处理,这样不仅可以使脚本更清晰,而且便于维护和优化。
  • 使用变量 :在 awk 中预先定义变量,可以提高脚本的灵活性和可读性。例如,可以定义字段分隔符为变量,这样在需要更改分隔符时,只需修改一处即可。
  • 优化命令参数 :使用 awk sed 的参数优化可以大大减少脚本的复杂度。例如, awk -v 选项可以让我们传递外部变量到 awk 的脚本中。
  • 测试和验证 :在复杂的文本处理中,每个处理步骤都应当进行测试以确保其正确性。可以使用 diff 命令来比较不同阶段的输出,确保数据流的正确。

优化策略的实施,不仅能够提高脚本的效率,而且可以在后期维护时,大大减少时间成本和出错概率。通过本节的介绍,我们可以了解到 awk sed 在复杂文本处理场景下的强大功能和潜力。

6. Git高级特性如分支管理

6.1 分支管理的基本概念

6.1.1 分支的作用和最佳实践

在软件开发过程中,分支管理是版本控制系统中的核心功能。分支允许开发者在不同的开发路径上工作,而不会相互干扰。这样做的好处是可以同时进行多个任务,如修复bug、开发新功能或尝试新的设计而不影响主项目。分支还支持特性分支工作流,其中每个新功能都在自己的分支上开发,开发完成后合并回主分支。

最佳实践要求我们合理命名分支,以反映它们的目的,并定期清理不再使用的分支。为了保证主分支的稳定性,通常会有一个预发布分支,其中的新功能在合并到主分支之前,会先在这里进行集成和测试。

6.1.2 常见的分支管理策略

在Git中,常见的分支管理策略包括特性分支工作流、Git流工作流和功能分支工作流。

  • 特性分支工作流:在主分支之外创建分支,完成后再合并回主分支。
  • Git流工作流:固定了几个特定分支,如主分支、开发分支和发布分支,遵循特定的合并模式。
  • 功能分支工作流:主分支和开发分支的混合模式,功能在特定分支上开发,但发布是在开发分支上进行。

每种策略都有其优势,适用于不同大小的团队和项目。合理选择分支策略,可以提高开发效率和代码质量。

6.2 脚本化分支管理流程

6.2.1 自动化创建和删除分支

自动化脚本可以帮助我们快速创建和删除分支。例如,我们想要创建一个新功能的分支,可以使用以下脚本:

#!/bin/bash
# 创建并切换到新分支
branch_name=$1
git checkout -b $branch_name

如果需要删除一个分支,可以使用以下命令:

#!/bin/bash
# 删除远程分支
branch_name=$1
git push origin --delete $branch_name
# 删除本地分支
git branch -D $branch_name

使用脚本自动化这一过程,不仅可以提高效率,还可以减少人为错误。

6.2.2 分支合并和冲突解决的自动化

Git允许自动化合并分支,但如果遇到冲突,Git无法自动解决。脚本可以检测冲突并提供解决方案,例如:

#!/bin/bash
# 自动合并分支
base_branch=$1
feature_branch=$2
git checkout $base_branch
git merge $feature_branch -m "Merge branch $feature_branch"

当合并失败时,我们可以编写脚本来帮助解决冲突,例如,自动接受基础分支的版本:

#!/bin/bash
# 自动解决合并冲突
git status | grep 'both modified:' | cut -d: -f1 | xargs git checkout --ours -- ||
    echo "Conflicts remain, please resolve manually."

自动化合并和冲突解决有助于提高开发效率,但需谨慎使用,确保合并后的代码质量。

6.2.3 分支管理流程的优化策略

分支管理流程优化可以通过脚本来提高效率。例如,通过脚本自动检查分支的合并状态,提前发现并解决潜在问题:

#!/bin/bash
# 检查分支的合并状态
branch_name=$1
git fetch --all --prune
git branch --list $branch_name

自动化脚本也可以用来维护分支的命名规则,以及在分支开发完成后进行标准化的代码审查。

通过这些策略,可以最大程度地减少手动分支管理的负担,保证项目在正确的轨道上推进。

7. 变量、数组、函数、流程控制和正则表达式

在编写复杂的bash脚本时,高级语法特性的使用至关重要。变量、数组、函数、流程控制和正则表达式是脚本开发中不可或缺的部分,它们提高了脚本的灵活性、可读性和可维护性。本章节将详细介绍如何在脚本中运用这些高级特性,并通过实例展示其在实际场景中的应用。

7.1 bash脚本中的高级语法特性

7.1.1 变量和数组的高级操作

变量在bash脚本中是存储信息的基本方式。要使用变量,你只需将其赋值并在后续引用即可。bash中的变量名可以是字母、数字或者下划线,但必须以字母或下划线开头。

# 变量赋值和引用
username="JohnDoe"
echo "Welcome, $username"

# 数组的声明和使用
fruits=("apple" "banana" "cherry")
echo "I like ${fruits[1]}"

数组在bash中是通过括号和空格来定义的。数组的索引从0开始,可以使用特殊变量 "${!array[@]}" 来获取所有键值。

7.1.2 函数定义和调用机制

函数在bash脚本中可以用来封装重复的代码块,提高脚本的模块化和可读性。函数的定义以关键字 function 开始,后跟函数名和一对圆括号及函数体。

# 定义函数
function print_username() {
  echo "Username: $1"
}

# 调用函数并传递参数
print_username "$username"

函数可以接受参数,参数通过位置索引访问($1, $2, …)。在函数中, $# 用于获取传递给函数的参数数量。

7.2 流程控制和正则表达式应用

7.2.1 流程控制结构的深入使用

流程控制结构如if语句、循环(for, while, until)和case语句提供了编程逻辑的手段。

# if语句示例
if [ "$username" = "JohnDoe" ]; then
  echo "You are logged in."
fi

# for循环示例
for fruit in "${fruits[@]}"; do
  echo "I like $fruit"
done

case语句是一种多分支选择结构,允许基于模式匹配来执行不同的代码块。

7.2.2 正则表达式在文本处理中的高级技巧

正则表达式是用于匹配字符串中字符组合的模式。在bash中,正则表达式可用于grep、sed和awk等文本处理工具。

# 使用正则表达式匹配模式
echo "apple banana cherry" | grep -Eo 'b(cherry|banana|apple)b'

正则表达式非常强大,特别是在处理复杂的文本模式匹配时,它能够极大地简化脚本的逻辑。

7.3 脚本的模块化和复用

7.3.1 构建可复用的代码模块

在编写脚本时,模块化可以提高代码的复用性。可以将常用的功能封装成函数或脚本,并在需要时调用。

# 创建一个模块化函数库文件
echo "function add_numbers() { echo \$(($1 + $2)); }" > utils.sh
chmod +x utils.sh

# 使用函数库文件中的函数
. utils.sh
add_numbers 5 10

7.3.2 通过脚本库提高开发效率

脚本库可以包含一组预先定义好的函数和操作,用户可以像使用任何其他shell命令一样使用这些预定义的功能。这不仅提高了开发效率,还促进了代码的一致性和可维护性。

# 调用脚本库中的函数
library_function() {
  echo "This function is provided by the script library."
}

# 调用
library_function

脚本的模块化和复用是提高工作效率和保证代码质量的关键。通过创建和使用脚本库,可以快速构建复杂的自动化解决方案,同时保持代码的整洁和组织性。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本压缩包包含多个bash脚本实例,重点介绍 countGitLines.sh 脚本,它专门用于统计git项目中每个贡献者的代码行数。通过此脚本学习bash脚本的基础结构、编写技巧,以及如何与git版本控制系统集成,提升软件开发的自动化能力。实践项目将帮助你掌握在Linux和Unix系统中自动化任务的重要性,并理解如何通过脚本进行版本控制数据分析。


本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif

Git指令的Shell脚本,能够快速便捷地管理Git库,包括添加修改、提交修改、显示库状态、推送到远程库、从远程库更新到本地、版本恢复等操作。 使用方法: 1. 在Linux系统中,将本文件放在Git库目录下,利用Shell运行本文件; 2.在windows系统中,需下载安装操作系统相对应的Git软件,并将本文件放在Git库目录下,双击即可运行。 运行示例: Please choose the first letter of options. [Add|Commit|Diff|Fetch|Exit|Help|Log|Push|User|Reset|Status]? h A: Add all changes to repository. C: Commit all changes to repository. D: Show differences between current version with HEAD->. E: Exit shell script. F: Fetch origin/master and merge. L: Show latest two-weeks logs of repository. P: Push commissions to origin/master. U: User command mode(Press ‘Enter’ to exit). R: Reset current version according version_id. S: Show status of repository. Please choose the first letter of options. [Add|Commit|Diff|Fetch|Exit|Help|Log|Push|User|Reset|Status]? s On branch master Your branch is up-to-date with 'origin/master'. Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) modified: Git.sh modified: PyNote/PyNote_2.md no changes added to commit (use "git add" and/or "git commit -a") Please choose the first letter of options. [Add|Commit|Diff|Fetch|Exit|Help|Log|Push|User|Reset|Status]? a On branch master Your branch is up-to-date with 'origin/master'. Changes to be committed: (use "git reset HEAD ..." to unstage) modified: Git.sh modified: PyNote/PyNote_2.md
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值