Git基础教程-常用命令整理:学会Git使用方法和错误解决
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
目录
warning: CRLF will be replaced by LF in 出现的原因和解决办法
这里是Git初级使用教程Git是一种分布式版本控制系统广泛应用于软件开发行业。它可以帮助您更好地管理代码跟踪代码的变更历史并使团队协作更加高效。在这篇教程中我们将介绍Git的基本概念、安装和使用方法帮助你快速上手Git。
一、了解Git的基本概念
在开始使用Git之前我们需要了解一些基本概念
- 仓库Repository仓库是你用于存储代码的地方。在Git中你可以在本地创建一个仓库也可以从远程服务器克隆一个已有的仓库。
- 分支Branch分支是用来隔离不同开发线的。在同一个仓库中可以创建多个分支每个分支都可以独立地进行修改和提交。
- 提交Commit提交是您对代码进行的修改操作。每次提交都会生成一个新的版本并记录修改的内容和时间。
- HEADHEAD是当前分支的引用。它指向最新提交的版本也是进行下一次修改的起点。
- 工作区就是你在电脑里能看到的代码目录。
- 暂存区英文叫 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 可以理解 kdiff3tkdiffmeldxxdiffemergevimdiffgvimdiffecmerge和 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 教程 | 菜鸟教程