Git基础教程

Git是什么?

Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。

Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

Git 与常用的版本控制工具 CVS,Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。

Git安装和基本配置

安装: 下载git windows版

Git 提供了一个叫做 git config 的工具,专门用来配置或读取相应的工作环境变量。

这些环境变量,决定了 Git 在各个环节的具体工作方式和行为。这些变量可以存放在以下三个不同的地方:

  • /etc/gitconfig 文件: 系统中对所有用户都普遍适用的配置。若使用 git config 时用 --system 选项,读写的就是这个文件。

  • ~/.gitconfig 文件: 用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件。

  • .git/config 文件: 当前项目的 Git 目录中的配置文件。这里的配置仅仅针对当前项目有效。若使用 git config 时用 --local 选项,读写的就是这个文件。

每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。

在 Windows 系统上,Git 会找寻用户主目录下的 .gitconfig 文件。主目录即 $HOME 变量指定的目录,一般都是 C:\User\$USER

此外,Git 还会尝试找寻 /etc/gitconfig 文件,只不过看当初 Git 装在什么目录,就以此作为根目录来定位。

查看配置:

配置编缉器: 可以配置默认的文本编辑器,Git 在需要你输入一些消息时会使用该文本编辑器。缺省情况下,Git 使用系统的缺省编辑器,这通常可能是 vi 或者 vim 。

配置比较工具:

Git 可以接受 kdiff3、tkdiff、meld、xxdiff、emerge、vimdiff、gvimdiff、ecmerge 和 opendiff 作为有效的合并工具。

配置客户端对比工具:

说明:"\"C:\\Program Files\\Beyond Compare 4\\BCompare.exe\" \"\$LOCAL\" \"\$REMOTE\""

表示找到可执行文件 BCompare.exe ,传递两个参数,开始运行软件。可执行文件路径后面是两个参数,用空格分开。\"、\$ 是对字符的转义。

  • 第一个表示调用可执行文件的路径;

  • 第二个 $LOCAL 表示远程文件临时存储在本地的路径;

  • 第三个 $REMOTE 表示去拿当前需要比较的文件。

最后,用 git difftool 代替 git diff 命令。

Git基本概念

Git的四个区域

  • 工作区: 就是平时存放项目代码的目录;

  • 暂存区: 用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index);

  • 版本库或本地仓库: 本地的一个目录,有一个隐藏目录 .git

  • 远程仓库: 托管代码的服务器。如:gitlab、github 等。

文件的四种状态

  • 未跟踪: 此文件在文件夹中,但并没有加入到仓库, 不参与版本控制。

  • 未修改: 文件已经入库,且工作区的文件与版本库中的文件快照内容完全一致。这种类型的文件有两种去处:被修改,变为已修改状态;被删除,变为未跟踪状态。

  • 已修改: 文件仅仅是修改,修改内容还在工作区。这个文件也有两个去处:通过 git add 进入暂存区,变为暂存状态;使用 git checkout,丢弃修改过,返回未修改状态。

  • 暂存状态: 文件存放在暂存区。执行 git commit 则将修改同步到本地仓库中。这时本地仓库中的文件和工作区文件又变为一致,文件为未修改状态。执行 git reset HEAD 会取消暂存,返回修改状态。

Git工作流程

  • 创建或克隆 Git 仓库;

  • 在工作区添加、修改文件;

  • 将工作区文件放入暂存区;

  • 将暂存区文件提交到本地仓库;

  • 将本地仓库文件提交到远程仓库。

创建仓库

新建一个仓库

语句: git init

Git 使用 git init 命令来初始化一个 Git 仓库,Git 的很多命令都需要在 Git 的仓库中运行,所以 git init 是使用 Git 的第一个命令。

首先需要进入项目目录,不同系统上的做法有些不同:

  • 在 Linux 上:$ cd /home/user/my_project

  • 在 macOS 上:$ cd /Users/user/my_project

  • 在 Windows 上:$ cd /c/user/my_project

git init 命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干。 但是,在这个时候,我们仅仅是做了一个初始化的操作,你的项目里的文件还没有被跟踪。

克隆已有仓库

语句: git clone

创建一个本地或远程仓库的克隆版本:

默认会在当前目录下创建一个以被克隆仓库名一样的文件夹,文件夹包含一个 .git 子文件夹(存放远程仓库拉取下所有版本信息),以及仓库中所有文件。

Git 支持多种数据传输协议。 上面的例子使用的是 https:// 协议,不过你也可以使用 git:// 协议或者使用 SSH 传输协议,比如 git@github.com:1927344728/xxxx

如果仓库太大,可以在 git clone 中加入参数 ``--depth=1`,只拉取最近的一个 revision。

如果后面想看历史的版本,那么也很好办,使用 git fetch 即可。

git clone特别慢是因为github.global.ssl.fastly.net域名被限制了。Git速度太慢问题

对于远程私有项目,需要输入账号和密码。为了避免每次下载和上传都输入,可以使用 github SSH

Git基本操作

Git 的工作就是创建和保存你项目的快照及与之后的快照进行对比。

Git 常用的命令,除了 git init、git clone,还有以下命令:

  • git status

  • git add

  • git commit

  • git reset

  • git checkout

  • git pull

  • git push

查看文件状态

语句: git status

查看所有文件(或指定文件)状态。

工作区 ==> 暂存区

语句: git add

添加指定所有文件(或目录、或单个文件)到暂存区。

暂存区 ==> 本地仓库

语句: git commit

将暂存区的内容提交到本地仓库。

暂存区、本地仓库 ==> 工作区、暂存区

语句: git reset [--soft | --mixed | --hard] [HEAD]

用于回退版本,可以指定退回某一次提交的版本。

HEAD 表示当前版本、HEAD^ 上一个版本、HEAD^^ 上上一个版本、HEAD^^^ 上上上一个版本。。。

HEAD0 表示当前版本、HEAD1 上一个版本、HEAD^2 上上一个版本、HEAD^3 上上上一个版本。。。

恢复工作区

语句: git checkout

用于切换分支或恢复工作区文件。

远程仓库 ==> 本地仓库

语句: git pull <远程主机名> <远程分支名>:<本地分支名>

用于从远程获取代码并合并本地的版本。

注意: 以下示例是基于本地仓库已与远程仓库关联。如果尚未关联,请查看下文 【远程仓库管理】。

本地仓库 ==> 远程仓库

语句: git push <远程主机名> <本地分支名>:<远程分支名>

注意: 以下示例是基于本地仓库已与远程仓库关联。如果尚未关联,请查看下文 【远程仓库管理】。

分支管理

几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。

分支管理包括本地分支管理和远程分支管理,以及两者的同步。

合并分支

语句: git merge

用于将另外一个或一个以上的分支合并到当前分支。该命令由 git pull 用于合并来自另一个存储库的更改,可以手动使用将更改从一个分支合并到另一个分支。

如果你和另一个开发者,修改了同一个文件,这时候 merge 可能会发生冲突(系统无法判断该用谁的修改),需要手动处理一下。

当产生合并冲突时,文件中冲突部分会以 <<<<<<<=======>>>>>>> 表示。在 ======= 之前的部分是当前分支这边的情况,在 ======= 之后的部分是对方分支的情况。

在看到冲突以后,你可以选择以下两种方式:

  • **决定不合并。**这时,唯一要做的就是重置 index 到 HEAD 节点。git merge --abort 用于这种情况。

  • 解决冲突。 Git 会标记冲突的地方,解决完冲突后(手动删除 <<<<<<<=======>>>>>>> 等,并删除不需要的修改内容),再使用 git add 加入到暂存区,然后使用 git commit 产生合并节点。

远程仓库管理

假设,你已经在本地创建了一个Git 仓库,又在 GitHub 创建一个 Git 仓库,并且让两者关联,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作。

以下是关于远程仓库的一些操作:

查看提交历史

查看提交记录

语句: git log

查看本地仓库中所有的提交记录。

推荐别名: git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative"

语句: git reflog

查看所有分支的所有操作记录,包括 commit 和 reset 的操作,已经被删除的commit记录。git log 是不能查看已经删除的记录。git reflog 可以很好地帮助你恢复你误操作的数据,

查看指定文件提交记录

语句: git blame <file>

用于查看指定文件的修改记录,以列表形式显示修改记录。

其他操作

对比操作

语句: git diff [file]

用于对比工作区、暂存区、本地仓库之间的更改。

标签管理

语句: git tag [-a] [-f] [-m <msg>] <tagname> [<commit>]

用于创建,列出,删除或验证使用 GPG 签名的标签对象。

用于在开发阶段,某个阶段的完成,创建一个版本,可以创建一个 tag 来指向软件开发中的一个关键时期。比如:版本号更新的时候可以建一个 v1.0,v1.2 之类的标签,这样在以后回顾的时候会比较方便。

储藏工作区

语句: git stash

用于保存工作区目录和索引的当前状态,并恢复工作区以匹配 HEAD 提交。类似于 git checkout .,但是修改内容没有真正丢弃,而是存在仓库的位置,便于下次恢复。

合并多个提交

假设你接到一个临时需求,你在 master 分支上创建新分支 temp 来工作,最后你完成任务时,在 temp 分支提交了10个 commit,准备合并回 master 分支。如果直接用 git merge temp ,这10个 commit 都会一一出现在 master 分支。为让 master 看起来会更简洁一些,通常我们推荐将这些 commit 合并成一个。

方法一:

方法二: 如果你想要保留一些信息,可选用 交互式 rebase。

执行了 rebase 命令之后,终端显示如下:

将 pick 改为 squash 或者 s,保存并关闭文本编辑窗口:

保存退出,Git 会压缩提交历史。

如果有冲突,要注意,修改的时候要保留最新的历史,不然我们的修改就丢弃了。修改后执行如下命令:

如果没有冲突,或者冲突已经解决,则会出现:

输入 wq,保存退出,完合合并。

方法三: 将一个分支合并成一个 commit:

cherry-pick命令

将指定的 commit 合到当前分支。

代码回滚

git reset, 重置当前 HEAD 到指定的 commit。用于回退版本,遗弃不再使用的提交。

git revert, 撤销某次操作,此次操作之前和之后的 commit 和 history 都会保留,并且把这次撤销,作为一次最新的提交。

git checkout, 用于切换分支或恢复工作区文件。

revert 和 reset 的区别: git revert 是用一次新的 commit 来回滚之前的 commit,git reset 是直接删除不需要的 commit。

在回滚这一操作上看,效果差不多,但是在 commit 管理上有区别:

  • git reset 是回滚到指定的 commit,相当于是删除了指定 commit 以后的所有的提交,并且不会产生新的 commit 记录,如果要推送到远程服务器的话,需要强制推送 -f(-f 很危险,不建议使用)。

  • git revert 是对 commit 进行逆向操作,回滚所有代码改动,然后重新生成一个 commit。本身不会对其他的提交 commit 产生影响,如果要推送到远程服务器的话,就是普通的操作 git push 就好了。

注意: 使用 git revert 回滚代码,如果之前的 commit 是从目标分支合并过来的,则 revert 后,想把代码还原,再次把原分支的 commit 合并过来时,代码不会改动。因为,原分支的所有 commit 已经在当前分支了。解决方法: 将 revert 生成的 commit 再 revert 一次,或者将原分支改动生成新的 commit,比如 cherry-pick、多 commit 合为一个,都会生成新的 commit。

文件管理

工作区文件

alias配置文件

  • 一般: ``~/.gitconfig或者当前目录下的.git/config`;

  • Bash: /etc/bashrc~/bash_profile/etc/profile

  • zsh: ~/.zshrc~/.oh-my-zsh/plugins/git/git.plugin.zsh

  • window: C:\Users\$User\.gitconfig,也可以在 C:\Users\$User\.bash_profile 配置。

.gitignore文件

工作区的根目录下创建 .gitignore文件,然后把要忽略的文件夹/文件名填进去。这样当你使用git add .的时候这些文件就会被自动忽略掉。

参考链接

runoob.com-Git 教程

易百-Git教程

git - 简明指南(入门推荐)

Git教程- 廖雪峰的官方网站

最后更新于

这有帮助吗?