Git简介
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。
Git安装
在使用Git前我们需要先安装 Git。Git 目前支持 Linux/Unix、Solaris、Mac和 Windows 平台上运行。
官网下载太慢,我们可以使用淘宝镜像下载。
Git 官方下载地址
淘宝镜像下载地址
安装成功后在开始菜单中会有Git项,菜单下有3个程序:任意文件夹下右键也可以看到对应的程序!
Git Bash:Unix与Linux风格的命令行,最常用。
Git CMD:Windows风格的命令行。
Git GUI:图形界面的Git。
基础操作
Git 完整命令手册地址
以下操作均在Git Bash中完成
Linux常用命令
cd 改变目录
cd 回退到上一个目录,直接cd进入默认目录
pwd 显示当前所在的目录路径
ls或ll 列出当前目录中的所有文件
touch 新建一个文件
rm 删除一个文件
mkdir 新建一个目录
rm -r 删除一个文件夹
rm -rf 切勿在Linux中尝试!删除电脑中全部文件!
mv 移动文件
reset 重新初始化终端/清屏
clear 清屏
history 查看命令历史
help 帮助
exit 退出
# 注释
Git配置
查看配置
#查看系统配置
git config --system --list
#查看当前用户(global)配置
git config --global --list
配置文件路径(配置文件可能已隐藏)
系统配置:Git\etc\gitconfig(Git 安装目录下的 gitconfig)
当前用户配置:C:\用户\当前用户名\ .gitconfig
设置用户名与邮箱(必要)
当你安装Git后首先要做的事情是设置你的用户名称和e-mail地址。因为每次Git提交都会使用该信息。
可以用文本编辑器直接设置配置文件C:\用户\当前用户名\ .gitconfig,也可通过以下命令设置
git config --global user.name "tuling" #名称
git config --global user.email 2404771815@qq.com #邮箱
Git基本概念
当你对任意一个文件夹进行git init后,这个文件夹里面就可以分成三个区。
如果在加上远程的git仓库就可以分为四个工作区域。
工作区:
- 位置:就是这个文件夹。
- 功能:平时存放项目代码的地方。
版本库:
- 位置:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
- 功能:安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本。
暂存区:
- 位置:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 功能:用于临时存放你的改动,保存即将提交到文件列表信息。
远程仓库:托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换。
对图片的解释(可跳过,看完后面再回过头来看)
- 图中左侧为工作区,右侧为版本库。在版本库中标记为 “index” 的区域是暂存区(stage/index),标记为 “master” 的是 master 分支所代表的目录树。
- 图中我们可以看出此时 “HEAD” 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
- 图中的 objects 标识的区域为 Git 的对象库,实际位于 “.git/objects” 目录下,里面包含了创建的各种对象及内容。
- 当对工作区修改(或新增)的文件执行 git add 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
- 当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
- 当执行 git reset HEAD 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
- 当执行 git rm --cached 命令时,会直接从暂存区删除文件,工作区则不做出改变。
- 当执行 git checkout . 或者 git checkout – 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区中的改动。
- 当执行 git checkout HEAD . 或者 git checkout HEAD 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
创建Git仓库
创建本地仓库的方法有两种:
一种是创建全新的仓库,另一种是克隆远程仓库。
# 在当前目录新建一个Git仓库
git init
# 指定目录作为Git仓库
git init 目录
# 克隆一个项目和它的整个代码历史(版本信息)到当前目录
git clone <repo>
# 克隆到指定的目录
git clone <repo> <directory>
# <repo>:Git远程仓库,<directory>:本地目录。
Git文件操作
文件的四种状态
- Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.
- Staged: 暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename取消暂存, 文件状态为Modified
- Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件
- Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改 !
查看文件状态
#查看指定文件状态
git status [filename]
#查看所有文件状态
git status
忽略文件
有些时候我们不想把某些文件纳入版本控制中,比如数据库文件,临时文件,设计文件等
在主目录下建立".gitignore"文件,此文件有如下规则:
- 忽略文件中的空行或以井号(#)开始的行将会被忽略。
- 可以使用Linux通配符。例如:星号(*)代表任意多个字符,问号(?)代表一个字符,方括号([abc])代表可选字符范围,大括号({string1,string2,…})代表可选的字符串等。
- 如果名称的最前面有一个感叹号(!),表示例外规则,将不被忽略。
- 如果名称的最前面是一个路径分隔符(/),表示要忽略的文件在此目录下,而子目录中的文件不忽略。
- 如果名称的最后面是一个路径分隔符(/),表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或目录都忽略)。
#为注释
*.txt #忽略所有 .txt结尾的文件,这样的话上传就不会被选中!
!lib.txt #但lib.txt除外
/temp #仅忽略项目根目录下的TODO文件,不包括其它目录temp
build/ #忽略build/目录下的所有文件
doc/*.txt #会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
基本操作
说明
- workspace:工作区
- staging area:暂存区/缓存区
- local repository:版本库或本地仓库
- remote repository:远程仓库
git add #工作区到暂存区
git commit -m [message] #暂存区到本地仓库
git commit -a #设置修改文件后不需要执行 git add,直接来提交
git reflog #获取版本号
#HEAD 表示当前版本,HEAD^ 上一个版本,HEAD^^ 上上一个版本
#HEAD~0 表示当前版本,HEAD~1 上一个版本,HEAD^2 上上一个版本
git reset HEAD #本地仓库到暂存区
git reset --soft HEAD #--soft 参数用于回退到某个版本
git reset --hard HEAD #--hard 参数将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交
git checkout . #暂存区全部到工作区
git checkout -- <file> #暂存区部分到工作区
git checkout HEAD . #仓库全部到暂存区、工作区
git checkout HEAD <file> #仓库部分到暂存区、工作区
git clone [url] #拷贝一个 Git 仓库到本地
Git远程仓库操作
git remote #查看当前配置有哪些远程仓库
git remote -v #加上每个别名的实际链接地址
git remote show [remote] #显示某个远程仓库的信息
git remote add [shortname] [url] #添加远程版本库
git remote rename old_name new_name #修改仓库名
git remote rm [shortname] #删除远程仓库
git fetch #从远程仓库下载新分支与数据
git merge #从远端仓库提取数据并尝试合并到当前分支
git pull <远程主机名> <远程分支名>:<本地分支名>#git fetch 和 git merge的简写
git push <远程主机名> <本地分支名>:<远程分支名>#将你的 [branch] 分支推送成为 [alias] 远程仓库上的 [branch] 分支
Git分支操作
一个分支代表一条独立的开发线。
使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。
git branch #列出所有本地分支
git branch -r #列出所有远程分支
git branch [branch-name] #新建一个分支,但依然停留在当前分支
git checkout (branchname) #切换分支
git checkout -b [branch] #新建一个分支,并切换到该分支
git merge [branch] #合并指定分支到当前分支
git branch -d [branch-name] #删除分支
git push origin --delete [branch-name] #删除远程分支
git branch -dr [remote/branch] #删除远程分支
标签操作
git tag #查看所有标签
git tag -a v1.0 #给最新一次提交HEAD打上"v1.0"的标签
git tag -a v0.9 85fc7e7 #给85fc7e7追加标签"v0.9"
git tag -a <tagname> -m '标签名' #指定标签信息命令
git tag -s <tagname> -m '标签名' #PGP签名标签命令
举例
打开Git Bash,按照linux的操作选择一个文件夹作为工作区并初始化。
我这里选择的是E盘下的Gitlibrary/test文件夹。
初始化后出现master说明当前分支是主分支。
新建五个test.c文件并查看状态,为untracked
把后四个test文件保存在暂存区,查看状态为new file
把后两个test文件上传到本地仓库,查看状态发现不见了
我们再对test3.c和test5.c进行修改,都写入123,查看状态,发现修改的文件变成modified
使用git status -s进行简短查看状态
可知??表示未跟踪,第一位为A表示保存在暂存区,无则表示保存在本地仓库,第二位为M表示修改过,无则表示没修改过,若保存在本地仓库且未修改过则不显示。
现在让我们进行回退,使用git chechout,发现上次修改过的痕迹不见了
让我们删除掉所有文件再回退,发现只有之前保存到暂存区的回来,这说明git checkout .是把暂存区的文件回退到工作区
)
让我们删除掉所有文件再使用git checkout master .回退,发现只有之前保存到本地仓库的回来,这说明git checkout master .是把本地仓库的文件回退到工作区且没有影响到暂存区
让我们删掉一切重新再来一次,新建test.c,输入num:1,保存到本地仓库,修改test.c为num:2,再保存到本地仓库,再回退到上一次保存,新建并切换到新分支new,修改test.c为num:new,保存到本地仓库。使用git log --oneline可以看到每次提交,前面是版本号,后面是提交信息,可以根据版本号回退到任一版本。
现在我们来对第二次提交打上标签v1.0(第一次打上标签无效是因为需要对这个标签进行解释,即在输入命令后打开的界面写入任意东西再退出)
远程仓库的例子下次再讲
常用命令汇总
常用Linux命令
cd 改变目录
cd 回退到上一个目录,直接cd进入默认目录
pwd 显示当前所在的目录路径
ls或ll 列出当前目录中的所有文件
touch 新建一个文件
rm 删除一个文件
mkdir 新建一个目录
rm -r 删除一个文件夹
rm -rf 切勿在Linux中尝试!删除电脑中全部文件!
mv 移动文件
reset 重新初始化终端/清屏
clear 清屏
history 查看命令历史
help 帮助
exit 退出
# 注释
基本操作
git config --global user.name 'runoob'
git config --global user.email test@runoob.com#设置用户信息
(去掉 --global 参数只对当前仓库有效)
git init #初始化仓库
git status #查看仓库当前的状态,显示有变更的文件
git diff #比较文件的不同,即暂存区和工作区的差异
git mv [file] [newfile] #用于移动或重命名一个文件、目录或软连接
git mv -f [file] [newfile] #新文件名已经存在,但还是要重命名它
git rm <file> #将文件从暂存区和工作区中删除
git rm -f <file> #强行从暂存区和工作区中删除修改后的文件
git rm --cached <file> #把文件从暂存区域移除
git log #查看历史提交记录
git log --oneline #选项来查看历史记录的简洁的版本
git log --graph #选项,查看历史中什么时候出现了分支、合并
git log --reverse #参数来逆向显示所有日志
git blame <file> #以列表形式查看指定文件的历史修改记录
转移操作
git add #工作区到暂存区
git commit -m [message] #暂存区到本地仓库
git commit -a #设置修改文件后不需要执行 git add,直接来提交
git reflog #获取版本号
#HEAD 表示当前版本,HEAD^ 上一个版本,HEAD^^ 上上一个版本
#HEAD~0 表示当前版本,HEAD~1 上一个版本,HEAD^2 上上一个版本
git reset HEAD #本地仓库到暂存区
git reset --soft HEAD #--soft 参数用于回退到某个版本
git reset --hard HEAD #--hard 参数将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交
git checkout . #暂存区全部到工作区
git checkout -- <file> #暂存区部分到工作区
git checkout HEAD . #仓库全部到暂存区、工作区
git checkout HEAD <file> #仓库部分到暂存区、工作区
git clone [url] #拷贝一个 Git 仓库到本地
分支操作
git branch #列出所有本地分支
git branch -r #列出所有远程分支
git branch [branch-name] #新建一个分支,但依然停留在当前分支
git checkout (branchname) #切换分支
git checkout -b [branch] #新建一个分支,并切换到该分支
git merge [branch] #合并指定分支到当前分支
git branch -d [branch-name] #删除分支
git push origin --delete [branch-name] #删除远程分支
git branch -dr [remote/branch] #删除远程分支
标签操作
git tag #查看所有标签
git tag -a v1.0 #给最新一次提交HEAD打上"v1.0"的标签
git tag -a v0.9 85fc7e7 #给85fc7e7追加标签"v0.9"
git tag -a <tagname> -m '标签名' #指定标签信息命令
git tag -s <tagname> -m '标签名' #PGP签名标签命令
远程仓库操作
git remote #查看当前配置有哪些远程仓库
git remote -v #加上每个别名的实际链接地址
git remote show [remote] #显示某个远程仓库的信息
git remote add [shortname] [url] #添加远程版本库
git remote rename old_name new_name #修改仓库名
git remote rm [shortname] #删除远程仓库
git fetch #从远程仓库下载新分支与数据
git merge #从远端仓库提取数据并尝试合并到当前分支
git pull <远程主机名> <远程分支名>:<本地分支名>#git fetch 和 git merge的简写
git push <远程主机名> <本地分支名>:<远程分支名>#将你的 [branch] 分支推送成为 [alias] 远程仓库上的 [branch] 分支