jjzjj

二、Git本地仓库基本操作——创建Git仓库、提交更新或删除文件

luobeihai 2023-06-30 原文

1. 创建本地工作仓库

创建本地工作仓库有两种方法:

  1. git init 在本地初始化一个git仓库
  2. git clone 直接克隆一个远程的git仓库

方法一

我们在其中一个目录下,点击鼠标右键,然后启动git bash。输入下面命令:

git init

这条命令即可创建一个git仓库。

然后再当前目录下,会创建一个 .git 的隐藏文件夹:

里面包含了一个git初始化仓库所必须的文件(每个文件的作用暂时还没研究),如下:

方法二

使用git clone命令。

git clone 远程仓库地址

# 可以重命名克隆的远程仓库名称
git clone 远程仓库地址 新的仓库名称

2. 新建、修改文件后提交更新到本地仓库

上一篇文章介绍到,git 的工作过程其实都是围绕下面这幅图进行的:

所以,我们初始化了仓库之后,根据这幅图进行git的一些基本命令操作。

Git 文件的4种状态:

  1. untracked。未跟踪,表示文件不受git管理,我们新建的文件就是处于 这种状态。
  2. staged。已暂存,表示已对修改的文件做了标记,使之包含在下次要提交的文件的跟踪列表中changes to be committed
  3. committed。已提交,表示文件已经被提交到本地仓库committed
  4. modified。已修改,表示文件内容已被修改,但没有做标记changes not staged for commit

下面我们就实例演示下这4种工作状态。

2.1 查看工作目录下的文件状态

git status

git status 命令用于查看仓库当前状态,显示有变更的文件。

示例

当工作区文件数量很多时,可以使用 -s 参数输出简短的信息,即:git status -s

2.2 添加一个新的文件到暂存区

git add <文件名或者目录>
# 文件名支持通配符*的形式,比如说 *.c 就是表示工作区中所有的c文件
# 如果是目录的话,那么会递归跟踪该目录下的所有文件

该命令相当于把工作区的文件,添加到了暂存区,其实就是相当于git跟踪了这个文件。

  • 文件名支持通配符*的形式,比如说 *.c 就是表示工作区中所有的c文件
  • 如果是目录的话,那么会递归跟踪该目录下的所有文件
  • git add . 相当于就是当前目录的全部文件都添加到暂存区。 . 表示当前目录, … 表示上一级目录

示例

2.3 提交暂存区的文件到本地仓库

使用 git add 命令跟踪了文件之后,就可以提交更新到本地仓库了,使用如下命令:

git commit

注意:

  1. 提交前已经设置好了用户名和邮箱
  2. 该命令只是将暂存区的内容提交到仓库,我们可以在提交前使用 git status 命令查看是否有改变没有添加到暂存区。

我们调用这条命令的时候,都会打开 vim 编辑器,然后用户可以输入提交更改的信息,然后保存更改信息就可以提交成功了。

但是如果我们不熟悉vim编辑器,而且提交的信息又比较简单的话,我们可以输入一条字符串来保存更改的信息。

# 提交整个暂存区的文件
git commit -m "<提交信息>"

#只提交暂存区指定的文件
git commit [file1] [file2] ... -m "<提交信息>"

示例

每次提交其实相当于记录了一次快照,后面我们在任何时候都可以退回到本次状态。

2.4 修改文件

我们把上面新建的 test.c 文件进行修改。

vim test.c

vim编辑器打开文件(或者使用其他编辑器都可以),修改内容:

然后回到vim命令状态,保存退出即可。

2.5 添加改动的文件到暂存区

前面已经使用过 git add 命令添加文件到暂存区了,但是那个文件是新建的文件,还没有跟踪的。

我们修改之后,查看文件状态:

暂存修改的文件也是 git add 命令,只是前面是新的文件添加到暂存相当于跟踪了这个文件。现在是已经跟踪的文件被修改了,然后添加到暂存区。

2.6 比较文件在暂存区和工作区的差异

git diff

该命令可以比较在工作区(也就是我们的工作目录)中已经被修改的文件,和已经写入暂存区的文件,他们之间的差异。

git status 命令其实可以列出哪些文件被修改了,但是不能列出文件修改的内容,而 git diff 是可以的。

  • 尚未缓存的改动:git diff ,其实就是现在是暂存区和工作区之间的差异。
  • 查看已缓存的改动: git diff --cached 或 git diff --staged ,显示暂存区和最近一次提交(commit)的差异。
  • 查看已缓存的与未缓存的所有改动:git diff HEAD
  • 显示摘要而非整个 diff:git diff --stat

我们把上面的 test.c 文件进行修改,然后保存退出:

查看文件状态,和改动:

2.7 跳过暂存区直接提交更新

我们对文件更改后,一般需要先使用 git add 命令,先添加到暂存区,然后才能使用 git commit 命令提交更新到本地仓库的。

每次都经过 git add 这一步太过繁琐,所以我们可以使用 -a 参数来直接跳过这一步,直接提交更新,命令如下:

# 提交整个暂存区的文件
git commit -a -m "<提交信息>"

#只提交暂存区指定的文件
git commit [file1] [file2] ... -a -m "<提交信息>"

其实就是多了 -a 参数,下面看看示例图:

2.8 将文件从暂存区或工作区中删除

如果只是简单地从工作目录中手工删除文件,运行 git status 时就会在 Changes not staged for commit 的提示。

所以我们必须使用 git 的命令进行删除文件。

1、将文件从暂存区和工作区中一起删除:

git rm <文件名>

该命令相当于把源文件也删除了。

2、如果想把文件从暂存区域移除,但仍然保留源文件。换句话说,仅是从跟踪清单中删除,使用 –cached 选项即可:

git rm --cached <文件名>

3、删除目录

该命令和上面两条命令一样,指不定多了 -r 参数,表示删除目录。该命令会递归删除本目录下的所有文件和子目录。

git rm –r <目录名>

示例

有关二、Git本地仓库基本操作——创建Git仓库、提交更新或删除文件的更多相关文章

  1. ruby - 如何在 Ruby 中顺序创建 PI - 2

    出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

  2. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  3. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  4. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  5. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  6. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  7. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  8. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  9. ruby - 如何使用 RSpec::Core::RakeTask 创建 RSpec Rake 任务? - 2

    如何使用RSpec::Core::RakeTask初始化RSpecRake任务?require'rspec/core/rake_task'RSpec::Core::RakeTask.newdo|t|#whatdoIputinhere?endInitialize函数记录在http://rubydoc.info/github/rspec/rspec-core/RSpec/Core/RakeTask#initialize-instance_method没有很好的记录;它只是说:-(RakeTask)initialize(*args,&task_block)AnewinstanceofRake

  10. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

随机推荐