在以前公司用过一段时间Git提交代码,但没有怎么去了解,只知道几条指令,现在的工作中又需要用到Git控制版本了,所以就看了些相关资料,根据资料精简整理了一下会用到的部分,并作为笔记整理摘抄了下来,下次再看就不用到处找了。参考文献 http://tinyurl.com/amazonprogit 。
这里内容涉及到的知识点:Git的安装、Git用户邮箱配置、Git新建一个本地仓库、Git克隆一个仓库、还有新手经常要用到的一些简单命令。
约定:下面所有代码并非文件中的代码,而是命令行的单条指令;为作解释故下面有 ' # ' 与 ' >> ' 用以区分。
# 后面跟说明
>> 后面跟命令
- Git的安装
本以为这部分会占用这篇文章的小半个篇幅,但发现Git官方网站上各种系统都有详细的下载安装说明及指令。。。
- Git的配置
1. 初次运行Git前的一些配置 (这些配置工作大多只需改一次,以后升级时就会沿用现在的配置了)。Git的配置既可以修改配置文件也可以使用 git config 工具(即用 git config 指令添加想要的配置项)。
• /etc/gitconfig 文件:系统中对所有用户都适用的配置。使用 git config 加上 --system 选项,读写此文件。
• ~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。使用 git config 加上 --global 选项,读写此文件。
• .git/config文件:工程目录下的配置文件只适用于此工程。使用 git config 不添加选项直接配置属性时,读写此文件。
注意:配置文件适用范围小的配置属性会覆盖范围较大的,小范围文件内没有配置的属性会去一级一级向上找。
2. 设置用户名和邮箱,这里使用了 --global 参数,它所配置的就是位于你的主目录下的配置文件,以后只要你不改变当前用户来登录系统(这里指的是系统用户,如一台电脑有多个用户设置了不同用的户名账户,这里就存在多个系统用户了,--global参数所针对的便是这里的用户)时,如果不在某个项目中特殊设置,都会使用上面设置的信息。当然你有时候会想在某个特定的项目中使用别的用户名或邮箱,这个时候你只要在那个工程目录中使用上面两条指令时不加 --global 选项即可,此时设置的便是当前项目的 .git/config 文件了。
# 设置用户 (注意这里的 '#' 并不是代码中的注释,只是用来说明下面指令的功能)
>> git config --global user.name "wang****qiang"
# 设置用户邮箱
>> git config --global user.email 158****8615@163.com
3. 修改默认使用的文本编辑器,默认会使用操作系统指定的编辑器,可能会是 Vi 或者 Vim。如果你有其他习惯,比如 Emacs 的话,可以重新设置默认编辑器:
>> git config --global core.editor emacs
4. 设置在解决合并冲突时,想要使用哪种差异分析工具。比如要改用xxdiff 的话:
>> git config --global merge.tool xxdiff
Git 可以理解 tkdiff,kdiff3,meld,xxdiff,vimdiff,gvimdiff,opendiff,ecmerge,和 emerge 等合并工具的输出信息。
- 查看Git的相关信息
1. 查看置信息,你可以使用git config --list 命令;有时候你会看到重复的变量名,那是因为它们来自不同的配置文件(比如/etc/gitconfig 和~/.gitconfig)。
>> git config --list
2. 获取帮助有下面三种格式(代码以git <verb> --help为例,查看config配置帮助信息):
git help <verb>、man git-<verb>、git <verb> --help
>> git config --help
- Git新手的一些基础操作
- 一、 本地仓库的一些操作
1. git init :新建一个本地Git仓库
# 1. 初始化Git仓库
>> git init
# 2. 添加项目中需要跟踪的文件(以C语言中的源文件为例如下)
>> git add *.c
# 3. 将跟踪过的文件提交到本地仓库
>> git commit -m '本次提交的附带说明'
2. git clone [url] :从现有仓库获取一个本地仓库
# git所克隆的工程不仅限于远程服务器,也可以是本地、共享等。
# 以Windows下的darknet工程为例,我们将该工程获取到本地
>> git clone https://github.com/AlexeyAB/darknet.git
3. git status :查看当前仓库中文件的状态
工作目录下的所有文件都不外乎这两种状态:已跟踪或未跟踪。已跟踪的文件是指本来就被纳入版本控制管理的文件,在上次快照中有它们的记录,工作一段时间后,它们的状态可能是未更新,已修改或者已放入暂存区。而所有其他文件都属于未跟踪文件,它们既没有上次更新时的快照,也不在当前的暂存区域。初次克隆得到的仓库,工作目录中的所有文件都是已跟踪文件,且状态为未修改。对已跟踪的文件编辑后,Git便会把这些文件标记为已修改状态。我们可以用 git status 命令查看工作目录下的文件状态:
# 我们可以根据此命令的输出判断出工作区对应文件的状态
# 1. 命令: git status
# 2. 输出:
# a. nothing to commit(working directory clean)
# 这表示你的工作区很干净,未做任何修改
# b. Untracked files:
# (use "git add <file>..." to include in what will be committed)
# 这后边的文件为Git未跟踪的文件,可用git add 将其添加到暂存区使其被跟踪
# c. Changed but not update:
# (use "git add <file>..." to update what will be committed)
# 这后面的文件为Git已跟踪的文件,修改后但未被添加到暂存区,可用git add 将其添加到暂存区
# d. Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
# 这后面的文件为Git已暂存的文件,使用git commit 提交的文件就是这些处于暂存状态的文件
>> git status
4. git add [filename] / git add [path] / git add [FilterMethod]:将需要跟踪的文件添加到暂存区
上面我们已经说过了,我们的工程或者说是仓库中的文件都是已经被跟踪和未被跟踪的文件。而 git add 既可以帮我们将未被跟踪的文件添加到暂存区,也可以将已跟踪但被修改了的文件添加到暂存区,这些被 git add 操作过的文件都已被 git 所跟踪。从上面的几条命令我们可以看出来, git add 是很强大的(这是个多功能命令,根据目标文件的状态不同,此命令的效果也不同:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等),这里暂时先记录一下简单的用法。
# 1. git add filename 添加单个文件,如下添加 main.c 文件
git add main.c
# 2. git add path 按路径添加,git会递归该路径下的所有文件
git add /home/Project/studygit/src/
# 3. git add filterMethod 按文件筛选方法,添加符合条件的文件
git add *.h
5. git commit :提交更新
这里有一些新手可能会误认为:如果我想将我的贡献提交到某个远程仓库,用这条指令就可以了。其实不是的,这条指令依然是本地操作,它只是将你所做的修改提交到了本地的仓库,这也是git的强大之处,几乎大部分操作都不需要联网就可以完成。这里暂时介绍三种提交方法:
# 1. git commit 命令说明:不加参数这种方式会启动文本编辑器以便输入本次提交的说明。
# (默认会启用 shell 的环境变量 $EDITOR 所指定的软件,一般都是 vim 或 emacs。)
# 文本编辑器中会默认包含最后一次git status的输出,你可以在这里添加本次修改的BUG
# 或者新加的功能等提交信息,保存并退出后会看到提交成功的输出提示。
git commit
# 2. git commit -m "本次提交更新的信息" 命令说明:-m 参数后面添加信息后,便可跳过编辑文本的步骤
git commit -m "clear a Bug"
# 3. git commit -a -m "本次提交更新的信息" 命令说明:-a 参数跳过使用暂存区直接提交
# 尽管使用暂存区域的方式可以精心准备要提交的细节,但有时候这么做略显繁琐。
# Git 提供了一个跳过使用暂存区域的方式,只要在提交的时候,给 git commit 加上 -a 选项,
# Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤:
git commit -a -m "clear a Bug"
6. git commit --amend :修改最后一次提交操作
任何时候,你都有可能需要撤消刚才所做的某些操作。但请注意,有些操作并不总是可以撤消的,所以请务必谨慎小心,一旦失误,就有可能丢失部分工作成果。有时候我们提交完了才发现漏掉了几个文件没有加,或者提交信息写错了。想要撤消刚才的提交操作,可以使用 --amend 选项重新提交:
# 修改上一次提交操作指令:
git commit --amend
# 示例:比如我们上一次提交时遗漏了一个文件,我们可以先用 git add 将其添加暂存区,
# 然后再用 git commit --amend 将刚刚的 add 操作放入上一次提交中
# git commit -m "do something"
# git add file
# git commit --amend
# 这三条命令相当于只提交了一次
7. git reset HEAD <file>... :取消暂存某个文件
我们刚开始时不小心用了 git add * 将当前目录下的所有文件都添加到暂存区了,我们并不想跟踪里边包含了一些没用的文件时就可以使用 git reset HEAD ... 命令取消某个暂存文件。
# git reset HEAD <file> 这个一般是用在某个被新加入到暂存区的多余文件
# 例如:有些编辑器修改文件后会生成我们不想跟踪的备份文件
git reset HEAD main.c.bak
8. git checkout -- <file>... 取消对文件的修改
当我们觉得对某个文件的修改是完全没必要的或者是错误的,这时可以使用 git checkout -- <file> 来取消对文件的修改。值得注意的是:这条命令是比较危险的,执行完后,对指定文件的修改都会消失,所以使用前务必慎重。如果我们只是想用以前的版本,又想要保留当前的文件,可以使用Git的分支。
# 我们来对main.c的修改进行撤销
git checkout -- main.c
9. git log :查看提交历史
在提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,可以使用 git log 命令。
10. 使用 .gitignore 文件来忽略一些不需要跟踪的文件
有时我们的工程中不小心跟踪了一些不必要的文件,于是想要在跟踪文件中去掉这些使工程更简洁,此时就需要用 .gitignore 文件中的内容对跟踪的文件进行筛选。大多从远程克隆下来的工程都会有这个文件,它所在的位置是与该工程的 .git 目录同级。如果是本地新建的仓库,你可以自己在对应 .git 的同一级目录下新建一个.gitignore 文件,然后对你想忽略的文件进行筛选。如果你新建的仓库不知道要怎么写这个忽略文件,你可以去网上clone一个开源的项目,学习一下这个文件要如何编写,它是怎样进行筛选的,下面是一个简单的 .gitignore 文件的内容示例:
# 此为注释– 将被Git 忽略
*.a # 忽略所有.a 结尾的文件
!lib.a # 但lib.a 除外
/TODO # 仅仅忽略项目根目录下的TODO 文件,不包括subdir/TODO
build/ # 忽略build/ 目录下的所有文件
doc/*.txt # 会忽略doc/notes.txt 但不包括doc/server/arch.txt