Git简明教程

版本控制软件能够让我们拍摄处于可行状态下的项目的快照。更改项目(比如实现新功能)后,如果项目不能正常运行,可以恢复到前一个可行状态。通过版本控制软件,我们可以无顾忌地改进项目,不再需要担心项目因为自己犯了错而遭到破坏。对于大型项目而言,这显得尤为重要。对小项目来说,这也是大有益处的。
安装 Git
要在 Windows 系统中安装 Git,访问 https://git-scm.com/downloads
点击下载安装包,然后双击安装即可。
配置 Git
Git 会跟踪到底是谁修改了项目,哪怕参与项目开发的人只有一个。为此,Git 需要知道你的用户名和电子邮件地址。你必须提供用户名,但可以使用虚构的电子邮件地址:
|
|
如果忘记了这一步,在你首次提交时,Git 将提示你提供这些信息。
创建项目
我们来创建一个要进行版本控制的项目。在你的系统中创建一个目录,并将其命名为learn_git
。在这个目录中,创建一个简单的 Python 程序:
|
|
忽略文件
扩展名为.pyc
的文件是根据.py
文件自动生成的,因此我们无需让 Git 跟踪它们。这些文件存储在__pycache__
目录中。为了让 Git 忽略这个目录,创建一个名为.gitignore
的特殊文件,并将下面类容添加到文件中:
|
|
这让 Git 忽略目录__pycache__
中的所有文件。使用.gitignore
文件可以避免项目混乱。
初始化仓库
现在的learn_git
只是一个普通的目录,包含了一个Python
文件和一个.gitignore
文件,为了对其进行版本控制需要使用 Git 进行初始化一下。打开一个终端窗口,切换到learn_git
目录,并执行如下命令:
输出表明 Git 在learn_git
中初始化了一个空仓库。仓库是程序中被 Git 主动跟踪的一组文件。Git 用来管理仓库的文件都存储在隐藏的.git/
中。
检查状态
在执行其他操作前,先看一下项目的状态:
在 Git 中,分支是项目的一个版本。从这里的输出可知,我们位于分支master
上(见 1)。Git 指出了项目中未被跟踪的文件(见 2),因为我们还没有告诉它要跟踪哪些文件。提交是项目在特定时间点的快照。此时,我们被告知没有将任何东西添加到当前提交中,但我们需要将未跟踪的文件加入到仓库中(见 3)。
将文件加入到仓库中
下面将之前的两个文件加入到仓库中
|
|
再次检查状态:
命令git add .
将项目中未被跟踪的所有文件都加入到仓库中。它不提交这些文件,而只是让 Git 开始关注它们。当我们检查项目的状态时,Git 找出了需要提交的一些修改。标签new file
意味着这些文件是新添加到仓库中的。
执行提交
接下来,我们执行第一次提交:
我们执行命令git commit -m "message"
以拍摄项目的快照。选项-m
让 Git 将接下来的消息"Started project"
记录到项目的历史记录中。输出表明我们在分支master
上,且有两个文件被修改了。现在我们检查状态时,发现我们在分支master
上,且工作目录是干净的。
查看提交历史
Git 记录所有的项目提交。下面来看一下提交历史:
每次提交时,Git 都会生成一个包含 40 字符的独一无二的引用 ID。它记录提交是谁提交的、提交的时间以及提交时指定的消息。但是,并非在任何情况下都需要所有这些信息,Git 提供了一个选项,以便能够打印提交历史条目中更简单的版本:
选项--pretty=oneline
指定显示两项最重要的信息:提交的引用 ID 以及为提交记录的消息。
第二次提交
我们在hello_world.py
中再添加一行代码:
|
|
查看项目状态,Git 注意到了这个文件发生了变化:
输出指出了我们当前所在的分支、被修改了的文件的名称,还指出了所做的修改未提交。接下来我们提交所做的修改,并再次查看状态:
我们再次执行了提交,并在执行命令git commit
时指定了选项-am
。选项-a
让 Git 将仓库中所有修改了的文件都加入到当前提交中(如果在两次提交之间创建了新文件,可再次执行命令git add .
将这些新文件加入到仓库中)。选项-m
让 Git 在提交历史中记录一条消息。
我们查看项目的状态时,发现工作目录也是干净的。最后,我们发现提交历史中包含两个提交。
撤销修改
下面来看看如何放弃所做的修改,恢复到前一个可行状态。为此,首先在hello_world.py
中再加一行代码:
|
|
保存并查看状态:
Git 注意到我们修改了hello_world.py
。我们可以提交所做的修改,但这次我们不提交所做的修改,而要恢复到最后一个提交(那次提交时项目能够正常地运行)。为此,我们不对hello_world.py
执行任何操作——不删除刚添加的代码行,也不使用文本编辑器的撤销功能,而在终端会话中执行如下命令:
命令git checkout
让你能够恢复到以前的任何提交。命令git checkout .
放弃自最后一次提交后所做的所有修改,让项目恢复到最后一次提交的状态。
如果我们回到文本编辑器,将发现hello_world.py
被修改成了下面这样:
就这个项目而言,恢复到前一个状态微不足道,但如果我们开发的是大型项目,其中数十个文件都被修改了,那么恢复到前一个状态,将撤销自最后一次提交后对这些文件所有的所有修改。这个功能很有用:实现新功能时,可以根据需要做任意数量的修改,如果这些修改不可行,可以撤销它们,而不会对项目有任何影响。
检出以前的提交
我们可以检出提交历史中的任何提交,而不仅仅是最后一次提交,为此可在命令git checkout
末尾指定该提交的引用 ID 的前 6 个字符(而不是句点)。
检出以前的提交后,将离开master
分支,并进入分离头指针(detached HEAD)状态。HEAD 表示项目的当前状态,之所以说处于分离状态,是因为我们离开了一个命名分支(这里是 master)。
要回到master
分支,可以检出它:
除非你要使用 Git 的高级功能,否则在检出以前的提交后,最好不要对项目做任何修改。如果只有你一个人开发项目,而你又想放弃较近的所有提交,并恢复到以前的状态,也可以将项目重置到以前的提交。为此,可以在处于master
分支上执行如下命令:
我们首先查看了状态,确认我们在master
分支上。查看提交历史时,我们看到了两个提交。然后,执行命令git reset --hard
,并在其中指定了要永久地恢复到的提交的引用 ID 的前 6 个字符。再次查看状态,发现我们在master
分支上,且没有需要提交的更改。再次查看提交历史时,发现我们处于要从它重新开始的提交中。
推荐
最后,推荐一个网站 Learn Git Branching:https://learngitbranching.js.org/
以闯关+可视化的形式学习 Git 相关知识。
参考

