摘自:Python编程 从入门到实践(第2版)附录D
Ubuntu 20.04
1. 安装Git
$ sudo apt install git
2. 配置Git
Git跟踪是谁修改了项目,需要知道用户名和电子邮件。
$ git config --global user.name "username"
$ git config --global user.email "username@example.com"
3. 忽略文件
创建一个git_practice文件夹作为项目目录,并创建hello_git.py文件。
有些文件无须让Git跟踪它们,如.pyc存储在目录__pycache__中。为让Git忽略这个目录,创建一个名为.gitignore的特殊文件,并在其中添加下面一行内容:
__pycache__/
4. 初始化仓库
git_practice$ git init
已初始化空的 Git 仓库于 git_practice/.git/
仓库是程序中被Git主动跟踪的一组文件。Git用来管理仓库的文件都存储在隐藏的目录.git中,你不需要与这个目录打交道。
5. 检查状态
执行其他操作前,先看一下项目的状态:
git_practice$ git status
位于分支 master
尚无提交
未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容)
.gitignore
hello_git.py
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
git_practice$
在Git中,分支是项目的一个版本。提交是项目在特定时间的快照。
Git指出项目中未被跟踪的文件,因为我们还没有告诉它要跟踪哪些文件。接下来,Git告诉我们尚未将任何东西添加到当前提交中,但指出可能需要加入仓库中的未跟踪文件。
6. 将文件加入仓库中
将这两个文件加入仓库中,并再次检查状态:
git_practice$ git add .
git_practice$ git status
位于分支 master
尚无提交
要提交的变更:
(使用 "git rm --cached <文件>..." 以取消暂存)
新文件: .gitignore
新文件: hello_git.py
git_practice$
命令git add .将项目中未被跟踪的所有文件都加入仓库中。它不提交这些文件,只是让Git开始关注它们。现在检查项目状态时,我们发现Git找出了需要提交的一些修改。标签new file意味着这些文件是新添加到仓库中的。
7. 执行提交
执行第一次提交:
git_practice$ git commit -m "Started project."
[master (根提交) 4588708] Started project.
2 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 .gitignore
create mode 100644 hello_git.py
git_practice$ git status
位于分支 master
无文件要提交,干净的工作区
git_practice$
执行命令 git commit -m "message"拍摄项目的快照。标志-m让Git将接下来的消息("Started project.")记录到项目的历史记录中。输出表明位于分支master上,且有两个文件被修改了。
现在检查状态时,会发现我们位于分支master上,且工作树是干净的。这是你每次提交项目的可行状态时都希望看到的消息。如果显示的消息不是这样的,请仔细阅读,很可能是你在提交前忘记了添加文件。
8. 查看提交历史
Git记录所有的项目提交。
git_practice$ git log
commit 45887084157ddb1585e8ff8f516793dc5e2d92c7 (HEAD -> master)
Author: user <user@163.com>
Date: Tue Mar 1 10:19:56 2022 +0800
Started project.
git_practice$
每次提交时,Git都会生成唯一的引用ID,长40字符。它记录提交是谁执行的、提交的时间以及提交时指定的消息。并非在任何情况下都需要所有这些消息,Git提供一个选项,让打印提交历史条目更简单:
git_practice$ git log --pretty=oneline
45887084157ddb1585e8ff8f516793dc5e2d92c7 (HEAD -> master) Started project.
git_practice$
标志--pretty=oneline指定显示两项最重要的信息:提交的引用ID和为提交记录的消息。
9. 第二次提交
需要修改项目并提交所做的修改。为此,在hello_git.py中添加一行代码:
print("Hello Git world!")
如果现在查看项目的状态,将发现Git注意到这个文件发生了变化:
git_practice$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git restore <文件>..." 丢弃工作区的改动)
修改: hello_git.py
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
git_practice$
输出指定了当前所在的分支和被修改了的文件的名称,还指出了所作的修改未提交。下面提交所做的修改,并再次查看状态:
git_practice$ git commit -am "Extended hello Git."
[master 0a0faea] Extended hello Git.
1 file changed, 1 insertion(+)
git_practice$ git status
位于分支 master
无文件要提交,干净的工作区
git_practice$ git log --pretty=oneline
0a0faeac34f19c8de29e2e5ed68c9d44527d99f2 (HEAD -> master) Extended hello Git.
45887084157ddb1585e8ff8f516793dc5e2d92c7 Started project.
git_practice$
标志-a让Git将仓库中所有修改了的文件都加入到当前提交中。(如果在两次提交之间创建了新文件,可再次执行命令git add .,将这些新文件加入仓库中。)标志-m让Git在提交历史中记录一条消息。
查看项目的状体时,我们发现状态树也是干净的。最后,可以看到提交历史中包含两个提交。
10. 撤销修改
如何放弃所做的修改,恢复到前一个可行状态。为此,首先在hello_git.py中再添加一行代码:
print("Hello Git world!")
print("Oh no, I broke the project!")
我们查看状态,发现Git注意到了所做的修改:
git_practice$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git restore <文件>..." 丢弃工作区的改动)
修改: hello_git.py
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
git_practice$
如果愿意,可提交所做的修改,但这次我们不提交所做的修改,而是恢复到最后一个提交(我们知道,那次提交时项目能够正常地运行)。为此,不对hello_git.py执行任何操作,而是在终端会话中执行如下命令:
git_practice$ git checkout .
从索引区更新了 1 个路径
git_practice$ git status
位于分支 master
无文件要提交,干净的工作区
命令git checkout让你能够恢复到以前的任意提交。命令git checkout .放弃最后一次提交后所做的所有修改,将项目恢复到最后一次提交的状态。
如果此时返回文本编辑器,将发现hello_git.py被修改成这样:
print("Hello Git world!")
11. 检出以前的提交
你可以检出提交历史中的任何提交,而不仅仅时最后一次提交,为此可以在命令git checkout末尾指定该提交引用ID的前6字符(而不是句点)。通过检出以前的提交,你可以对其进行审核,然后返回到最后一次提交,或者放弃最近所做的工作并选择以前的提交:
git_practice$ git log --pretty=oneline
0a0faeac34f19c8de29e2e5ed68c9d44527d99f2 (HEAD -> master) Extended hello Git.
45887084157ddb1585e8ff8f516793dc5e2d92c7 Started project.
git_practice$ git checkout 0a0fae
注意:正在切换到 '0a0fae'。
您正处于分离头指针状态。您可以查看、做试验性的修改及提交,并且您可以在切换
回一个分支时,丢弃在此状态下所做的提交而不对分支造成影响。
如果您想要通过创建分支来保留在此状态下所做的提交,您可以通过在 switch 命令
中添加参数 -c 来实现(现在或稍后)。例如:
git switch -c <新分支名>
或者撤销此操作:
git switch -
通过将配置变量 advice.detachedHead 设置为 false 来关闭此建议
HEAD 目前位于 0a0faea Extended hello Git.
git_practice$
检出以前的提交后,将离开分支master,进入Git所说的分离头指针(detached HEAD)状态。HEAD指针表示当前提交的项目状态,之所以说处于分离状态,是因为我们离开了一个命名分支(这里时master)。
要回到分支master,可检出它:
git_practice$ git checkout master
切换到分支 'master'
git_practice$
这让你回到分支master。除非要使用Git的高级功能,否则在检出以前的提交后,最好不要对项目做任何修改。然而,如果参与项目开发的人只有你自己,而你又想放弃较近的所有提交并恢复到以前的状态,也可将项目重置到以前的提交。为此,可在处于分支master上的情况下,执行如下命令:
git_practice$ git status
位于分支 master
无文件要提交,干净的工作区
git_practice$ git log --pretty=oneline
0a0faeac34f19c8de29e2e5ed68c9d44527d99f2 (HEAD -> master) Extended hello Git.
45887084157ddb1585e8ff8f516793dc5e2d92c7 Started project.
git_practice$ git reset --hard 458870
HEAD 现在位于 4588708 Started project.
git_practice$ git status
位于分支 master
无文件要提交,干净的工作区
git_practice$ git log --pretty=oneline
45887084157ddb1585e8ff8f516793dc5e2d92c7 (HEAD -> master) Started project.
git_practice$
首先查看状态,确认位于分支master上。查看提交历史时,我们看到了两个提交。接下来,执行命令git reset --hard,并在其中指定要永久恢复到的提交的引用ID前6字符。我们再次查看状态,发现位于分支master上,且没有需要提交的修改。再次查看提交历史时,会发现我们回到了要重新开始的提交。
12. 删除仓库
有时候,仓库的历史记录被你弄乱了,而你有不知道如何恢复。如果无法恢复且参与项目开发的只有你一人,可继续使用这些文件,但要将项目的历史记录删除——删除目录.git。这不会影响任何文件的当前状态,只会删除所有的提交,因此你将无法检出项目的其他任何状态。
为此,可打开一个文件浏览器,并将目录.git删除,也可以通过命令行将其删除。这样做后,需要重新创建一个仓库,重新对修改进行跟踪。下面演示了如何在终端会话中完成这个过程:
git_practice$ git status
位于分支 master
无文件要提交,干净的工作区
git_practice$ rm -rf .git
git_practice$ git status
fatal: 不是 git 仓库(或者任何父目录):.git
git_practice$ git init
已初始化空的 Git 仓库于 git_practice/.git/
git_practice$ git status
位于分支 master
尚无提交
未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容)
.gitignore
hello_git.py
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
git_practice$ git add .
git_practice$ git commit -m "Starting over."
[master (根提交) ec75766] Starting over.
2 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 .gitignore
create mode 100644 hello_git.py
git_practice$ git status
位于分支 master
无文件要提交,干净的工作区
git_practice$