简单了解Git(GitHub)版本控制系统

简单了解Git(GitHub)版本控制系统

  • Git和GitHub是干什么的
  • Git的基本操作
  • 作业✖版本控制

 

Git和GitHub是干什么的

首先,Git和GitHub不完全是一个东西。在我没用过Git之前,总是能听到“大佬”们在讨论GitHub云云,但从来没搞清楚过这些东西究竟是什么。

那我们先来看看官方定义:

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是一个免费的、开源的分布式版本控制系统,旨在快速高效地处理从小型到非常大的项目。

GitHub is a code hosting platform for version control and collaboration. It lets you and others work together on projects from anywhere.

//GitHub是一个用于版本控制和协作的代码托管平台。它可以让你和其他人在任何地方一起工作。

说人话,Git是辅助你在本地写代码的版本控制工具,GitHub是辅助一群人联网写代码的版本控制工具。打个不是很恰当的比方,就像魔兽争霸与网络对战平台,本地硬盘与百度网盘,Porn与PornHub一样。

版本控制系统是什么东西?

版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。

就好比改论文,很多人为了保存记录,会把正在修改的论文多另存为几个副本:初稿,初稿(1),终稿,终稿-副本,终稿-副本(1),终稿-副本(2),终稿-副本(3),终稿-副本(3)(1)······

过了一周,你想找回被修改的内容,但是已经记不清删除前保存在哪个文件里了,只好一个一个文件去找,真麻烦;看着一堆乱七八糟的文件,想保留最新的一个,然后把其他的删掉,又怕哪天会用上,还不敢删,真郁闷。

引入版本控制系统后,你在本地仓库做的每一次修改信息(详细内容/修改时间/作者等)都会这个系统被记录下来,不需要另存为各种副本,就可方便地恢复某个历史版本;如果有共同作者的参与,版本控制系统还允许你们在各自的家中并行工作,一起对这个项目进行编辑。

 

再深入一点?

你的本地仓库由 git 维护的三棵“树”组成。第一个是你的工作目录(working directory),它持有实际文件;第二个是缓存区(Index),它像个缓存区域,临时保存你的改动;最后是 HEAD,指向你最近一次提交后的结果。

你的文件根据提交阶段的不同,也会有几个状态:

  • 未跟踪(untracked):untracked表示文件虽然在git仓库可以管理到的文件夹里,但是并没有被仓库收录管理。
  • 未修改(unmodified):unmodified表示修改了文件,但还没提交到git仓库中。
  • 已修改(modified):modified表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的版本中。
  • 已暂存(staged):staged表示数据已经安全地保存在git仓库中。

下面这张文件生命周期的图,非常建议各位小白保存!!!时刻看一眼,从此使用git再也不是一团乱麻。

听不懂了?好吧,关于原理这部分内容建议翻到底部查看参考文献,看不懂的话emmmm,建议多看几遍,谁不是这样过来的呢

都听懂了?妙啊,那就进入实战环节吧!

 

Git的基本操作

通过 git --help 命令可以查看Git命令用法及常用的Git命令列表:

These are common Git commands used in various situations:

start a working area (see also: git help tutorial)
   clone             Clone a repository into a new directory
   init              Create an empty Git repository or reinitialize an existing one

work on the current change (see also: git help everyday)
   add               Add file contents to the index
   mv                Move or rename a file, a directory, or a symlink
   restore           Restore working tree files
   rm                Remove files from the working tree and from the index
   sparse-checkout   Initialize and modify the sparse-checkout

examine the history and state (see also: git help revisions)
   bisect            Use binary search to find the commit that introduced a bug
   diff              Show changes between commits, commit and working tree, etc
   grep              Print lines matching a pattern
   log               Show commit logs
   show              Show various types of objects
   status            Show the working tree status

grow, mark and tweak your common history
   branch            List, create, or delete branches
   commit            Record changes to the repository
   merge             Join two or more development histories together
   rebase            Reapply commits on top of another base tip
   reset             Reset current HEAD to the specified state
   switch            Switch branches
   tag               Create, list, delete or verify a tag object signed with GPG

collaborate (see also: git help workflows)
   fetch             Download objects and refs from another repository
   pull              Fetch from and integrate with another repository or a local branc
   push              Update remote refs along with associated objects

下面以我用版本控制系统来管理我《人工智能》课程作业的实例,来演示Git/GitHub的基本操作

 

作业✖Git/GitHub版本控制

1. 新建本地仓库

创建ai_hw文件夹并进入,使用 git init 命令创建仓库,这以后就是我写作业的文件夹啦:

此时,ai_hw这个文件夹便成为了仓库,我们可以看到文件夹中多出了一个用于管理仓库的.git的隐藏文件夹,.git怎么管理仓库的细节见参考文献哈:

 

2. 写作业

2.1 我们先写一份名为"README.md"的文件,此时使用 git status 可以看到,文件当前处于"untracked"的状态(啥意思?回去看看让你保存的图):

 

2.2 使用 git add README.md 将文件添加到暂存区:

 

2.3 使用 git commit -m "add README.md" 将暂存区的文件提交至仓库,并添加提交信息"add README.md",此时README.md文件的修改信息就被保存到git系统中:

 

2.4 这时我使用上述add和commit命令对我的作业(README.md)做了多次修改并提交,如果想要返回到某个特定的版本,我可以使用 git log 查看我的提交信息:

 

假设要回到最开始的版本,我可以使用 git reset --hard HEAD^^^ 这里"^"符号的数量代表往前回退几个版本,或者 git reset --hard 507454c 或 git reset --hard 507454cbb320cc0de8fae01b8e403c181b2f09cf (图上每个commit后面跟的那一串数,commit-id是提交时根据提交信息计算的哈希值,用于唯一代表一次提交 。)

 

回到最初的状态并不代表之前的修改信息都被删除了,使用 git reflog 可以看到当前 HEAD 之后的提交记录,并再次使用 git reset --hard 命令”回到未来“:

 

 2.5 借助上述的各种命令,我的作业写完了也保存好了。但是我并不想将我作业中的word文档(docx文件)上传到GitHub,我们可以创建".gitignore"文件写入规则,不再跟踪仓库内的所有docx文件:

将这些内容提交,我的作业也大功告成了。

 

3 提交远程仓库

3.1 打开GitHub,点击右上角的+号创建仓库,输入以下三条命令将本地仓库push到远程仓库:

 

 打开仓库地址,可以看到作业内容已经成功上传:

 

3 多人协作

3.1 这个时候,小明同学说我的README写的太简单了,打算给我加点内容,于是他首先使用 git clone 命令将我的仓库下载到本地:

 

并创造了一个分支newbranch专门负责修改README文件,可以看到,当前工作区已经切换到newbranch:

 

小明在完成修改后,决定将做的改动push到远程仓库:

 

我们可以从log记录中看到,小明同学创造了newbranch分支,对README.md做了改动,又将分支并回主分支main:

 

3.2 帮我修改完README后,小明家里突然来了亲戚,然而小明的电脑没有关,熊孩子可高兴了劈里啪啦一顿敲,虽然没有文件受到影响,但是在log里弄出来了好多没有意义的commit:

 

如何消除这些没有用的commit呢?这里小明使用了 git rebase -i c8a972d (熊孩子修改前的commit-id),于是弹出了下面的页面:

 

小明将熊孩子的提交信息删除,输入 git rebase --continue 保存修改,提交push之后,查看log,一切归与平静~

(这里GitHub上的主分支没有进行修改,如果有修改的话,需要进行冲突处理再提交嗷┗|`O′|┛ )

 

参考文献:

  入门综合文献:

  孟宁老师:五⼤场景玩转 Git,只要这一篇就够了!

  Git 教程 | 菜鸟教程 

 

  参考书类文献(原理在这里面找就好啦):

  Git官方:Git-Book

  廖雪峰:Git教程

 

  一些小技巧:

  Git忽略文件.gitignore的使用

 

  比较好的在线课程(不止有Git哦):

  MIT - The Missing Semester of Your CS Education

  上述课程Git章节(Lecture 6)对应的讲义

posted @ 2020-10-20 23:00  HarryPotterIsDead!  阅读(688)  评论(0)    收藏  举报