【Git & GitHub】01 基本操作

   Git是一个免费的开源分布式版本控制系统,旨在快速高效地处理从小到大的所有项目。而GitHub是基于Git的代码管理平台,利用GitHub可以作为Git的远程仓库、个人开源项目仓库以及优秀开源项目分享交流平台。结合使用Git & GitHub可以高效地进行项目开发和管理,文章将介绍Git & GitHub使用的基本操作,多实践多收获!

更新历史:

  • 2021年07月04日完成初稿

1. Git基本配置和使用

  Git是免费开源的分布式版本控制系统,它可以记录项目开发过程中的版本更迭过程,便于开发人员管理项目开发过程中的代码版本更替。

1.1 Git配置

  在Git官方网站上提供了各种操作系统下的Git安装包,下载安装包并按照要求安装即可,安装成功之后在文件夹下点击鼠标右键可以发现增加的两个快捷键:

  • Git GUI Here:Git的图形化界面
  • Git Bash Here:Git的命令行窗口(推荐)

命令行
  Git命令行遵循Linux shell命令格式,文章代码也是shell格式,常见的命令都可以在网上搜索找到,下面介绍的目录命令等是十分常见的命令,多多练习即可掌握。命令行方式和Windows下的图形界面方式有很大不同,但其实质是一样的,Windows下鼠标点击过程本质上就是命令行的执行过程。

  下面以Git命令行窗口进行介绍,在任意文件夹下点击Git Bash Here会在该文件夹下打开Git命令行窗口(比如在桌面点击右键选择Git Bash Here后,则当前目录为桌面所在目录),使用pwd命令可以查看当前工作目录,通过cd命令可以切换目录:

Git中常用的linux命令
  Git除特指的git命令之外,还会有很多linux命令,下面简单地列出该命令,未列出的命令可以在使用搜索引擎进行搜索:

  • cd dirname:切换到工作目录dirname(change directory),dirname只能是文件夹名称而不能是文件名称
  • cd ~:切换到用户的主目录(系统管理员增加用户时创建起来的目录)
  • cd ../:切换到当前目录的上一级目录
  • mkdir dirname:新建目录dirname(make directories)
  • pwd:显示当前工作目录(print working directory)
  • ls -a:显示当前工作目录下的所有文件和文件夹简略信息,-a参数(all)表示所有文件(包括隐藏的文件),若不带该参数只会显示可见文件和文件夹
  • ll -a:显示当前工作目录下文件和文件夹的详细信息,包括权限、根目录、用户、创建时间,-a参数表示所有文件(包括隐藏的文件),若不带该参数只会显示可见文件和文件夹
  • rm -rf filename:强制将文件夹删除(remove),-rf包括-r参数(递归地删除该文件夹的文件和子文件夹,等价于--recursive)的和-f参数(强制删除,等价于--force

  下载安装Git之后,首先需要打开Git Bash进行配置,首先需要配置本机的用户名和Email地址:

# 在任何目录下点击右键选择Git Bash Here
git config --global user.name "UserName"             # 用自己的用户名代替UserName
git config --global user.email "[email protected]"   # 用自己的邮箱代替[email protected]

  之所以可以在任何目录下进行操作,是因为使用了global参数,因此这一配置将适用于全局,并且通过配置用户名和邮箱,Git便可以识别你的身份以避免冒充。当然也可以不进行全局配置,但这是最好的方式。Git配置好后就可以在自己的电脑上设置本地仓库,并利用Git进行管理了。

1.2 Git本地仓库

  仓库(repository)也称版本库,Git可以管理仓库中的任何文件,在该仓库下文件的增加、删除、修改都可以被Git跟踪,以便于Git可以管理文件的各个历史版本,也可以在之后需要还原时进行版本回退。通俗地理解,Git的版本库就是一个大货仓,里面堆满了文件,而Git就是管理员。

  Git仓库通常是利用电脑上面的一个文件夹作为本地库,可以选择或者新建一个文件夹作为Git的仓库:

LENOVO@DESKTOP-U4JAHED MINGW64 ~
$ cd C:               # 切换到C盘
LENOVO@DESKTOP-U4JAHED MINGW64 /c
$ cd Git              # 切换到当前目录中的Git目录
LENOVO@DESKTOP-U4JAHED MINGW64 /c/Git
$ mkdir git_test      # 在当前目录新建git_test目录
LENOVO@DESKTOP-U4JAHED MINGW64 /c/Git
$ cd git_test	      # 进入到git_test目录下

  其中,LENOVO@DESKTOP-U4JAHED是机器标识,MINGW64(Minimalist GNU on Windows )是 GCC 的 Windows 64bits版本,而~是当前目录(~代表用户主目录)。当然,切换目录和新建目录的操作可以利用鼠标进行,在新建的文件夹下面点击右键选择Git Bash Here即可在该文件夹下打开Git Bash。

  不过该文件夹还不能被Git管理,你需要对其进行初始化,通过git init命令即可将该目录变成Git可以管理的仓库,操作之后在LENOVO@DESKTOP-U4JAHED MINGW64 /c/Git/git_test旁边出现master标记(如下图),这代表该分支为master分支(即Git默认的主分支名称)关于分支见之后的文章,这里只涉及默认的主分支。


  初始化的目的是为了授权并配置相应文件,使用git init命令之后,在当前目录下便有一个文件.git(默认情况下会被隐藏),通过显示全部文件命令ll -a可以看到该文件,该文件即为Git管理本地库的文件夹,不要对该文件进行任何的操作(除非想删除该本地库不再使用)。


  在新建目录之后,并可以在该目录下条添加文件了,首先我们编写一个readme.md文件,并保存到git_test目录(或子目录)下:


  这个时候,文件在目录下,Git还不知道有这个文件,因此需要显式地将readme.md加入Git的管理范围内,通过git add filename命令将该文件加入Git仓库,之后用git commit -m "description"将该文件提交到当前分支:


  值得注意的是git add filename不仅仅是增加文件时需要通过该命令进行增加,而且原文件修改之后也需要通过该命令声明修改。同时,git commit -m "description"中的description是提交的描述,比如上面的upload readme.md等表示当前操作的含义,而且提交过程是可以一次提交很多文件,因此使用git add filename命令增加/修改所有需要修改的文件之后,再用git commit -m "description"一次性提交。

add 和 commit
  可以将上面操作区域分为工作区和暂存区,工作区就是Windows下可视化的目录,而在该目录下有一个版本库.git,在.git下有一个暂存区和分支区,通过add命令是将工作区的文件加入到暂存区,而commit是将暂存区的文件一次性提交到当前分支,Git正是通过这种结构去记录版本信息的。


  通过上面的操作便可以修改文件和提交文件了,关于文件其他操作见后面的文章。如果在最后,不需要再使用本地库了,则需要删除本地库:

# 在本地库目录下进行操作
LENOVO@DESKTOP-U4JAHED MINGW64 /c/Git/git_test (master)
$ ll -a				# 显示当前工作目录下所有文件
total 5
drwxr-xr-x 1 LENOVO 197609  0 Jun 25 14:18 ./
drwxr-xr-x 1 LENOVO 197609  0 Jun 25 13:51 ../
drwxr-xr-x 1 LENOVO 197609  0 Jun 25 16:29 .git/
-rw-r--r-- 1 LENOVO 197609 15 Jun 25 14:18 readme.md
LENOVO@DESKTOP-U4JAHED MINGW64 /c/Git/git_test (master)
$ rm -rf .git/		# 删除本地库.git/
LENOVO@DESKTOP-U4JAHED MINGW64 /c/Git/git_test       # 这里没有master标记了
$ ll -a
total 1
drwxr-xr-x 1 LENOVO 197609  0 Jun 25 16:40 ./
drwxr-xr-x 1 LENOVO 197609  0 Jun 25 13:51 ../
-rw-r--r-- 1 LENOVO 197609 15 Jun 25 14:18 readme.md

   之后关闭Git Bash,在本地库的上一级目录下打开Git Bash(即在/c/Git/git_test上一级目录/c/Git中右键点击Git Bash Here),之后删除git_test即可:

LENOVO@DESKTOP-U4JAHED MINGW64 /c/Git
$ ll					# 显示当前工作目录下(可见的)文件
total 0
drwxr-xr-x 1 LENOVO 197609 0 Jun 25 16:40 git_test/
LENOVO@DESKTOP-U4JAHED MINGW64 /c/Git
$ rm -rf git_test/		# 删除git_test/文件
LENOVO@DESKTOP-U4JAHED MINGW64 /c/Git
$ ll
total 0

   上面的rm -rf filename属于强制删除文件命令。之所以要关闭Git Bash之后再重新打开,是因为该Git Bash很可能会占用git_test/文件,而使得无法删除该文件。

   小结一下,在新建好想被Git管理的文件夹后,在该文件夹下打开Git Bash可以进行下面几个操作:

  • git init:指定该库成为Git管理的本地库
  • git add:将新建或者修改后的文件添加到暂存区
  • git commit -m “description”:将暂存区文件提交到当前分支
  • rm -rf .git/:删除本地库(慎用)

  上面讲述了关于本地库的基本操作,而Git是分布式版本控制系统,同一个Git仓库可以分布于不同的机器上,一台机器可以作为另一台机器的远程仓库,这就需要个人具备多台机器才有实际意义,不过实际上是通过找一台24小时不停机的电脑充当服务器,其他每个人都从这个服务器仓库克隆到自己的电脑上,并且将各自的内容提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交,在现实中,GitHub正是完成这种功能的网站。

2. GitHub基本配置和操作

  正如前述,GitHub是基于Git的代码管理平台,个人可以在GitHub官方网站申请注册GitHub账号以免费获得使用权限。

2.1 GitHub配置

  在注册GitHub之后,需要进行GitHub配置,由于Git本地仓库和GitHub远程仓库之间的传输是通过SSH加密的,因此需要配置GitHub的SSH密钥,SSH方式是Git本地仓库和GitHub远程仓库连接的高效方式,强烈推荐配置SSH密钥进行使用。

  首先需要创建SSH Key,在用户主目录下(在任意文件夹下右键点击进入Git Bash,输入cd ~后通过pwd便可获得用户主目录路径)查看是否有.ssh的文件,如果没有.ssh(初次使用)则需要通过下面的命令进行创建:

# 在用户主目录下获取ssh密钥
ssh-keygen -t rsa -C "[email protected]"	# 用自己的邮箱代替[email protected]

  获取密钥的过程中一切选择默认情况,并可以在用户主目录下生成.ssh文件,该文件下有三个文件:

  • id_rsa:RSA密钥,需要自己保存好
  • id_rsa.pub:RSA公钥,需要填写到GitHub上
  • known_hosts:不会用到

用户名和邮箱
  在Git配置时需要配置username和email,在注册GitHub时也需要设置用户名和邮箱(甚至包括GitHub名称),在获取ssh密钥时也需要使用邮箱,虽然这几个用户名和邮箱是没有任何关联的,可以不同也可以相同,不过尽量保持一致防止记混。

  之后登陆GitHub账号,点击右上角头像,选择下拉菜单中的Settings,然后选择SSH and GPG Keys,点击Add SSH Keys,填上Title(任意即可,如mykeys),将id_rsa.pub文本框中的全部内容粘贴到Key中(全选赋值后粘贴),之后便可以通过SSH模式连接本地Git仓库和GitHub仓库。

2.2 GitHub远程仓库

  在Git创建仓库之后,该仓库是本地仓库,Git可以管理该仓库中的版本信息,如果想在GitHub中创建一个与本地仓库同步的Git仓库(即远程仓库),该远程仓库便可以作为本地仓库的备份,而且重要的是你的仓库可以被别人看到,从而让对该项目感兴趣的人同时为这个仓库贡献代码,两者的关系是:


  下面就简单介绍一下创建远程仓库的步骤:首先登陆GitHub账号,点击右上角头像,选择下拉菜单中的Yours repositories,来到自己的仓库管理区域,点击New新建一个仓库:


  在该情景下,填写完Repository name和Description (可选)之后,其他选择默认,点击Create repository即可。其中public和private表示该项目是公开的还是私有的,目前两种选项都可以免费使用,不过private项目会限制协作人数。

Repository name
  建议Git的仓库名和GitHub的仓库名保持一致,而且不要包含中文,包含英文字符和数字字符区分即可。

  在新建仓库之后,便可以开始一些简单的设定,在GitHub上则提供了一些简单的设置,在设定中,有HTTPS和SSH模式可以选择,这里选择SSH模式关联本地仓库和远程仓库。


  接下来,通过下面的命令可以关联Git的git_test仓库和GitHub的git_test仓库:

# 一定要在本地仓库目录下输入命令
LENOVO@DESKTOP-U4JAHED MINGW64 /c/Git/git_test (master)
$ git remote add origin [email protected]:Stu-Yang/git_test.git   # 需要更换SSH地址

  其中origin是远程库的名字(使用该默认名即可),而[email protected]:Stu-Yang/git_test.git则是仓库的SSH地址。前面叙述过,在Git本地库下新建了一个readme.md文件(内容为Hello, World!),而且已经将该文件add和commit,现在便可以将该文件推送到GitHub远程库:

LENOVO@DESKTOP-U4JAHED MINGW64 /c/Git/git_test (master)
$ git push -u origin master                 # (首次推送)将本地库内容推送至远程库,并将两者关联起来
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 228 bytes | 57.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:Stu-Yang/git_test.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.

  其中的origin是上面git remote add origin [email protected]:Stu-Yang/git_test.git命名的远程仓库,-u命令是将本地库和远程库关联起来(只需要关联一次,之后推送文件只需要git push origin master命令即可),而master是指当前分支(Git默认的主分支为master),然后刷新GitHub便可以看到推送的内容:


  不过需要注意的是,当第一次使用Git的push命令连接GitHub时,可以会得到关于SSH连接的关联警告,输入yes并按回车即可。如果远程库不再使用了,可以通过下面的命令查看现有的远程库并指定远程库进行删除:

LENOVO@DESKTOP-U4JAHED MINGW64 /c/Git/git_test (master)
$ git remote -v              # 查看远程库信息
origin  [email protected]:Stu-Yang/git_test.git (fetch)
origin  [email protected]:Stu-Yang/git_test.git (push)
LENOVO@DESKTOP-U4JAHED MINGW64 /c/Git/git_test (master)
$ git remote rm origin       # 删除远程库origin与本地库的连接

  不过值得注意的是,这个操作并不会删除远程库,只是取消本地库与远程库的连接而已,想要真正删除远程库还需要在GitHub后台进行删除。对上面的操作进行简单的总结一下,使用GitHub作为Git的远程仓库需要新建一个GitHub仓库(建议不包含任何内容),然后进行下面的操作:

  • git remote add origin address:建立本地库与地址为address的远程库(名字设定为origin)之间的关联
  • git push -u origin master:将当前分支的内容推送到远程库origin的master分支,(首次推送)并关联两分支的内容
  • git push origin master:将当前分支的内容推送到远程库origin的master分支
  • git remote -v :查看远程库信息
  • git remote rm origin:取消本地库与远程库origin之间的连接

3. Git & GitHub协作

  在前述中,先在建立Git本地库,然后创建并关联GitHub远程库,但实际上会先建立GitHub远程库,然后从远程库进行克隆到本地仓库或者直接从其他开发人员的远程库进行克隆。

  在该场景下,新建一个仓库时(登陆GitHub账号,点击右上角头像,选择下拉菜单中的Yours repositories,来到自己的仓库管理区域,点击New新建一个仓库)便可以选择初始化仓库的选项:


  其中的Add a README file是添加一个描述性文件,描述你的开源项目的任何需要介绍的细节,而Choose a license这是选择你的开源项目的版权声明,这里选择GNU General Public License v3.0,它是一个比较通用的版权许可证,若有特殊需要还可以选择相应的版权许可,license告诉其他开发人员关于该项目的版权声明以避免该项目被剽窃。

  还有一点值得注意的是,GitHub默认的分支名称为main,而Git默认的分支名称为master,在相关的操作中(如推送操作git push origin master)则需要注意分支名称是master还是main,这需要完全匹配才不会出现推送到的分支出错。

  在GitHub上进行一些操作之后,远程库已经具备一些内容了,现在想将远程库克隆到本地库进行处理时便可以利用克隆命令,首先确定你想保远程库保存在本地哪个目录下面,然后在该目录下右击选择Git Bash Here然后输入下面的命令:

# 将远程库克隆至本地库
LENOVO@DESKTOP-U4JAHED MINGW64 /c/Git
$ git clone [email protected]:Stu-Yang/git_test.git  # 需要确定远程库SSH地址
Cloning into 'git_test'...
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (4/4), 12.49 KiB | 1.39 MiB/s, done.

  其中的[email protected]:Stu-Yang/git_test.git为远程库SSH地址,打开远程库,在右方的code按钮处便可找到SSH地址:


  事实上还可以选择HTTPS方式进行克隆,但是SSH模式速度非常快,如果允许使用SSH模式推荐使用该模式。克隆之后便可以在对应的文件夹中看到克隆的文件夹:


  克隆(clone)方式的好处在于只要通过clone命令就可以建立远程库和本地库的连接,无需想本地库建立一样进行本地库的创建和关联操作。另外,很多优秀的开源项目都允许克隆,因此可以将其他开发人员的源代码克隆到本地进行研究学习。

  克隆之后就可以基于本地库进行操作了,假如克隆下来的文件名称为git_test,从远程库下载下来的文件为LICENSE和README.md,位于当前唯一的分支main分支中,这说明本地库的文件夹和文件都与远程库有关联,下面介绍一下常用场景下的一些通用操作:

  首先打算在本文件夹下README.md添加本项目的具体介绍,然后增加一个文件README_en.md,则需要的操作是:打开git_test文件夹,将README.md修改好,然后增加README_en.md,编辑好内容之后需要将这两个文件添加至本地库的暂存区并提交到当前分支。在git_test文件夹点击右键,在下拉菜单中选择Git Bash Here即可在当前目录下打开Git,然后执行git status查看当前分支的状态,发现有一个修改后未提交的README.md,有一个未被跟踪的README_en.md,下面就利用git add README.mdgit add README_en.md将两个文件添加到暂存区,然后利用git commit -m "update README file"将两个文件提交到当前分支,之后可以选择查看提交状态(git status),或者选择推送到GitHub远程库(git push origin main)

LENOVO@DESKTOP-U4JAHED MINGW64 /c/Git/git_test (main)
$ git status                  			# 查看当前分支的状态
On branch main
Your branch is up to date with 'origin/main'.

Changes not staged for commit:     		# 修改后未提交
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   README.md

Untracked files:     					# 未跟踪文件(首次添加)
  (use "git add <file>..." to include in what will be committed)
        README_en.md

no changes added to commit (use "git add" and/or "git commit -a")

LENOVO@DESKTOP-U4JAHED MINGW64 /c/Git/git_test (main)
$ git add README.md						# 将README.md添加到暂存区

LENOVO@DESKTOP-U4JAHED MINGW64 /c/Git/git_test (main)
$ git add README_en.md					# 将README_en.md添加到暂存区,多个文件可以使用git add .命令一次性添加

LENOVO@DESKTOP-U4JAHED MINGW64 /c/Git/git_test (main)
$ git commit -m "update readme file" 	# 将暂存区文件提交到当前分支
[main c6ce15a] update readme file
 2 files changed, 6 insertions(+)
 create mode 100644 README_en.md

LENOVO@DESKTOP-U4JAHED MINGW64 /c/Git/git_test (main)
$ git status							# 再次查看当前分支的状态,显示全部文件提交成功
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

  现在如果想新建一个文件夹V1.0,表示版本1.0文件夹,同时添加main.cpp源代码文件,需要的操作为:使用mkdir V1.0命令创建文件夹,然后使用cd V1.0可以进入当前目录下的V1.0文件夹,然后将源代码文件编辑好,放在V1.0文件夹下(比如将main.cpp在编辑器编辑好,然后直接保存到该文件夹下),然后用上面同样的命令就可以添加到暂存区,并提交到当前分支:

# 注意文件夹路径
LENOVO@DESKTOP-U4JAHED MINGW64 /c/Git/git_test (main)
$ mkdir V1.0					# 创建文件夹V1.0
LENOVO@DESKTOP-U4JAHED MINGW64 /c/Git/git_test (main)
$ cd V1.0						# 切换到文件夹V1.0目录下
LENOVO@DESKTOP-U4JAHED MINGW64 /c/Git/git_test/V1.0 (main)
$ git add main.cpp				# 将main.cpp添加到暂存区
LENOVO@DESKTOP-U4JAHED MINGW64 /c/Git/git_test/V1.0 (main)
$ git commit -m "code V1.0"		# 将暂存区文件(main.cpp)提交到当前分支
[main 051c582] code V1.0
 1 file changed, 103 insertions(+)
 create mode 100644 V1.0/main.cpp

  在完成一系列操作之后,认为文件不需要再修改了,这时候就可以将文件夹推送到GitHub上面,然后别人就可以看到你的修改了。需要进行的操作是:使用命令git push origin main将当前分支中的文件推送到GitHub远程仓库中,其中的origin是GitHub远程库默认的名字,如果忘记了名字,可以使用git remote -v查看当前远程库的名字,main是克隆库时GitHub默认的分支:

# 每行LENOVO@DESKTOP-U4JAHED MINGW64...中都会标记当前分支名称
LENOVO@DESKTOP-U4JAHED MINGW64 /c/Git/git_test/V1.0 (main)
$ git remote -v				# 查看当前远程仓库的名字
origin  [email protected]:Stu-Yang/git_test.git (fetch)
origin  [email protected]:Stu-Yang/git_test.git (push)

LENOVO@DESKTOP-U4JAHED MINGW64 /c/Git/git_test/V1.0 (main)
$ git push origin main		# 将本地仓库推送到远程仓库origin的main分支
Enumerating objects: 10, done.
Counting objects: 100% (10/10), done.
Delta compression using up to 4 threads
Compressing objects: 100% (7/7), done.
Writing objects: 100% (8/8), 1.72 KiB | 219.00 KiB/s, done.
Total 8 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), done.
To github.com:Stu-Yang/git_test.git
   4d8dec8..051c582  main -> main

  之后刷新GitHub就可以看到相关的内容了。对上面的内容小结一下,若先建立远程库而想从克隆到本地库并进行一系列操作,那么可以有下面的操作:

  • git clone address:从地址为address的远程库克隆所有代码到当前目录下
  • git add filename:在本地库进行新建/修改文件操作后提交到暂存区
  • git status:查看当前分支状态
  • git commit -m description:将暂存区的内容提交到当前分支
  • git push origin main:将本地仓库推送到远程仓库origin的main分支

  现在基本介绍完Git和GitHub的基本配置和操作了,熟悉使用Git & GitHub不仅需要平时多实践,而且需要了解Git & GitHub的工作原理,这样才能举一反三,更能掌握Git & GitHub的精髓。

猜你喜欢

转载自blog.csdn.net/Stu_YangPeng/article/details/118462598