一、什么是git
- git是一个开源的分布式版本控制系统,用于敏捷高效地各种大小型项目。
- git时Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。
- git与常用的版本控制工具CVS、Subversion等不同,它采用了分布式版本库的方式,不必服务器端软件支持。
Git 与 SVN 区别
- git不仅仅是版本控制系统,它也是内容管理系统,工作管理系统登;
- 如果你是个具有SVN背景的人,你需要做一定的思想转换,来适应git提供的一些概念和特征。
- git是分布式的,svn不是
- git是把内容按元数据方式存储,而svn是按文件
- git分支和svn的分支不同,svn的分支就是版本库中的另一个目录
- git没有一个全局的版本号,而svn有
- git的内容完整性要优于svn:git的内容存储使用的是SHA-1哈希算法,这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏
二、安装git
-
在CentOS 7中安装git(源码构建安装)
1、下载最新版本源码
从该地址获取:
https://mirrors.edge.kernel.org/pub/software/scm/git/
# 卸载之前yum装的版本:
yum erase -y git
# 下载git
yum install -y wget
wget -O /tmp/git-2.21.0.tar.gz https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.21.0.tar.gz
2、解压编译
# 安装编译依赖项
yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
# 解压
tar -zxf /tmp/git-2.21.0.tar.gz -C /tmp/
# 检验相关依赖,设置安装路径
./configure --prefix=/usr/local/git
# 编译安装
make && make install
3.配置全局环境变量
# 配置环境变量
vim /etc/profile
# 配置环境变量
vim /etc/profile
# GIT_HOME
GIT_HOME=/usr/local/git
export PATH=$PATH:$GIT_HOME/bin
# 刷新
source /etc/profile
4、查看安装好的git版本
git --version
-
Win10下安装Git
1、先从官网下载最新版本的Git
点击上图中表示的地方进行下载,得到Git-2.17.1.2-64-bit.exe文件。如果你的系统是32位的,可以通过如下方式下载:
2、双击下载好的git安装包,弹出提示框,如下图:
3、直接点击“Next”进入下一步,选择安装路径,如下图:
4、选择好安装路径后,点击“Next”进入下一步,弹出安装配置窗口,包括git命令行、git图形窗口等,如下图所示:
说明:
- Additional icons -- 附加图标
On the Desktop -- 在桌面上- Windows Explorer integration -- Windows资源管理器集成鼠标右键菜单
Git Bash Here
Git GUI Here- Git LFS (Large File Support)
大文件支持- Associate .git* configuration files with the default text editor
将 .git 配置文件与默认文本编辑器相关联- Associate .sh files to be run with Bash
将.sh文件关联到Bash运行- Use a TrueType fint in all console windows
在所有控制台窗口中使用TrueType字体- Check daily for Git for Windows updates
每天检查Git是否有Windows更新
5、按照上述默认配置,直接点击“Next”进入下一步,弹出“选择开始菜单文件夹”的窗口,如下图所示:
6、按照默认路径即可,直接点击“Next”,进入下一步,进入“选择Git使用的默认编辑器”窗口,如下图所示:
说明:
- Use the Nano editor by default
默认使用 Nano 编辑器- Use Vim (The ubiquitous text editor) as Git's default editor
使用 Vim 作为 Git 的默认编辑器- Use Notepad++ as Git's default editor
使用 Notepad++ 作为 Git 的默认编辑器- Use Visual Studio Code as Git's default editor
使用 Visual Studio Code 作为Git 的默认编辑器- Use Visual Studio Code Insiders as Git's default editor
使用Visual Studio Code Insiders 作为 Git 的默认编辑器
7、点击“Next”,进入下一步,进入“调整Path环境变量”窗口,如下图所示:
配置PATH环境:
- Use Git from Git Bash only
仅从Git Bash中使用GitThis is the safest choice as your PATH will not be modified at all.You will only be able to use the Git command line tools form Git Bash.
这是最安全的选择,因为您的PATH根本不会被修改。您只能使用 Git Bash 的 Git 命令行工具。
- Use Git from the Windows Command Prompt
在Windows命令提示符中使用GitThis option is considered safe as it only adds some minimal Git wrappers to your PATH to avoid cluttering your environment with optional Unix tools . You will be able to use Git from both Git Bash and the Windows Command Prompt.
这个选项被认为是安全的,因为它只向PATH添加一些最小的 Git包,以避免使用可选的Unix工具混淆环境。 您将能够从 Git Bash 和 Windows 命令提示符中使用 Git。
- Use Git and optional Unix tools from the Windows Command Prompt
从Windows命令提示符使用Git和可选的Unix工具Both Git and the optional Unix tools will be added to you PATH
Git和可选的Unix工具都将添加到您计算机的 PATH 中
- Warning:This will override Windows tools like "find and sort".Only use this option if you understand the implications.
警告:这将覆盖Windows工具,如 “ find 和 sort ”。只有在了解其含义后才使用此选项。
8、选第二项,然后点击“Next”进入下一步,选择HTTPS传输后端,如下图所示:
说明:
- Use the OpenSSL library
使用 OpenSSL 库Server certificates will be validated using the ca-bundle.crt file.
服务器证书将使用ca-bundle.crt文件进行验证。
- Use the native Windows Secure Channel library
使用本地 Windows 安全通道库Server certificates will be validated using Windows Certificate Stores.This option also allows you to use your company's internal Root CA certificates distributed e.g. via Active Directory Domain Services.
服务器证书将使用Windows证书存储验证。此选项还允许您使用公司的内部根CA证书,例如, 通过Active Directory Domain Services 。
9、选择"Use the OpenSSL library",点击“Next”进入下一步,配置行结束符,如下图所示:
说明:
- Checkout Windows-style,commit Unix-style line endings
Git will convert LF to CRLF when checking out text files.When committing text files,CRLF will be converted to LF .For cross-pltform projects,this is the recommended setting on Windows ("core.autocrlf" is set to "true")
在检出文本文件时,Git会将LF转换为CRLF。当提交文本文件时,CRLF将转换为LF。 对于跨平台项目,这是Windows上推荐的设置(“core.autocrlf”设置为“true”)
- Checkout as-is , commit Unix-style line endings
Git will not perform any conversion when checking out text files. When committing text files, CRLF will be converted to LF. For cross-platform projects,this is the recommended setting on Unix ("core.autocrlf" is set to "input")
在检出文本文件时,Git不会执行任何转换。 提交文本文件时,CRLF将转换为LF。 对于跨平台项目,这是Unix上的推荐设置 (“core.autocrlf”设置为“input”)
- Checkout as-is,commit as-is
Git will not perform any conversions when checking out or committing text files.Choosing this option is not recommended for cross-platform projects ("core.autocrlf"is set to "false")
在检出或提交文本文件时,Git不会执行任何转换。对于跨平台项目,不推荐使用此选项(“core.autocrlf”设置为“false”)
10、选择第一项,点击“Next”进入下一步,配置终端模拟器,如下图所示:
说明:
- Use MinTTY (the default terminal of MSYS2)
Git Bash will use MinTTY as terminal emulator,which sports a resizable window,non-rectangular selections and a Unicode font. Windows console programs (such as interactive Python) must be launched via 'winpty' to work in MinTTY.
Git Bash将使用MinTTY作为终端模拟器,该模拟器具有可调整大小的窗口,非矩形选区和Unicode字体。 Windows控制台程序(如交互式Python)必须通过'winpty'启动才能在MinTTY中运行。
- Use Windows' default console window
Git will use the default console window of Windows ("cmd.exe"),which works well with Win32 console programs such as interactive Python or node.js , but has a very limited default scroll-back,needs to be configured to use aUnicode font in order to display non-ASCII characters correctly,and prior to Windows 10 its windows was not freely resizable and it only allowed rectangular text selections.
Git将使用Windows的默认控制台窗口(“cmd.exe”),该窗口可以与Win32控制台程序(如交互式Python或node.js)一起使用,但默认的回滚非常有限,需要配置为使用unicode 字体以正确显示非ASCII字符,并且在Windows 10之前,其窗口不能自由调整大小,并且只允许矩形文本选择。
11、选择第一项,直接点击“Next”进入下一步,配置额外选项,如下图所示:
说明:
- Enable file system caching
启用文件系统缓存File system data will be read in bulk and cached in memory for certain operations ("core.fscache" is set to "true"). This provides a significant performance boost.
文件系统数据将被批量读取并缓存在内存中用于某些操作(“core.fscache”设置为“true”)。 这提供了显着的性能提升。
- Enable Git Credential Manager
启用Git凭证管理器The Git Credential Manager for Windows provides secure Git credential storage for Windows,most notably multi-factor authentication support for Visual Studio Team Services and GitHub. (requires .NET framework v4.5.1 or or later).
Windows的Git凭证管理器为Windows提供安全的Git凭证存储,最显着的是对Visual Studio Team Services和GitHub的多因素身份验证支持。 (需要.NET Framework v4.5.1或更高版本)。
- Enable symbolic links
启用符号链接Enable symbolic links (requires the SeCreateSymbolicLink permission).Please note that existing repositories are unaffected by this setting.
启用符号链接(需要SeCreateSymbolicLink权限)。请注意,现有存储库不受此设置的影响。
12、使用默认配置,直接点击“Install”开始安装,如下图所示:
13、安装完成:
三、使用git
1、创建用户标识
- 一旦在自己的操作系统上安装完Git之后,需要告诉Git你的用户名和电子邮件地址,从而创建自己的用户标识。你的所有代码提交都会与你的用户标识关联。
- 下面的代码会将你的个人标识和系统偏好设置写入你的home目录下的.gitconfig文件中(在UNIX和Mac上为\~,而在Windows中则是%USERPROFILE%对应的目录)
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
2、git工作流程
-
工作区
- 程序员进行开发改动的地方,是你当前看到的,也是最新的。
- 平常我们开发就是拷贝远程仓库中的一个分支,基于该分支进行开发。在开发过程中就是对工作区的操作。
-
缓存区
- git目录下的index文件, 暂存区会记录git add添加文件的相关信息(文件名、大小、timestamp...),不保存文件实体, 通过id指向每个文件实体。可以使用git status查看暂存区状态。暂存区标记了当前工作区中,哪些内容是被git管理的。
- 当你完成某个需求或功能后需要提交到远程仓库,那么第一步就是通过git add先提交到暂存区,被git管理。
-
本地仓库
- 保存了对象被提交 过的各个版本,比起工作区和暂存区的内容,它要更旧一些。
- git commit后同步index的目录树到本地仓库,方便从下一步通过git push同步本地仓库与远程仓库的同步。
-
远程仓库
- 远程仓库的内容可能被分布在多个地点的处于协作关系的本地仓库修改,因此它可能与本地仓库同步,也可能不同步,但是它的内容是最旧的。
小结
- 任何对象都是在工作区中诞生和被修改;
- 任何修改都是从进入缓存区才开始被版本控制;
- 只有把修改提交到本地仓库,该修改才能在仓库中留下痕迹;
- 与协作者分享本地的修改,可以把它们push到远程仓库来共享。
3、git常用命令
1) 修改编辑项目常用
# 查看当前仓库文件状态(常在提交文件之前查看,会显示新增文件删除文件,已修改文件等状态)
git status
# 添加文件
git add . // 添加所有已修改文件
git add fileName // 添加指定文件名的文件(可在git status返回中复制)
# 提交修改说明
git commit -m "修改的内容" // 记录当前提交的主题 以便区分每次提交的内容
# 拉取代码
git pull // 拉取代码 push之前pull一次代码 (尤其多人开发一定注意push之前先pull)
git pull origin <远程分支名> // 将远程指定分支 拉取到 本地当前分支上
git pull origin <远程分支名>:<本地分支名> // 将远程指定分支 拉取到 本地指定分支上
git pull origin // 将与本地当前分支同名的远程分支 拉取到 本地当前分支上(需先关联远程分支)
# 推送代码
git push // 推送代码到远程仓库
git push origin <本地分支名> // 将本地当前分支 推送到 与本地当前分支同名的远程分支上(注意:pull是远程在前本地在后,push相反)
git push origin <本地分支名>:<远程分支名> // 将本地当前分支 推送到 远程指定分支上(注意:pull是远程在前本地在后,push相反)
git push origin // 将本地当前分支 推送到 与本地当前分支同名的远程分支上(需先关联远程分支)
git push --set-upstream origin // <本地分支名>将本地分支与远程同名分支相关联
2) 分支相关
git branch // 查看本地分支(名称前面加* 号的是当前的分支)
git branch -a // 查看分支,远程分支会用红色表示出来(如果你开了颜色支持的话)
git branch -vv // 查看本地分支和远程分支对应关系
git remote // 列出所有远程主机
git remote update origin --prune // 更新远程主机origin(gitlab有新分支,本地查看分支无法查看到的时候使用)
git branch -r // 列出远程分支
git branch -vv // 查看本地分支和远程分支对应关系
git checkout -b dev origin/dev // 新建本地分支dev与远程dev分支相关联
# 新建分支相关
git checkout -b newBranch
git push origin newBranch:newBranch // 把新建的本地分支push到远程服务器,远程分支与本地分支同名(可随意起名)
# 删除本地分支
git branch -D newBranch // 删除本地 newBranch 分支
git checkout newBranch // 如果需要重新拉取远程的newBranch分支 执行
# 删除远程分支
git push origin :delBranchName
git push origin --delete delBranchName
# 切换分支,分支跟踪, 本地分支和远程分支的关系
git branch branchName // 创建分支
git checkout branchName // 切换分支
git branch -d branchName // 删除本地分支
git branch -r -d origin/branch-name
git push origin :branch-name // 删除远程分支
# 如果远程新建了一个分支,本地没有该分支,git checkout --track origin/ branchName ,这时本地会新建一个分支名叫 branchName,会自动跟踪远程的同名分支 branchName。
git checkout --track origin/branchName
# 如果本地新建了一个分支 branchName,但是在远程没有。这时候 push 和 pull 指令就无法确定该跟踪谁,一般来说我们都会使其跟踪远程同名分支,所以可以利用 git push --set-upstream origin branchName ,这样就可以自动在远程创建一个 branchName 分支,然后本地分支会 track 该分支。后面再对该分支使用 push 和 pull 就自动同步。
git push --set-upstream origin branchName
# 合并分支(多人开发中,经常一人一个分支,各自在自己分支开发,开发完成以后合并到某一个指定分支,没有问题后最后合并到master主分支,我们的流程是各自在自己的develop开发,开发完成以后合并到lastest分支,没有问题后提交合并申请到master分支,由leader审批是否统一合并到master,因为很多新人不太清楚代码的具体用途,所以讲的稍微详细点,明白命令的实现目的能更好的掌握使用,后面会有具体的操作流程)
1.本地代码依次
git status
git add
git commit -m ""
git pull
git push (develop-author分支,即自己的开发分支)
以后(把本地代码推送到远程对应分支)
2.git checkout lastest (切换到lastest分支)
3.git pull origin lastest (先把远程lastest分支修改内容拉取,多人开发,需要把远程lastest上的代码pull下来)
4.git merge develop-author (合并自己的分支到lastest)
4、常用命令详解
HEAD
HEAD,它始终指向当前所处分支的最新的提交点。你所处的分支变化了,或者产生了新的提交点,HEAD就会跟着改变。
add
add相关命令很简单,主要实现将工作区修改的内容提交到暂存区,交由git管理。
* git add . : 添加当前目录的所有文件到暂存区
* git add : 添加指定目录到暂存区,包括子目录
* git add : 添加指定文件到暂存区
commit
commit相关命令也很简单,主要实现将暂存区的内容提交到本地仓库,并使得当前分支的HEAD向后移动一个提交点。
* git commit -m :提交暂存区到本地仓库,message代表说明信息
* git commit -m :提交暂存区的指定文件到本地仓库
* git commit --amend -m :使用一次新的commit,替代上一次提交
branch
涉及到协作,自然会涉及到分支,关于分支,大概有展示分支,切换分支,创建分支,删除分支这四种操作。
* git branch : 列出所有本地分支
* git branch -r : 列出所有远程分支
* git branch -a : 列出所有本地分支和远程分支
* git branch : 新建一个分支,但依然停留在当前分支
* git checkout -b : 新建一个分支,并切换到该分支
* git branch --track : 新建一个分支,与指定的远程分支建立追踪关系
* git checkout : 切换到指定分支,并更新工作区
* git branch -d : 删除分支
* git push origin --delete : 删除远程分支
merge
merge命令把不同的分支合并起来。如上图,在实际开放中,我们可能从master分支中切出一个分支,然后进行开发完成需求,中间经过R3,R4,R5的commit记录,最后开发完成需要合入master中,这便用到了merge。
* git fetch : merge之前先拉一下远程仓库最新代码
* git merge : 合并指定分支到当前分支
一般在merge之后,会出现conflict,需要针对冲突情况,手动解除冲突。主要是因为两个用户修改了同一文件的同一块区域。
reset
reset命令把当前分支指向另一个位置,并且相应的变动工作区和暂存区。
* git reset —soft : 只改变提交点,暂存区和工作目录的内容都不改变
* git reset —mixed : 改变提交点,同时改变暂存区的内容
* git reset —hard : 暂存区、工作区的内容都会被修改到与提交点完全一致的状态
* git reset --hard HEAD : 让工作区回到上次提交时的状态
push
上传本地仓库分支到远程仓库分支,实现同步。
* git push : 上传本地指定分支到远程仓库
* git push --force : 强行推送当前分支到远程仓库,即使有冲突
* git push --all : 推送所有分支到远程仓库
* git push origin <本地分支名> :将本地当前分支 推送到 与本地当前分支同名的远程分支上(注意:pull是远程在前本地在后,push相反)
* git push origin <本地分支名>:<远程分支名> :将本地当前分支 推送到 远程指定分支上(注意:pull是远程在前本地在后,push相反)
* git push origin :将本地当前分支 推送到 与本地当前分支同名的远程分支上(需先关联远程分支)
pull
拉取代码,将本地的代码更新至远程仓库里面最新的代码版本。
* git pull : 拉取代码 push之前pull一次代码 (尤其多人开发一定注意push之前先pull)
* git pull origin <远程分支名> :将远程指定分支 拉取到 本地当前分支上
* git pull origin <远程分支名>:<本地分支名> :将远程指定分支 拉取到 本地指定分支上
* git pull origin :将与本地当前分支同名的远程分支 拉取到 本地当前分支上(需先关联远程分支)
stash
git stash 常用于 多人开发项目,例如:正式环境代码在master,自己开发在dev,当你正在dev开发或修改时,正式环境有个紧急问题需要解决,但是你dev分支的修改只进行了一半,不方便提交时可以利用git stash 将工作区修改过的内容临时保存起来,切换回master修改完紧急内容会回来可以再取出来临时保存的修改继续操作。
* git stash save "save message" : 执行存储时,添加备注,方便查找,只有git stash 也要可以的,但查找时不方便识别。
* git stash list :查看stash了哪些存储
* git stash show :显示做了哪些改动,默认show第一个存储,如果要显示其他存贮,后面加stash@{$num},比如第二个 git stash show stash@{1}
* git stash show -p : 显示第一个存储的改动,如果想显示其他存存储,命令:git stash show stash@{$num} -p ,比如第二个:git stash show stash@{1} -p
* git stash apply :应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即stash@{0},如果要使用其他个,git stash apply stash@{$num} , 比如第二个:git stash apply stash@{1}
* git stash pop :命令恢复之前缓存的工作目录,将缓存堆栈中的对应stash删除,并将对应修改应用到当前的工作目录下,默认为第一个stash,即stash@{0},如果要应用并删除其他stash,命令:git stash pop stash@{$num} ,比如应用并删除第二个:git stash pop stash@{1}
* git stash drop stash@{$num} :丢弃stash@{$num}存储,从列表中删除这个存储
* git stash clear :删除所有缓存的stash
有时也可通过这种方法实现避免或解决冲突,当你修改的内容是最新的,但是你需要pull下来的代码是需要被替换的,你pull的时候还是会冲突,可以先把你的修改stash临时保存,pull完代码以后在恢复stash的保存,即可替换pull下来的需要被替换的代码,当然不保存直接对比解决冲突也是可以的。