Git相关命令
1、git介绍
1.1、git文件系统
git是一个分布式版本管理工具(没有中央服务器),每个开发者的本地机器上都有整个项目的历史记录。与集中式版本管理工具svn相反。空间如下分布:
主要概念包括:
- 仓库(Repository):Git 用来存储项目的版本历史的地方。可以是本地仓库,也可以是远程仓库(例如 GitHub 或 GitLab 上的仓库)。
- 工作区(Working Directory):当前正在编辑的代码所在的目录。工作区包含了项目的实际文件。
- 暂存区/索引区:Staging Area,用来存放准备提交的更改,通过git add命令将更改从工作区移动到暂存区。
- 提交 (Commit):将暂存区的更改永久记录到本地仓库中。每次提交都会有一个唯一的提交 ID,可以查看、恢复或撤销。
- 分支 (Branch):Git 允许你在不同的分支上并行工作,方便进行功能开发和修复bug而不影响主分支(main 或 master)。
- 合并 (Merge):合并不同分支上的更改。如果你在一个分支上工作,完成后可以通过 git merge 将其合并到主分支。
- 远程仓库 (Remote Repository):是托管在服务器上的仓库,开发者通过推送 (push) 和拉取 (pull) 来同步本地和远程仓库的代码。
1.2、git安装
windows系统下:
安装路径不要有中文。windows下安装git完成后,在windows界面下面会有一个Git Bash和一个Git GUI。git自带一个git config
工具来帮助设置Git外观和行为的配置变量。
可以通过以下命令查看所有的配置以及他们所在的文件git config --list --show-origin
git version
返回git版本。或者git --version
linux系统下:
sudo apt install git
# Ubuntu下的
sudo yum install git
# CentOS下的
1.3、初次运行git前的配置
安装完成后第一件事就是设置你的用户名和邮件地址,因为Git提交都会使用这些信息,会写入到你的每一次提交中,不可更改。因为git是分布式管理系统,需要用户名和邮箱作为标识。
在命令行输入如下:来设置用户信息
git config --global user.name “you_name”
git config --global user.email “[email protected]”
# 注意使用--global后,无论在该系统上做任何事,Git都会适用于那些信息。也可以对某个仓库指定不同的用户名和邮箱。
打印当前用户信息
git config --global user.name
git config --global user.email
或者git config --global --list # 列出所有Git当时能找到的配置
可以通过以下命令查看所有的配置以及他们所在的文件git config --list --show-origin
1.4、初始化一个git仓库
mkdir my_project
cd my_project
git init # 这会在当前目录下初始化一个新的Git仓库,创建一个名为.git的隐藏文件夹,用来存储所有版本控制的信息(提交历史、配置文件等)
git status # 检查仓库状态,输出如下:说明没有文件被Git追踪
# On branch master
# No commits yet
# nothing to commit (create/copy files and use "git add" to track)
# 如果有文件,可以使用git add以及commit添加并提交。
# 对于一个已有文件的git仓库的初始化,通常需要,
git add . # 将所有未追踪的文件添加到Git的暂存区
git commit -m "initial commit" # 提交修改
获取git仓库的方式还包括从远程仓库clone,详细请看后文git clone章节。
1.5、配置远程github
配置远程github仓库:
本地仓库和远程仓库(github/gitlab)之间通过SSH加密,需要设置。
(1)在用户主目录下C:\Users\Username.ssh看看有没有id_rsa和id_rsa.pub两个文件,如果没有,打开命令行,输入ssh-keygen -t rsa –C [email protected],id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
(2)登录github,打开setting里面的SSH Keys然后Add SSH Key,填上任意title,在Key文本框里黏贴id_rsa.pub文件的内容。这就配置好了。
判断是否配置成功,在本地git bash中
ssh -T [email protected]
# 如果配置成功,则应该返回下面的输出
Hi username! You've successfully authenticated, but GitHub does not provide shell access.
1.6、将本地仓库推送到远程仓库(Github/GitLab)
# 如果远程仓库没有初始化该仓库目录,则必须先在github上 手动 创建一个空仓库,必须手动创建!!!绕不开:
git remote add origin [email protected]:username/repository.git # 设置本地仓库对应的远程仓库地址,add选项用于将新的远程仓库添加到本地仓库的配置中,origin是默认的远程仓库名称,如果在多个远程平台有多个远程仓库,则可以给他们添加不同的名称;[email protected]:username/repository.git是远程仓库的url
git push --set-upstream origin master # 推送本地仓库到远程Github仓库,--set-upstream 选项用于设置本地分支与远程分支之间的追踪关系,如果只是git push则默认推送到origin,如果想要推送到所有关联的远程仓库,则应该显式地指定每个仓库,例如git push origin master; git push upstream master
可以使用git remote -v
来查看已关联的远程仓库,并显示url地址。
git remote # 列出当前仓库中已配置的远程仓库
git remote -v # 列出当前仓库中已配置的远程仓库,并显示其URL
origin https://github.com/schacon/ticgit (fetch)
origin https://github.com/schacon/ticgit (push)
继续添加远程仓库,指定仓库的名称和URL,将其添加到当前仓库中:git remote add <shortname> <url>
git remote add pb https://github.com/paulboone/ticgit # 添加后,列出已配置的远程仓库,会有两个,后面fetch和push。
git remote -v
origin https://github.com/schacon/ticgit (fetch)
origin https://github.com/schacon/ticgit (push)
pb https://github.com/paulboone/ticgit (fetch)
pb https://github.com/paulboone/ticgit (push)
远程仓库的重命名和移除
# git remote rename <old_name> <new_name> # 将已配置的远程仓库重命名。
git remote rename pb paul #是将pb重命名为paul。值得注意的是这同样也会修改你所有远程跟踪的分支名字。 那些过去引用 pb/master 的现在会引用 paul/master。
# git remote remove <remote_name> # 从当前仓库中删除指定的远程仓库。
git remote remove paul # 移除远程仓库。一旦你使用这种方式删除了一个远程仓库,那么所有和这个远程仓库相关的远程跟踪分支以及配置信息也会一起被删除。
git remote set-url <remote_name> <new_url> # 修改指定远程仓库的 URL。
git remote show <remote_name> # 显示指定远程仓库的详细信息,包括 URL 和跟踪分支。
1.7、git目录
git每个仓库都有一个隐藏目录.git目录,包含了所有版本控制信息和配置,负责跟踪项目的历史记录、配置、分支等信息。其下包含多个文件夹和文件。包括:
config文件:存储配置信息,用户信息,远程仓库地址,合并策略等。
HEAD文件:指示当前分支的位置,一般会指向当前分支的最新提交
refs/目录:存储所有分支和标签的引用,包括本地和远程
objects/目录:存储Git仓库中的所有对象,Git使用对象来表示每个提交、文件内容、树结构等,包括提交历史、作者、时间戳、目录结构、Blob对象存储文件内容、标签对象等。
index文件:也叫做暂存区。存储类待提交的更改,可以通过git status查看暂存区的状态
logs/目录:存储Git仓库的操作日志,帮助追踪操作历史,并且可以恢复历史状态,通过git reflos命令查看历史操作记录。
MERGE_HEAD文件:当你进行合并操作时,Git 会将合并的目标存储在 MERGE_HEAD 文件中。如果合并尚未完成,这个文件会存在,并指向合并目标的提交。
info/目录:包含一些配置的额外信息,例如全局忽略文件等。
hooks/目录:包含一个Git钩子脚本,可以在Git操作前后自动执行自定义脚本。
submodule/目录:如果使用了子模块,这个目录会保存子模块的信息。子模块是嵌套在主仓库中的Git仓库。
1.8、认识工作区和暂存区(索引区)
暂存区一般存在在.git目录下的index文件,所以暂存区也叫做index索引区,暂存区属于版本库,如下图所示。工作目录下的文件不外乎两种状态:已跟踪和未跟踪。可以用git status
来查看哪些文件处于哪些状态。
通过git init
把一个目录变成git可以管理的仓库。
一般流程:在Repository_0目录下新建一个.txt文件,readme.txt,写入内容,这个文件目前的状态是未跟踪。
使用git add readme.txt
将其file添加到暂存区里面去,或者使用git add.
提交所有修改。这一步是对git未跟踪的目标进行跟踪