目录
一、了解Git的基本概念
二、Git的安装和配置
Git的安装
Git的配置
用户信息
文本编辑器
差异分析工具
查看配置信息
三、Git的基本操作
基本原理
基本操作命令
基本操作示例
场景一:创建新仓库
场景二:拉取并编辑远程仓库
四、常见问题及解决方法
解决冲突
git add文件夹时 添加无用文件
如何将一个分支上的修改转移到另一个分支上
未commit操作时
已commit操作时
git 拉取指定 tag 版本
warning: CRLF will be replaced by LF in 出现的原因和解决办法
远程分支删除了但是本地还能查询到
五、Git图形界面工具
六、参考资料
这里是Git初级使用教程!Git是一种分布式版本控制系统,广泛应用于软件开发行业。它可以帮助您更好地管理代码,跟踪代码的变更历史,并使团队协作更加高效。在这篇教程中,我们将介绍Git的基本概念、安装和使用方法,帮助你快速上手Git。
一、了解Git的基本概念
在开始使用Git之前,我们需要了解一些基本概念:
- 仓库(Repository):仓库是你用于存储代码的地方。在Git中,你可以在本地创建一个仓库,也可以从远程服务器克隆一个已有的仓库。
- 分支(Branch):分支是用来隔离不同开发线的。在同一个仓库中,可以创建多个分支,每个分支都可以独立地进行修改和提交。
- 提交(Commit):提交是您对代码进行的修改操作。每次提交都会生成一个新的版本,并记录修改的内容和时间。
- HEAD:HEAD是当前分支的引用。它指向最新提交的版本,也是进行下一次修改的起点。
- 工作区:就是你在电脑里能看到的代码目录。
- 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
二、Git的安装和配置
Git的安装
根据你的操作系统,可以参考Git官方文档或者相关的安装指南进行安装。
Git下载地址:Git - Downloads
安装完成后,可以通过以下命令验证Git是否成功安装:
git --version
如果显示了Git的版本号,说明安装成功。
Git的配置
Git 提供了一个叫做 git config 的工具,专门用来配置或读取相应的工作环境变量。
/etc/gitconfig
文件:系统中对所有用户都普遍适用的配置(位于git安装目录)。若使用git config
时用--system
选项,读写的就是这个文件。~/.gitconfig
文件:用户目录下的配置文件只适用于该用户(windows路径:C:\Users\你的用户名\.gitconfig
)。若使用git config
时用--global
选项,读写的就是这个文件。- 当前项目的 Git 目录中的配置文件(也就是工作目录中的
.git/config
文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以.git/config
里的配置会覆盖/etc/gitconfig
中的同名变量。
用户信息
配置个人的用户名称和电子邮件地址:
$ git config --global user.name "runoob"
$ git config --global user.email test@runoob.com
如果用了 --global 选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默认使用这里配置的用户信息。
如果要在某个特定的项目中使用其他名字或者电邮,只要去掉 --global 选项重新配置即可,新的设定保存在当前项目的 .git/config 文件里。
文本编辑器
设置Git默认使用的文本编辑器, 一般可能会是 Vi 或者 Vim。如果你有其他偏好,比如 Emacs 的话,可以重新设置::
$ git config --global core.editor emacs
差异分析工具
还有一个比较常用的是,在解决合并冲突时使用哪种差异分析工具。比如要改用 vimdiff 的话:
$ git config --global merge.tool vimdiff
Git 可以理解 kdiff3,tkdiff,meld,xxdiff,emerge,vimdiff,gvimdiff,ecmerge,和 opendiff 等合并工具的输出信息。
查看配置信息
要检查已有的配置信息,可以使用 git config --list 命令:
$ git config --list
http.postbuffer=2M
user.name=runoob
user.email=test@runoob.com
有时候会看到重复的变量名,那就说明它们来自不同的配置文件(比如 /etc/gitconfig 和 ~/.gitconfig),不过最终 Git 实际采用的是最后一个。
三、Git的基本操作
基本原理
命令图示:
- workspace:工作区
- staging area:暂存区/缓存区
- local repository:版本库或本地仓库
- remote repository:远程仓库
Git 常用的是以下 6 个命令:git clone、git push、git add 、git commit、git checkout、git pull。
基本操作命令
创建仓库:如果您想在本地创建一个新的Git仓库,可以使用以下命令:
git init
这会在当前目录下创建一个新的Git仓库。一般用于初始化新的git仓库。团队开发大多数时候不需要使用这个命令,直接从远程仓库克隆即可。
克隆仓库:如果您想从远程服务器克隆一个已有的仓库,可以使用以下命令:
git clone 你的远程仓库地址
这将把远程仓库的所有内容下载到本地。
拉取修改:拉取远程仓库最新的提交,可以使用以下命令:
git pull
git pull 其实就是 git fetch 和 git merge FETCH_HEAD 的简写。完整命令格式如下:
git pull <远程主机名> <远程分支名>:<本地分支名>
一般不需要使用完整格式,直接使用简单命令即可。
添加文件:要将文件添加到Git仓库中,需要先使用以下命令将其标记为待提交状态:
git add 文件名
提交修改:提交修改是将待提交状态的修改内容提交到Git仓库中,使用以下命令:
git commit -m "提交信息"
请注意,每次提交都需要提供一条简短的提交信息,以便于后续跟踪和查看修改历史。在团队开发中,你的提交信息将被团队其他人看到,并且做为审查提交修改代码的重要依据之一。多人开发时提交代码(commit)前优先使用拉取(pull)否则很容易造成本地冲突
推送分支:如果您对本地仓库的修改需要与远程仓库同步,可以使用以下命令将本地分支推送到远程仓库:
git push origin 分支名
其中,origin是远程仓库的别名,分支名是您要推送的分支的名称。
当你要提交当前分支的修改时,可以简化命令:
git push
创建分支命令:
git branch branchname
切换分支命令:
git checkout branchname
当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录。branchname处替换成你的分支名,一般建议使用英文。
没有参数时,git branch 会列出你在本地所有的分支名。并标注出当前分支名。
合并分支命令:
git merge
这个命令可以指定一个分支合并到当前分支来,比如想将开发分支devbranch合并到当前分支:
git merge devbranch
如果合并发生冲突,需要我们手动解决,解决完成后,我们可以用 git add 要告诉 Git 文件冲突已经解决。
删除分支命令:
git branch -d branchname
查看提交记录的方法:
git log [选项] [分支名/提交哈希值]
git log 命令用于查看 Git 仓库中提交历史记录。
git log 显示了从最新提交到最早提交的所有提交信息,包括提交的哈希值、作者、提交日期和提交消息等。常用的选项包括:
-p
:显示提交的补丁(具体更改内容)。--oneline
:以简洁的一行格式显示提交信息。--graph
:以图形化方式显示分支和合并历史。--decorate
:显示分支和标签指向的提交。--author=<作者>
:只显示特定作者的提交。--since=<时间>
:只显示指定时间之后的提交。--until=<时间>
:只显示指定时间之前的提交。--grep=<模式>
:只显示包含指定模式的提交消息。--no-merges
:不显示合并提交。--stat
:显示简略统计信息,包括修改的文件和行数。--abbrev-commit
:使用短提交哈希值。--pretty=<格式>
:使用自定义的提交信息显示格式。
git blame [选项] <文件路径>
git blame 命令用于逐行显示指定文件的每一行代码是由谁在什么时候引入或修改的。可以追踪文件中每一行的变更历史,包括作者、提交哈希、提交日期和提交消息等信息。
常用的选项包括:
-L <起始行号>,<结束行号>
:只显示指定行号范围内的代码注释。-C
:对于重命名或拷贝的代码行,也进行代码行溯源。-M
:对于移动的代码行,也进行代码行溯源。-C -C
或-M -M
:对于较多改动的代码行,进行更进一步的溯源。--show-stats
:显示包含每个作者的行数统计信息。
显示文件每一行的代码注释和相关信息:
git blame <文件路径>
只显示指定行号范围内的代码注释:
git blame -L <起始行号>,<结束行号> <文件路径>
对于重命名或拷贝的代码行进行溯源:
git blame -C <文件路径>
对于移动的代码行进行溯源:
git blame -M <文件路径>
显示行数统计信息:
git blame --show-stats <文件路径>
更多内容可以使用 git blame --help 查看完整的帮助文档,了解更多选项和使用方式。
基本操作示例
场景一:创建新仓库
使用当前目录作为 Git 仓库,我们只需使它初始化。
git init
该命令执行完后会在当前目录生成一个 .git 目录。
如果想使用我们指定的目录作为Git仓库。
git init newdir
初始化后,会在 newdir 目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都存放在这个目录中。
如果当前目录下有几个文件想要纳入版本控制,需要先用 git add 命令告诉 Git 开始对这些文件进行跟踪,然后提交:
$ git add *.c
$ git add README
$ git commit -m '初始化项目版本'
以上命令将目录下以 .c 结尾及 README 文件提交到仓库中。
注: 在 Linux 系统中,commit 信息使用单引号 ',Windows 系统,commit 信息使用双引号 "。
所以在 git bash 中 git commit -m '提交说明' 这样是可以的,在 Windows 命令行中就要使用双引号 git commit -m "提交说明"。
场景二:拉取并编辑远程仓库
我们使用 git clone 从现有 Git 仓库中拷贝项目(类似 svn checkout)。
克隆仓库的命令格式为:
git clone 远程仓库地址
如果我们需要克隆到指定的目录,可以使用以下命令格式:
git clone 远程仓库地址 指定文件夹目录
比如,要克隆 Ruby 语言的 Git 代码仓库 Grit,可以用下面的命令:
$ git clone git://github.com/schacon/grit.git
执行该命令后,会在当前目录下创建一个名为grit的目录,其中包含一个 .git 的目录,用于保存下载下来的所有版本记录。
如果要自己定义要新建的项目目录名称,可以在上面的命令末尾指定新的名字:
$ git clone git://github.com/schacon/grit.git mygrit
这样你新建的文件夹名就会变为mygrit而不是默认的仓库名(grit)。
新建开发分支
git branch devbranch
切换到开发分支
git checkout devbranch
编辑代码,编辑完成后将目录下所有文件添加到暂存区:
git add .
提交修改
$ git commit -m '我提交了什么内容'
切换回原本的分支
git checkout master
首先拉取下最近的修改,将本地分支状态和远程分支同步
git pull
将开发分支合并到当前分支
git merge devbranch
如果有冲突文件(远程有人和你修改了同一个文件),需要用git diff解决冲突,解决完成后用git add命令将解决完的文件添加到暂存区并提交(git commit)。
最后,将本地的修改同步给远程仓库
git push
四、常见问题及解决方法
解决冲突
在多人协作开发的过程中,Git 冲突是不可避免的问题。当两个或多个开发者在同一文件中修改了相同的内容时,Git 无法自动解决冲突,需要人工介入解决。
在使用 Git 提交代码时,可能会出现以下提示,表示存在冲突:
Automatic merge failed; fix conflicts and then commit.
要解决 Git 冲突,首先需要找到冲突发生的位置。在代码中出现以下标志性语句时,表示存在冲突:
diff
<<<<< HEAD
...
>>>>> other-branch
其中,HEAD 表示当前分支,other-branch 表示与其他分支发生冲突的分支。在代码中找到这样的标志,就可以定位到冲突的位置。
解决 Git 冲突需要手动编辑代码,将不同分支的修改合并到一起。具体步骤如下:
打开包含冲突的文件的编辑器,查找标志冲突的代码行,例如:
diff
<<<<< HEAD ... >>>>> other-branch
在合并后的代码行添加特殊注释,表示该行已解决冲突。例如:
arduino
// Conflict resolved manually by [your name]
比较不同分支的修改内容,选择您认为合适的修改内容,手动合并到同一代码行。
保存文件并关闭编辑器。使用git add 添加文件到暂存区,之后便可以提交到远程仓库。
git add文件夹时 添加无用文件
配置Git忽略文件:如果您希望某些文件不被Git跟踪,可以在仓库根目录下创建一个名为.gitignore的文件,并添加列出要忽略的文件路径。例如:
*.log
*.bak
temp/
这将忽略所有以.log和.bak为后缀的文件,以及名为temp/的文件夹。
如何将一个分支上的修改转移到另一个分支上
未commit操作时
首先把所有修改都git add进暂存区
,先不要git commit,然后:
git stash //把暂存区内的修改存储起来
git checkout dev //切换到正确的分支
git stash pop //将存储的修改取出来
已commit操作时
如果已经commit
了呢?
git reset HEAD^ // 撤回到刚刚commit之前的状态
git 拉取指定 tag 版本
git clone 指定的tag
git clone --branch [tag] [git地址]
已有仓库切换 tag
git checkout [tag]
warning: CRLF will be replaced by LF in 出现的原因和解决办法
主要原因是,不同系统下,文件的换行符是用不同字符表示的。
Linux采用换行符LF表示下一行;
Windows采用回车+换行CRLF表示下一行;
Mac OS采用回车CR表示下一行。
解决方法是,切换git对待换行符的方式。
git config core.autocrlf
查询当前应对策略。
为true时,Git会将你add的所有文件视为文本问价你,将结尾的CRLF转换为LF,而checkout时会再将文件的LF格式转为CRLF格式。
为false时,line endings不做任何改变,文本文件保持其原来的样子。
为input时,add时Git会把CRLF转换为LF,而check时仍旧为LF。
使用如下语句,让git忽略对换行符的判断。
git config core.autocrlf false
远程分支删除了但是本地还能查询到
运行命令同步分支状态:
git remote prune origin
五、Git图形界面工具
常用的Git图形界面工具一般有SourceTree、Github Desktop、TortoiseGit。Windows开发环境下我比较推荐使用TortoiseGit,可以安装汉化语言包。
SourceTree使用教程:Sourcetree 使用教程 | 菜鸟教程
Github Desktop使用教程:GitHub Desktop 使用入门 - GitHub 文档
TortoiseGit使用教程:TortoiseGit的安装及使用 - 知乎
六、参考资料
Git官方命令手册:Git - Reference
pdf文档版本:https://www.runoob.com/manual/github-git-cheat-sheet.pdf
菜鸟教程:Git 教程 | 菜鸟教程