- 配置 Git
Git跟踪谁修改了项目。为此, Git需要知道你的用户名和电子邮件地址。你必须提供用户名,但可以使用虚构的电子邮件地址:
$
git config --global user.name "username"
$
git config --global user.email "username@example.com"
如果你忘记了这一步,在你首次提交时, Git将提示你提供这些信息。
- 创建项目
创建一个要进行版本控制的项目。
$
mkdir git_practice
$
cd git_practice
$
echo 'print("hello,Git.")' > hello_world.py
- 忽略文件
扩展名为.pyc的文件是根据.py文件自动生成的,因此我们无需让Git跟踪它们。这些文件存
储在目录__pycache__中。为让Git忽略这个目录,创建一个名为.gitignore的特殊文件,并在其中添加下面一行内容:
$
mkdir .gitignore
__pycache__/
使用文件.gitignore可避免项目混乱,开发起来更容易。
注意:如 果 你 使 用的 是 Python 2.7 , 请 将 这行 内 容 改 为 *.pyc 。 Python 2.7 不 会 创 建 目 录__pycache__,它将每个.pyc文件都存储在相应.py文件所在的目录中。
- 初始化仓库
执行如下命令:
git_practice$
git init
Initialized empty Git repository in git_practice/.git/
git_practice$
输出表明Git在git_practice中初始化了一个空仓库。仓库是程序中被Git主动跟踪的一组文件。Git用来管理仓库的文件都存储在隐藏的.git/中,不要删除这个目录,否则将丢弃项目的所有历史记录。
- 检查状态
执行其他操作前,先来看一下项目的状态:
git_practice$
git status
# On branch master
#
# Initial commit
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# .gitignore
# hello_world.py
#
nothing added to commit but untracked files present (use "git add" to track)
git_practice$
在Git中, 分支是项目的一个版本。从这里的输出可知,现在位于分支master上。你每次查看项目的状态时,输出都将指出你位于分支master上。接下来的输出表明,我们将进行初始提交。 提交是项目在特定时间点的快照。Git指出了项目中未被跟踪的文件,因为我们还没有告诉它要跟踪哪些文件。接下来,我们被告知没有将任何东西添加到当前提交中,但我们可能需要将未跟踪的文件加入到仓库中。
- 将文件加入到仓库中
将这两个文件加入到仓库中,再次检查状态:
git_practice$
git add .
git_practice$
git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: .gitignore
# new file: hello_world.py
#
git_practice$
命令
git add .将项目中未被跟踪的所有文件都加入到仓库中。它不提交这些文件,而只是让Git开始关注它们。现在我们检查项目的状态时, 发现Git找出了需要提交的一些修改。标签new file意味着这些文件是新添加到仓库中的。
- 执行提交
下面来执行第一次提交:
git_practice$
git commit -m "Started project."
[master (root-commit) c03d2a3] Started project.
2 files changed, 1 insertion(+)
create mode 100644 .gitignore
create mode 100644 hello_world.py
git_practice$
git status
# On branch master
nothing to commit, working directory clean
git_practice$
执行命令git commit -m "message"以拍摄项目的快照。标志-m让Git将接下来的消息( "Started project.")记录到项目的历史记录中。输出表明我们在分支master上,且有两个文件被修改了。现在我们检查状态时,发现我们在分支master上,且工作目录是干净的。
- 查看提交历史
Git记录所有的项目提交。下面来看一下提交历史:
git_practice$
git log
commit a9d74d87f1aa3b8f5b2688cb586eac1a908cfc7f
Author: Eric Matthes <eric@example.com>
Date: Mon Mar 16 07:23:32 2015 -0800
Started project.
git_practice$
每次提交, Git都会生成一个包含40字符的独一无二的引用ID。它记录提交是谁执行的、提交的时间以及提交时指定的消息。打印提交历史条目的更简单的版本:
git_practice$
git log --pretty=oneline
a9d74d87f1aa3b8f5b2688cb586eac1a908cfc7f Started project.
git_practice$
标志--pretty=oneline指定显示两项最重要的信息:提交的引用ID以及为提交记录的消息。
- 第二次提交
为展示版本控制的强大威力,我们需要对项目进行修改,并提交所做的修改。为此,我们在hello_world.py中再添加一行代码:
$
more hello_world.py
print("Hello Git world!")
print("Hello everyone.")
如果我们现在查看项目的状态,将发现Git注意到了这个文件发生了变化:
git_practice$
git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: hello_world.py
#
no changes added to commit (use "git add" and/or "git commit -a")
git_practice$
输出指出了我们当前所在的分支、被修改了的文件的名称,还指出了所做的修改未提交。下面来提交所做的修改,并再次查看状态:
git_practice$
git commit -am "Extended greeting."
[master 08d4d5e] Extended greeting.
1 file changed, 1 insertion(+)
git_practice$
git status
# On branch master
nothing to commit, working directory clean
git_practice$
git log --pretty=oneline
08d4d5e39cb906f6cff197bd48e9ab32203d7ed6 Extended greeting.
be017b7f06d390261dbc64ff593be6803fd2e3a1 Started project.
git_practice$
我们再次执行了提交,并在执行命令git commit时指定了标志-am。标志-a让Git将仓库中所有修改了的文件都加入到当前提交中(如果你在两次提交之间创建了新文件,可再次执行命令git add .将这些新文件加入到仓库中)。标志-m让Git在提交历史中记录一条消息。我们查看项目的状态时,发现工作目录也是干净的。最后,我们发现提交历史中包含两个提交。
- 撤销修改
下面来看看如何放弃所做的修改,恢复到前一个可行状态。为此,首先在hello_world.py中再添加一行代码:
$
more hello_world.py
print("Hello Git world!")
print("Hello everyone.")
print("Oh no, I broke the project!")
查看状态,发现Git注意到了所做的修改:
git_practice$
git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: hello_world.py
#
no changes added to commit (use "git add" and/or "git commit -a")
git_practice$
Git注意到我们修改了hello_world.py。我们可以提交所做的修改,但这次我们不提交所做的修改,而要恢复到最后一个提交(我们知道,那次提交时项目能够正常地运行)。为此,我们不对hello_world.py执行任何操作,在终端会话中执行如下命令:
git_practice$
git checkout .
git_practice$
git status
# On branch master
nothing to commit, working directory clean
git_practice$
命令git checkout让你能够恢复到以前的任何提交。命令git checkout .放弃自最后一次提交后所做的所有修改,将项目恢复到最后一次提交的状态。hello_world.py被修改成了下面这样:
print("Hello Git world!")
print("Hello everyone.")
- 检出以前的提交
Git可以检出提交历史中的任何提交,而不仅仅是最后一次提交,为此可在命令git check末尾指定该提交的引用ID的前6个字符。通过检出以前的提交,你可以对其进行审核,然后返回到最后一次提交,或者放弃最近所做的工作,并选择以前的提交:
git_practice$
git log --pretty=oneline
08d4d5e39cb906f6cff197bd48e9ab32203d7ed6 Extended greeting.
be017b7f06d390261dbc64ff593be6803fd2e3a1 Started project.
git_practice$ git checkout be017b
Note: checking out 'be017b'.
。。。
HEAD is now at be017b7... Started project.
git_practice$
检出以前的提交后,你将离开分支master,并进入Git所说的分离头指针( detached HEAD)状态。 HEAD表示项目的当前状态,之所以说我们处于分离状态,是因为我们离开了一个命名分支(这里是master)。要回到分支master,可检出它:
git_practice$
git checkout master
Previous HEAD position was be017b7... Started project.
Switched to branch 'master'
git_practice$
这让你回到分支master。除非你要使用Git的高级功能,否则在检出以前的提交后,最好不要对项目做任何修改。然而,如果参与项目开发的人只有你自己,而你又想放弃较近的所有提交,并恢复到以前的状态,也可以将项目重置到以前的提交。为此,可在处于分支master上的情况下,执行如下命令:
git_practice$
git status
# On branch master
nothing to commit, working directory clean
git_practice$
git log --pretty=oneline
08d4d5e39cb906f6cff197bd48e9ab32203d7ed6 Extended greeting.
be017b7f06d390261dbc64ff593be6803fd2e3a1 Started project.
git_practice$
git reset --hard be017b
HEAD is now at be017b7 Started project.
git_practice$
git status
# On branch master
nothing to commit, working directory clean
git_practice$
git log --pretty=oneline
be017b7f06d390261dbc64ff593be6803fd2e3a1 Started project.
git_practice$
首先查看了状态,确认我们在分支master上。查看提交历史时,我们看到了两个提交。接下来,我们执行命令
git reset --hard,并在其中指定了要永久地恢复到的提交的引用ID的前6个字符。再次查看状态,发现我们在分支master上,且没有需要提交的修改。再次查看提交历史时,发现我们处于要从它重新开始的提交中。
- 删除仓库
有时候,仓库的历史记录被你搞乱了,而你又不知道如何恢复且参与项目开发的只有你一个人,可继续使用这些文件,但要将项目的历史记录删除——删除目录.git。这不会影响任何文件的当前状态,而只会删除所有的提交,因此你将无法检出项目的其他任何状态。为此,可打开一个文件浏览器,并将目录.git删除,也可通过命令行完成这个任务。这样做后,你需要重新创建一个仓库,以重新对修改进行跟踪:
git_practice$
git status
# On branch master
nothing to commit, working directory clean
git_practice$
rm -rf .git
git_practice$
git status
fatal: Not a git repository (or any of the parent directories): .git
git_practice$
git init
Initialized empty Git repository in git_practice/.git/
git_practice$
git status
# On branch master
#
# Initial commit
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# .gitignore
# hello_world.py
#
nothing added to commit but untracked files present (use "git add" to track)
git_practice$
git add .
git_practice$
git commit -m "Starting over."
[master (root-commit) 05f5e01] Starting over.
2 files changed, 2 insertions(+)
create mode 100644 .gitignore
create mode 100644 hello_world.py
git_practice$
git status
# On branch master
nothing to commit, working directory clean
git_practice$