一、安装

1.1windows

要在Windows系统中安装Git,请访问http://msysgit.github.io/,并单击Download。安装。

1.2 在 Linux 系统中安装 Git

要在Linux系统中安装Git,请执行如下命令即可:

sudo apt-get install git

1.3 在 OS X 系统中安装 Git

  • 你的OS X系统可能已经安装了Git,因此请尝试执行命令git --version。如果你在输出中看

    到了具体的版本号,说明你的系统安装了Git;如果你看到一条消息,提示你安装或升级Git,只

    需按屏幕上的说明做即可。
  • 你也可以访问https://git-scm.com/,单击链接Downloads,再单击适合你所用系统的安装程序

二、Git的配置

Git跟踪谁修改了项目,哪怕参与项目开发的人只有一个。为此, Git需要知道你的用户名和

电子邮件地址。你必须提供用户名,但可以使用虚构的电子邮件地址(会在提交时提醒输入:八步):

$ git config --global user.name "username"
$ git config --global user.email "username@example.com"

三、创建项目

我们来创建一个要进行版本控制的项目。在你的系统中创建一个文件夹,并将其命名为

git_practice。在这个文件夹中,创建一个简单的Python程序:

hello_world.py:

print("Hello Git world!")

四、忽略文件

扩展名为.pyc的文件是根据.py文件自动生成的,因此我们无需让Git跟踪它们。这些文件存

储在目录__pycache__中。为让Git忽略这个目录,创建一个名为.gitignore的特殊文件(这个文件

名以句点打头,且没有扩展名),并在其中添加下面一行内容:

【.gitignore】

__pycache__/

这让Git忽略目录__pycache__中的所有文件。使用文件.gitignore可避免项目混乱,开发起来

更容易。

五、初始化仓库

你创建了一个目录,其中包含一个Python文件和一个.gitignore文件,可以初始化一个Git仓库

了。为此,打开一个终端窗口,切换到文件夹git_practice,并执行如下命令:

git_practice$ git init
# Initialized empty Git repository in git_practice/.git/
git_practice$

输出表明Git在git_practice中初始化了一个空仓库。仓库是程序中被Git主动跟踪的一组文件。

Git用来管理仓库的文件都存储在隐藏的.git/中,你根本不需要与这个目录打交道,但千万不要删

除这个目录,否则将丢弃项目的所有历史记录。

六、检查状态

执行其他操作前,先来看一下项目的状态:

git_practice$ git status
【1】# On branch master
# Initial commit 【2】 # Untracked files:
# (use "git add <file>..." to include in what will be committed)
# .gitignore
# hello_world.py 【3】# nothing added to commit but untracked files present (use "git add" to track)
git_practice$

在Git中, 分支是项目的一个版本。从这里的输出可知,我们位于分支master上(见【1】)。你

每次查看项目的状态时,输出都将指出你位于分支master上。接下来的输出表明,我们将进行初

始提交。 提交是项目在特定时间点的快照。

Git指出了项目中未被跟踪的文件(见【2】),因为我们还没有告诉它要跟踪哪些文件。接下来,

我们被告知没有将任何东西添加到当前提交中,我们需要将未跟踪的文件加入到仓库中

(见【3】)。

七、将文件加入到仓库中

下面将这两个文件加入到仓库中,并再次检查状态:

【1】 git_practice$ git add .
【2】 git_practice$ git status
# On branch master
# Initial commit
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage) 【3】 # new file: .gitignore
# new file: hello_world.py git_practice$

命令git add .将项目中未被跟踪的所有文件都加入到仓库中(见【1】)。它不提交这些文件,

而只是让Git开始关注它们。现在我们检查项目的状态时, 发现Git找出了需要提交的一些修改(见

【2】)。标签new file意味着这些文件是新添加到仓库中的(见【3】)。

八、执行提交

下面来执行第一次提交:

【1】git_practice$ git commit -m "Started project."
【2】# [master (root-commit) c03d2a3] Started project.
【3】# 2 files changed, 1 insertion(+)
# create mode 100644 .gitignore
# create mode 100644 hello_world.py
【4】 git_practice$ git status
# On branch master
# nothing to commit, working directory clean
git_practice$

我们执行命令git commit -m "message"(见【1】)以拍摄项目的快照。标志-m让Git将接下来的

消息("Started project.")记录到项目的历史记录中。输出表明我们在分支master上(见【2】),

且有两个文件被修改了(见【3】)。

现在我们检查状态时,发现我们在分支master上,且工作目录是干净的(见【4】)。这是你每次

提交项目的可行状态时都希望看到的消息。如果显示的消息不是这样的,请仔细阅读,很可能你

在提交前忘记了添加文件。

九、查看提交历史

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提供了

一个选项,让你能够打印提交历史条目的更简单的版本:

git_practice$ git log --pretty=oneline
# a9d74d87f1aa3b8f5b2688cb586eac1a908cfc7f Started project.
git_practice$

标志--pretty=oneline指定显示两项最重要的信息:提交的引用ID以及为提交记录的消息。

9.1第二次提交

为展示版本控制的强大威力,我们需要对项目进行修改,并提交所做的修改。为此,我们在

hello_world.py中再随便添加一行代码:

print("Hello Git world!")
print("Hello everyone.")

如果我们现在查看项目的状态,将发现Git注意到了这个文件发生了变化:

git_practice$ git status
【1】# 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) 【2】 # modified: hello_world.py 【3】# no changes added to commit (use "git add" and/or "git commit -a")
git_practice$

输出指出了我们当前所在的分支(见【1】)、被修改了的文件的名称(见【2】),还指出了所做的

修改未提交(见【3】)。下面来提交所做的修改,并再次查看状态:

【1】 git_practice$ git commit -am "Extended greeting."
# [master 08d4d5e] Extended greeting.
# 1 file changed, 1 insertion(+)
【2】 git_practice$ git status
# On branch master
# nothing to commit, working directory clean
【3】 git_practice$ git log --pretty=oneline
# 08d4d5e39cb906f6cff197bd48e9ab32203d7ed6 Extended greeting.
# be017b7f06d390261dbc64ff593be6803fd2e3a1 Started project.
git_practice$

我们再次执行了提交,并在执行命令git commit时指定了标志-am(见【1】)。标志-a让Git将仓

库中所有修改了的文件都加入到当前提交中(如果你在两次提交之间创建了新文件,可再次执行

命令git add .将这些新文件加入到仓库中)。标志-m让Git在提交历史中记录一条消息。

我们查看项目的状态时,发现工作目录也是干净的(见【2】)。最后,我们发现提交历史中包

含两个提交(见【3】)

十、撤销修改

下面来看看如何放弃所做的修改,恢复到前一个可行状态。为此,首先在hello_world.py中再

添加一行代码:

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) 【1】 # modified: hello_world.py
#no changes added to commit (use "git add" and/or "git commit -a")
git_practice$

Git注意到我们修改了hello_world.py(见【1】)。我们可以提交所做的修改,但这次我们不提交

所做的修改,而要恢复到最后一个提交(我们知道,那次提交时项目能够正常地运行)。为此,

我们不对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'.
【1】 # You are in 'detached HEAD' state. You can look around, make experimental
# changes and commit them, and you can discard any commits you make in this
# state without impacting any branches by performing another checkout.
# If you want to create a new branch to retain commits you create, you may
# do so (now or later) by using -b with the checkout command again. Example:
git checkout -b new_branch_name
# HEAD is now at be017b7... Started project.
git_practice$

检出以前的提交后,你将离开分支master,并进入Git所说的分离头指针(detached HEAD)

状态(见【1】)。 HEAD表示项目的当前状态,之所以说我们处于分离状态,是因为我们离开了一个

命名分支(这里是master)。

要回到分支master,可检出它:

git_practice$ git checkout master
# Previous HEAD position was be017b7... Started project.
# Switched to branch 'master'
git_practice$

这让你回到分支master。除非你要使用Git的高级功能,否则在检出以前的提交后,最好不要

对项目做任何修改。然而,如果参与项目开发的人只有你自己,而你又想放弃较近的所有提交,

并恢复到以前的状态,也可以将项目重置到以前的提交。为此,可在处于分支master上的情况下,

执行如下命令:

【1】git_practice$ git status
# On branch master
# nothing to commit, working directory clean
【2】 git_practice$ git log --pretty=oneline
# 08d4d5e39cb906f6cff197bd48e9ab32203d7ed6 Extended greeting.
# be017b7f06d390261dbc64ff593be6803fd2e3a1 Started project.
【3】 git_practice$ git reset --hard be017b
# HEAD is now at be017b7 Started project.
【4】 git_practice$ git status
# On branch master
# nothing to commit, working directory clean
【5】 git_practice$ git log --pretty=oneline
# be017b7f06d390261dbc64ff593be6803fd2e3a1 Started project.
git_practice$

我们首先查看了状态,确认我们在分支master上(见【1】)。查看提交历史时,我们看到了两个

提交(见【2】)。接下来,我们执行命令git reset --hard,并在其中指定了要永久地恢复到的提交

的引用ID的前6个字符(见【3】)。再次查看状态,发现我们在分支master上,且没有需要提交的修

改(见【4】)。再次查看提交历史时,发现我们处于要从它重新开始的提交中(见【5】)。

十二、删除仓库

有时候,仓库的历史记录被你搞乱了,而你又不知道如何恢复。在这种情况下,你首先应考

虑使用附录C介绍的方法寻求帮助。如果无法恢复且参与项目开发的只有你一个人,可继续使用

这些文件,但要将项目的历史记录删除——删除目录.git。这不会影响任何文件的当前状态,而

只会删除所有的提交,因此你将无法检出项目的其他任何状态。

为此,可打开一个文件浏览器,并将目录.git删除,也可通过命令行完成这个任务。这样做

后,你需要重新创建一个仓库,以重新对修改进行跟踪。下面演示了如何在终端会话中完成这个

过程:.

【1】 git_practice$ git status
# On branch master
# nothing to commit, working directory clean
【2】 git_practice$ rm -rf .git
【3】 git_practice$ git status
# fatal: Not a git repository (or any of the parent directories): .git
【4】 git_practice$ git init
# Initialized empty Git repository in git_practice/.git/
【5】 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)
【6】 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
【7】git_practice$ git status
# On branch master
# nothing to commit, working directory clean
git_practice$

我们首先查看了状态,发现工作目录是干净的(见【1】)。接下来,我们使用命令rm -rf .git

(在Windows系统中,应使用命令rmdir /s .git)删除了目录.git(见【2】)。删除文件夹.git后,当

我们再次查看状态时,被告知这不是一个Git仓库(见【3】)。 Git用来跟踪仓库的信息都存储在文件

夹.git中,因此删除该文件夹也将删除整个仓库。

接下来,我们使用命令git init新建一个全新的仓库(见【4】)。然后,我们查看状态,发现

又回到了初始状态,等待着第一次提交(见【5】)。我们将所有文件都加入仓库,并执行第一次提

交(见【6】)。然后,我们再次查看状态,发现我们在分支master上,且没有任何未提交的修改(见

【7】)。

需要经过一定的练习才能学会使用版本控制,但一旦开始使用,你就再也离不开它。

用Git管理项目进行版本控制的更多相关文章

  1. 使用 Git 命令去管理项目的版本控制(一)

    参考资料:参考  参考 声明本文是作者原创,是自己的学习笔记,仅供学习参考. 在 10.11.2Mac系统中,要显示隐藏的文件夹使用命令行: defaults write com.apple.find ...

  2. 如何用Android Studio同时使用SVN和Git管理项目

    这篇来讲讲如何在 Android Studio 上同时用 SVN 和 Git 来管理项目.我知道,你肯定会说我吃饱了撑着,没事找事做,为啥要同时用 SVN 和 Git 来管理项目.问题是,我也不想啊, ...

  3. 【Unity】使用Git管理项目及其.gitignore写法

    完整的进行Unity 3D源码用Git管理的流程: 1 新建文件夹(路径要求非空) 2 新建U3D项目 3 添加.gitignore文件 获取已有的U3D项目 修改Unity 3D编辑器: Enabl ...

  4. IDEA使用Git管理项目

    今天将项目使用Git管理了,IDEA. 第一步: 第二步:

  5. vs2015使用Git管理项目

    初级 1,在码云上去注册一个帐号(码云的私有库是免费的,安全性怎么样我不知道) 2,在码云上新建一个项目,把相关的开发人员加到这个项目里,会得到这个项目在码云上的远程仓库的地址. 3,打开vs2015 ...

  6. 【转载】使用阿里云code和git管理项目

    使用代码云托管和git来管理项目可以使多客户端和多人开发更加高效.通过对比github,bitbucket和国内一些云托管服务发现阿里云在项目空间和传输速度及稳定性上更能满足公司开发的要求.本文将介绍 ...

  7. 使用 Git 命令去管理项目的版本控制(二)

    参考 上一篇  完成本篇博客,本篇为作者原创,仅供学习参考. 本篇博文在上一篇的基础上这里记录了我的一个小模拟练习.本篇作为自己的学习笔记,也意在方便其他人的学习使用,达到分享目的.下面主要是操作截图 ...

  8. git - 管理项目(SourceTree的使用)

    Git 相关命令操作全 1.SourceTree 是什么? SourceTree 是 Windows 和Mac OS X 下免费的 Git 和 Hg 客户端,拥有可视化界面,容易上手操作.同时它也是M ...

  9. 一个看起来不像中年人的中年人,带着两个初出茅庐的小伙子儿,用git管理项目代码的进击之路

    一个中年人的孤独前行 我们这一代人,是上个世纪的人,活在当下,已然成为社会上的中流砥柱. 80年代生人,遥望我们的父辈,均是5.60年代的人,迟迟暮年,夕夕老矣.而我们,正当年,却又时光飞逝,很快便要 ...

随机推荐

  1. 题解 nflsoj553 【六校联合训练 省选 #10】飞

    题目链接 我们称"简要题意"给出的三个要求分别为"条件1","条件2","条件3". 条件3长得比较丑,考虑转化一下.把 ...

  2. Java的equals方法实现及其细节

    判断两个对象是否等价,是OOP编程中常见的需求(下面围绕Java来进行阐述). 考虑这样几种情况:通过某个特征值来判断两个对象是否“等价”,当这两个对象等价时,判断结果为true,否则结果为false ...

  3. GIMP

    1. 认识GIMP 2. GIMP与Photoshop的对比 3. GIMP官方手册教程 4. 2本GIMP的外文书下载 5. 2个外部入门教程 6. 其他相关软件 1. 认识GIMP GIMP是可用 ...

  4. @Controller 和 @RestController 的区别

    @Controller和@RestController的区别? 官方文档:@RestController is a stereotype annotation that combines @Respo ...

  5. 「NOIP2016」愤怒的小鸟

    传送门 Luogu 解题思路 首先这个数据范围十分之小啊. 我们考虑预处理出所有可以带来贡献的抛物线 三点确定一条抛物线都会噻 然后把每条抛物线可以覆盖的点状压起来,然后状压DP随便转移就好了. 有一 ...

  6. Nginx配置详解 http://www.cnblogs.com/knowledgesea/p/5175711.html

    Nginx配置详解 序言 Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的.从2004年发布至今,凭借开源的力量,已经接近成熟与完善. Nginx功能丰富,可作 ...

  7. 玩玩负载均衡---在window与linux下配置nginx

      最近有些时间,开始接触负载均衡方面的东西,从硬件F5再到Citrix Netscalar.不过因为硬件的配置虽然不复杂,但昂贵的价格也让一般用户望而却步(十几万到几十万),所以只能转向nginx, ...

  8. JuJu团队1月4号工作汇报

    JuJu团队1月4号工作汇报 JuJu   Scrum 团队成员 今日工作 剩余任务 困难 飞飞 将model嵌入GUI 美化UI 无 婷婷 调试代码 提升acc 无 恩升 -- 写python版本的 ...

  9. python中软件开发规范,模块,序列化随笔

    1.软件开发规范 首先: 当代码都存放在一个py文件中时会导致 1.不便于管理,修改,增加 2.可读性差 3.加载速度慢 划分文件1.启动文件(启动接口)--starts文件放bin文件里2.公共文件 ...

  10. 【HITB GSEC CTF 2017】1000levels

    https://files.cnblogs.com/files/p4nda/498a3f10-8976-4733-8bdb-30d6f9d9fdad.gz #通过阅读天枢战队大佬们的wp调试的结果 首 ...