文章目录[隐藏]
版本控制软件能够拍摄处于行状态的项目快照。修改项目后,如果项目不能正常运行,可以恢复到前一个可行状态。
通过版本控制软件。可以放手去改进项目,不用担心项目因你犯错而遭到破化,对于大型项目来说,这显得尤为重要,但对于小项目来说,哪怕是只包含一个文件的程序,这也大有裨益。
如何安装Git,以及如何使用它来对当前开发的程序进行版本控制,Git是当前最流行的版本控制软件,包含很多高级工具,可帮助团队协作开发大型项目,但其最基本的功能也非常适合独立开发人员使用,Git通过跟踪每个文件的修改来实现版本控制,如果犯了错,只需要恢复到保存前的一个状态即可。
D.1 安装Git
Git可以在所有的操作系统上运行,但安装方式随操作系统而异。
D.1.1 Windows系统
Git网站下载Git安装程序。
D.1.2 macOS系统
一般预装
D.1.3 Linux系统
执行命令
sudo apt install git-all
就ok。
D.1.4 配置Git
Git跟踪是谁修改了项目,哪怕参与项目开发的人只有一个。为此,Git需要知道你的用户名和电子邮箱地址。你必须提供用户名,但可使用虚构的电子邮箱地址:
$ git config --global user.name "username"
$ git config --global user.email "username@example.com"
如果忘记了这一步,在首次提交时,Git将提示你提供这些信息。
D.2 创建项目
创建一个要进行版本控制的项目。在系统中创建一个文件夹,并且将其命名为git_practice.在这个文件夹中创建一个简单的Python程序:
print('hello Git world')
使用这个程序来探索Git的基本功能。
D.3 忽略文件
扩展名为.pyc的文件是根据.py文件自动生成的,因此无须让Git跟踪它们。这些文件存储在目录_pycache_中 .为了让Git忽略这个目录,创建一个名为.gitignore的特殊文件(这个文件名以句点打头切没有扩展名),并在其中添加下面一行内容:
_pycache_/
这让Git忽略目录_pycache_中的所有文件。使用文件.gitignore可避免项目混乱,让其开发起来更容易。
你可以需要修改文本编辑器的设置,使其显示隐藏的文件,这样才能使用它来打开文件.gitignore。有些编辑器被设置成忽略名称以句点打开的文件。
D.4 初始化仓库
前面创建了一个目录,其中包含一个Python文件和一个.gitignore文件,现在可以初始化一个Git仓库。为此,打开,打开一个终端窗口,切换到文件夹git_practice.并执行如下命令:
git init
输出表面Git在git_pratice中初始化了一个空仓库。仓库是程序中被Git主动跟踪的一组文件。Git用来管理仓库的文件都存储在隐藏的目录.git中,你根本不需要与这个目录打交道,但千万不要删除它,否则将丢失项目的所有历史记录。
D.5 检查状态
执行其他操作前,先来看一下项目的状态:
git status
在Git中,分支是项目的一个版本。从这里的输出可知,我们位于分支master上。每次查看项目的状态时,输出都将指出位于分支master上。接下来的输出表明还未执行任何提交。提交是项目在特定时点的快照。
Git指出了项目中未被跟踪的文件,因为我们还没有告诉它要跟踪哪些文件。接下来,Git告诉我们尚且未将任何东西天骄到当前的提交中,但指出了可能需要加入仓库中的未跟踪文件。
D.6 将文件加入仓库中
下面将这两个文件加入仓库中,并且再此检查状态:
git add .
git status
命令git add .将项目中未被跟踪的所有文件都加入仓库中。它不提交这些文件,知识让Git开始关注它们。现在检查项目的状态时候,发现Git找出了需要提交的一些修改。标签new file意味着这些文件是新添加到仓库中的。
D.7 执行提交
下面来执行第一次提交:
git commit -m "Started project."
git status
执行命令git commit -m "message"拍摄项目的快照。标志-m让Git将接下来的消息("Started project.")记录到项目的历史记录中。输出位于分支master上。且有两个文件被修改了。
现在检查状态时,会发现我们位于分支master上,且工作树是干净的。这是你每次提交项目的可行状态时都希望看到的消息。如果显示的消息不是这样的,请仔细阅读,很可能是你在提交前忘记了添加文件。
D.8 查看提交历史
Git记录所有的项目提交。
git log
每次提交时,Git都会生成唯一引用ID,长40字符。他记录提交是谁执行的、提交的时间以及提交时指定的消息。并非在任何情况下都需要所有这些信息,因此Git提供一个选项,能够打印提交历史条目的更简单版本:
git log --pretty=oneline
标志--pretty=oneline指示显示两项重要信息:提交的引用ID和为提交记录的消息。
D.9 第二次提交
为了展示版本控制的强大威力,我们要修改项目并提交所做的修改。为此在hello_git.py中在添加一行代码:
print('hello! everyone!')
如果现在查看项目的状态,将发现Git注意到这个文件发生了变化:
git status
输出指出了当前所在的分支和倍修改的文件的名称,还指出了所作的修改未提交。下面来提交所做的修改,并再此查看状态:
git commit -am "Extended greeting."
git status
git log --pretty=online
再此执行了提交,并在执行命令git commit时制定了标志-am。标志-a让Git将仓库中所有修改了的文件都加入当前的提交中。(如果在两次提交之间创建了新文件,可再次执行命令git add .,将这些新文件加入仓库中。)标志-m让Git在提交历史中记录一条消息。
查看项目的状态时,发现工作树也是干净的。最后,可以看到提交历史中包含了两个提交。
D.10 撤销修改
下面来看看如何放弃所做的修改,恢复到前一个可行的状态,为此,首先在hello_git.py中再添加一行代码:
print('Oh!I broke the project!')
保存并运行这个文件。
查看状态,发现Git注意到了所做的修改:
git status
Git注意到我们修改了hello_git.py。如果愿意,可提交所做的修改,但这次我们不提交所做的修改,而是恢复到最后一个提交。为此,不对hello_git,py执行任何操作,执行以下命令:
git checkout .
git status
命令git checkout可以恢复到以前的任意提交。命令gitcheckout . 放弃醉舟一次提交后所做的所有修改,将项目恢复到最后一次提交的状态。
如果此时返回文本编辑器,则发现恢复到之前的位置。
就此项目而言,恢复到前一个状态微不足道,但是如果 开发的是大型项目。其中数十个文件都被修改了。那么恢复到前一个状态,将撤销自最后一次提交后对这些文件所做的所有修改。这个功能很有用:实现新功能时,可以根据需要做任意数量的修改,如果这些修改不可行,可撤销它们,而不会对项目有任何伤害。无需记住做了哪些修改,因而不必手工撤销所做的修改,Git会替你完成所有这些工作。
D.11 检查以前的提交
可以检出提交历史中的任何提交,而不仅仅是最后一次提交,为此可在命令git check末尾指定该提交的引用ID的前6字符。通过检出以前的提交,可以对其进行审核,然后返回到最后一次提交,或者放弃最近所作的工作并选择以前的提交:
git log --pretty=oneline
git checkout "分支前6位"
检出以前的提交后,将离开分支master,进入Git所说的分离头指针(detached HEAD)状态。HEAD指针标识当前提交的项目状态,之所以说处于分离状态,是因为我们离开了一个命名分支(master)。
要回到分支master,可检出它:
git checkout master
这让你回到分支master,除非要使用Git的高级功能,否则在检出以前的提交之后,最好不要对项目做任何修改,然而,如果参与项目开发的人只有你自己,而你又想放弃较近的所有提交并恢复到以前的状态,也可以将项目重置到以前的提交。为此,可在除以分支master上的情况下,执行:
git status
git log --pretty=oneline
git reset --hard “分支前6位”
git status
git log --pretty=oneline
首先查看状态,确认位于分支master上。查看提交历史时,我们看到了两个提交。接下来,执行命令git reset --hard,并在其中指定要永久恢复到的提交的引用ID前6字符。再此查看状态,发现位于master分支上,且没有需要提交的修改。再此查看提交历史时,会发现回到了要重新开始的提交。
D.12 删除仓库
有时候,仓库的历史己理被弄乱了,而你又不知道如何恢复,这种情况下,首先寻求帮助~
如果无法恢复且参与项目开发的人只有你一个人,可以继续使用这些文件,但是要将项目的历史记录删除——删除目录.git。这不会影响任何文件的当前状态,只会删除所有的提交,因此你将无法检出项目的其他任何状态。
为此,可以打开一个文件浏览器,并且将目录.git删除,也可以通过命令行将其删除,这样做后,需要重新建一个仓库,重新对修改进行跟踪:
git status
rm -rf .git
git status
git init
git status
git add .
git commit -m ""
git status
首先查看状态,发现工作树是干净的。接下来,使用命令rm -rf .git 删除目录.git。删除文件夹.git后再次查看状态时,被告知这不是一个Git仓库。Git用来追踪仓库的信息都存储在文件夹.git中,因此删除该文件夹也将删除整个仓库。
接下来使用git init新建一个全新的仓库,然后查看状态,发现又回到了初始状态,等待第一次的提交,将所有文件都加入仓库,并执行第一次提交,然后再此查看状态,发现位于新的分支master上,且没有任何未提交的修改。
叨叨几句... NOTHING