目录
简介
Git是一个开源的分布式版本控制系统。
和SVN区别:
1.Git是分布式的,而SVN不是。
2.Git把内容按元数据方式存储,而SVN是按文件来存储。
3.Git里分支是一种同时处理不同版本存储库的方式,SVN里分支则像是版本库的另外一个目录。
4.Git没有全局的版本号,而SVN有。
5.Git的内容完整性要优于SVN。Git的内容存储使用得是SHA-1哈希算法,这能保障代码内容的完整性,使得在遇到磁盘故障和网络问题时降低对版本库的破坏。
以前Github曾默认使用master来命名源代码存储库的主要版本,后来改为了main命名,因此在学习Github相关知识时,要注意将名称master转化为main来理解。
基本概念
1.Git工作区,暂存区/缓存区,版本库。
工作区【workspace】是指电脑能看到的建立有Git仓库的目录。
暂存区【staging area】一般存放在.git/index文件中,所以暂存区有时也叫作索引。
版本库【local repository】是工作区里的一个隐藏目录【.git】。
安装
Windows下安装
官网下载地址:
如果去官网下载git失败或者下载很慢,可以选择国内软件资源平台下载Git,例如:
完成安装之后,就可以使用命令行的git工具【已经自带ssh客户端】了。此外,也可以使用Git图形界面的项目管理工具Git【Git GUI】,打开方法是:Windows开始菜单->所有程序->Git->Git GUI。
验证是否安装成功:
git --version
Git配置
Git提供了一个名叫git config的工具,用来配置或读取相应的工作环境变量,
Git配置会存放在以下三个地方:
1.Git安装目录/etc/gitconfig文件。该文件存放的是系统中对所有用户都普遍适用的配置,若使用git config时用--system选项,读写的就是这个文件。
2.~/.gitconfig文件。该文件存放的配置只适用于该用户。若使用git config时用--global选项,读写的就是这个文件。
3.项目根目录/git/config文件。该文件存放的是针对当前项目的配置。在项目运行时,项目里的Git配置会覆盖用户Git配置和系统Git配置。
显示当前git配置信息:
git config --list
编辑git配置文件:
git config -e # 针对当前仓库。
git config -e --global # 针对系统上所有仓库。
用户信息
下列示例配置中使用了--global选项,对应更改的配置文件位于用户主目录下。如果只是在某个特定的项目中配置Git,那么就去掉--global选项。
配置个人用户名称:
git config --global user.name "用户名称"
配置个人电子邮件地址:
git config --global user.email 电子邮箱地址
验证配置信息是否成功写入:
git config --global --list
或者
vim ~/.gitconfig
或者
git config user.name
git config user.email
如果在配置信息查询结果中看到重复的变量名,则说明它们来自不同的配置文件,但Git实际采用的会是最后一个。
个性化配置
Git默认使用的文本编辑器,一般可能会是Vi或Vim,如果想改成别的编辑器,可以运行如下命令:
git config --global core.editor 编辑器名字
可以配置在解决合并冲突时使用哪种差异分析工具。
示例命令:
git config --global merge.tool 差异分析工具名字
Git可以理解kdiff3、tkdiff、meld、xxdiff、emerge、vimdiff、gvimdiff、ecmerge、opendiff等合并工具的输出信息。
工作流程
1.克隆Git资源作为工作目录。
2.在克隆的资源上添加或修改文件。
3.如果别人修改了,可以更新本地资源。
4.在提交前查看修改。
5.提交修改。
6.在修改完成后,如果发现错误,可以撤回修改并再次修改和提交。
基本操作
创建仓库
本地创建
在项目文件夹中创建Git仓库。
语法:
git init 目标目录
目标目录若省略,则在当前目录下初始化一个Git仓库,在目录下生成一个隐藏的.git目录【版本库】,该目录包含了资源的所有元数据。
拷贝项目
从现有Git仓库中拷贝项目。
语法:
git clone <repo> <directory>
参数说明:
<repo>是指Git仓库。
<directory>是指本地指定目录,可选。
示例指令:
git clone git://github.com/Github用户名/Github项目名.git
注意从Github仓库里克隆下来的是main分支里的内容。
还可以通过URL拷贝一个Git仓库到本地。
语法:
git clone [url]
仓库文件管理
提交
初始化Git仓库后,可以用git add命令告诉Git需要对哪些文件进行跟踪,并提交。
示例指令:
git add *
git commit -m "all in"
也可以指定只上传某种类型、某个文件目录、某个文件提交到仓库去。
示例指令:
git add [file1] [file2] ... # 添加一个或多个文件到暂存区。
git add [dir] # 添加指定目录到暂存区,包括子目录。
git add . # 添加当前目录下所有文件到暂存区。
git add test1
git add test2/*.txt
git add readme.txt
git commit -m "部分提交"
git commit命令用于将暂存区内容添加进本地仓库中。
语法:
git commit -m [message] # 提交暂存区内容到本地仓库中
# 提交暂存区的指定文件到仓库区。
git commit [file1] [file2] ... -m [message]
可用-a参数设置修改文件后不需要执行git add命令,直接提交到本地仓库。
示例指令:
git commit -a
git默认是不提交空目录的,如果想提交项目里的每个空目录可以通过在项目根目录的gitbash界面里运行如下指令:
find . -type d -empty -exec touch {}/.gitignore \;
上面这条指令其实是给每个空目录添加了一个.gitignore文件,等空文件夹里新建了文件就可以删除掉里面的.gitigonre文件。
改动
查看仓库当前的状态,显示有变更的文件。
示例指令:
git status [-s]
-s的作用是获取简短输出结果。在简短输出结果中AM状态的意思是这个文件在被添加到暂存区之后又有改动。
比较文件的不同,即暂存区和工作区的差异。
示例指令:
git diff # 查看尚未缓存的改动。
git diff --cached # 查看已缓存的改动。
git diff HEAD # 查看所有改动。
git diff --stat # 显示改动摘要。
# 显示暂存区和工作区的差异。
git diff [file]
# 显示暂存区和上一次提交【commit】的差异。
git diff --cached [file]
或
git diff --staged [file]
# 显示两次提交之间的差异。
git diff [first-branch] [second-branch]
git mv命令用于移动或重命名一个文件、目录或软连接。
语法:
git mv [file] [newfile]
回退版本
git reset命令用于回退版本,可以指定退回某一次提交的版本。
语法:
git reset [--soft | --mixed | --hard] [HEAD]
参数说明:
--mixed为默认【可省略】,用于重置暂存区文件和上一次的提交【commit】保持一致,工作区文件内容保持不变。
--soft用于回退到某个版本。
--hard用于撤销工作区中所有未提交的修改内容,将暂存区和工作区都回退到上一次版本,并删除之前的所有信息提交【谨慎使用】。
HEAD表示当前版本,HEAD^表示上一个版本,HEAD^^表示上上一个版本,以此类推。上面的^也可以改为数字形式,HEAD~0表示当前版本,HEAD~1表示上一个版本,HEAD~2表示上上一个版本。
示例指令:
git reset HEAD # 取消已缓存的内容。
git reset HEAD^ # 回退所有内容到上一个版本。
git reset HEAD^ hello.php # 回退hello.php文件的版本到上一个版本。
git reset 052e # 回退到指定版本。
git reset --soft HEAD~3 # 回退到上上上一个版本。
删除
给项目创建仓库后,如果要删除文件,需要用git rm命令来删除文件。
将文件从暂存区和工作区中删除。
语法:
git rm [ -f | --cached ] <file>
-f用于将文件从暂存区和工作区中强制删除。
-cached用于只将文件从暂存区【跟踪清单】移除,工作区仍保留该文件。
删除文件:
git rm [相对目录/]文件名
删除非空文件夹:
git rm -r 文件目录
删除空文件夹:
git rm 文件目录
如果删除不了,可用git rm -f 文件目录,还不行则可用rm -r 文件目录。
删除完后还要运行
git commit -m "提交说明"
保留删除结果到版本。
提交历史
查看日志
查看历史提交记录。
语法:
git log [--oneline] [--graph] [--reverse] [--author] [--since] [--before] [--until] [--after]
可选项说明:
--oneline 查看历史记录的简洁版本。
--graph 查看历史中什么时候出现了分支、合并。
--reverse 逆向显示所有日志。
--author 查找指定用户的提交日志。
--since、--bofore、--until、--after可用来指定日期。
以列表形式查看指定文件的历史修改记录。
语法:
git blame <file>
远程操作
远程仓库基本操作
显示所有远程仓库。
语法:
git remote -v
添加远程版本库。
语法:
git remote add [shorname] [url]
示例指令:
git remote add origin git@github.com:yourName/yourRepo.git
yourName是指github里注册的用户名,而yourRepo则是github里创建的仓库名。
显示某个远程仓库的信息。
语法:
git remote show [remote]
示例指令:
git remote show git@github.com:yourName/yourRepo.git
修改仓库名:
git remote rename old_name new_name
删除本地配置的远程仓库:
git remote rm name
这个name就是本地配置文件里添加的远程版本库的配置名称【如用git remote add 指令添加远程版本库时设置的shortname】。
从远程获取代码库
语法:
git fetch [alias]
参数说明:
alias参数就是本地配置文件里远程版本库的配置名称。
示例指令:
git fetch origin
如果在获取远程代码的显示结果中,看到例如”0205aab..febd8ed main -> origin/main”这样的内容,则表示main分支已经被更新,就需要使用git merge命令将更新同步到本地。
示例指令:
git merge origin/main
查看README.md文件内容。
语法:
cat README.md
下载远程代码并合并
git pull 用于从远程获取代码并合并到本地版本,可以视作是git fetch和git merge FETCH_HEAD的简写。
语法:
git pull <远程主机名> <远程分支名>:<本地分支名>
示例指令:
# 更新操作
git pull
git pull origin
# 将远程主机origin的main分支拉取过来,与本地的brantest分支合并。
git pull origin main:brantest
# 如果是远程分支与当前分支合并,则冒号后面的部分可以省略。
git pull origin master
上传远程代码并合并
git push 用于将本地分支版本上传到远程并合并。
语法:
git push [-u] <远程主机名> <本地分支名>[:<远程分支名>]
如果本地当前分支名和远程分支名相同,则可以省略:<远程分支名>。
-u的作用是指定默认主机,当当前分支与不止一个主机存在追踪关系时会用到。
示例指令:
git push origin main
等同于
git push origin main:main
# 强制推送
git push --force origin main
分支管理
查看分支
语法:
git branch
创建分支
语法:
git branch [branchname]
切换分支
语法:
git checkout [-b] [branchname]
参数说明:
-b作用是创建新分支并立即切换到该分支下。
合并分支
从远程仓库提取数据并尝试合并到当前分支。
语法:
git merge [alias]/[branch]
删除分支
语法:
git branch -d [branchname]
Git服务器搭建
使用Github,可能存在国内网络访问不稳定、管理仓库的自由灵活程度受到平台限制等问题,因此可以考虑自己搭建一台Git服务器作为私有仓库使用,网上有相关教程。