目录
1、安装与简介
1.1 安装
点击官网安装包下载链接,选择操作系统 ,我这里安装的是windows 64位的。
下载后双击安装即可,没什么注意事项。 安装后,鼠标右键,到能下图两个选项,表示成功。
1.2 简介
这部分内容,想用通俗易懂的话,理解核心名词的含义,并理顺它们之间的关系。
- 工作区:编辑代码的地方(一般在自己电脑上),代码特指整个工程目录。
- 暂存区:一个中间索引区域,工作区内容有修改后,需要先手动添加至暂存区,该区会记录每一次变化内容,存储于.git目录中。
- 分支:每一个分支,都是一个独立的开发线,允许并行工作。一般用于多个版本,或多人开发,多个分支,各自在自己的分支上工作。
- 版本库:需将暂存区内容手动提交至版本库,也是位于.git目录下,版本库会包含所有分支,而在每一个分支下,又会存储提交的所有快照(每次从暂存区提交的内容)。
- 仓库:包含工作区和版本库的整体结构,特指工程目录下所有问价+.git目录。
理解上述内容后,日常工作中,也会碰到本地分支/远程分支,或者本地仓库/远程仓库等概念。
- 本地仓库:通俗理解,就是代码存储在你的本地机器上,与远程仓库相对,可以通过网络与远程仓库进行交互(如推送和拉取)。
- 远程仓库: 代码存储在云端服务器上,可供大家共享与修改。
- 本地分支:是指本地仓库中存在的分支。
- 远程分支:是指在远程仓库中存在的分支。
其中,本地分支会以普通名称显示,远程分支通常会以 remotes/origin/name形式显示。如下图,master就是本地分支,其余红色部分是远程分支。
2、本地仓库
2.1 设置用户信息
本地使用git工具,可在首次设置用户信息。具体操作:鼠标右键,选中打开Git Bash Here。
设置用户信息命令。
# 设置用户名和邮箱
git config --global user.name 用户名
git config --global user.email 邮箱
#示例
git config --global user.name 小红
git config --global user.email 996685qq@.com
设置成功后,一般会在c/user目录下,新建一个.gitconfig文件,保存用户信息。如果找不到,就使用搜索功能,我这的存放目录是C:\Users\Administrator\.gitconfig。
2.2 创建本地仓库
在工程代码的主目录下,右键,选中打开Git Bash Here,键入初始化命令。
#初始化
git init
成功后,会生成一个.git目录,也会默认创建一个主分支master。
没看到.git目录,也不要慌,可能是目录被隐藏了。点击查看->勾选上“隐藏的项目”,即可看到。
如果想删除,刚初始化的git仓库
#在 Windows 系统上,打开命令行(cmd)并运行
rmdir /s /q .git
#在 Mac 或 Linux 系统上,打开终端并运行:
rm -rf .git
2.3 查看分支
查看所有分支,前面讲过,初始化时默认会创建一个主分支master。
#查看所有分支
git branch -a
#查看远程分支
git branch -r
但这里,使用命令查看,什么都没有。为什么?先留一个悬念。
2.4 查看仓库状态
#查看仓库状态
git status
如下图所示,这里是初始化后默认生成的主分支master,且未进行任何操作,而显示的状态。
查看仓库状态,你会得到以下几个关键信息,以上图为例子,阐述说明。
- 显示当前所在分支名称:on branch master(在master分支);
- 提交状态:No commit yet(未进行任何提交);
- 未跟踪文件:列出那些文件是尚未被跟踪的,如上图中红色字体。未添加到暂存区的文件,被称为“未跟踪文件”。
- 暂存区状态:显示那些文件已经被添加至暂存区,上图无,因为我们还没有手动执行任何操作呢。
2.5 添加暂存区
#添加部分文件到暂存区
git add 文件名或文件夹名
#添加所有
git add .
#添加特定类型文件
git add *.txt
#示例
git add Main.py Icon/
执行示例命令后,如下图,我添加了一个py文件和一个Icon文件夹。
再次执行查看仓库状态,相较于第一次查看,多了一项 "Changes to be committed" ,直译过来就是提交前的改变,即暂存区内。
这样,绿色字体表示添加至暂存区。红色部分仍在工作区。
注意:添加到暂存区,并不等同于提交,所以还需手动提交至仓库。
2.6 提交本地仓库
注意:不能直接从工作区提交至本地仓库,只能先添加到暂存区,在提交到本地仓库。
#提交至本地仓库
git commit -m "提交信息说明,最好有意义,便于回溯" 暂存区文件名
#提交所有,包括未暂存的(跟踪但未添加暂存)
git commit -a -m "提交信息说明"
#示例
git commit -m “首次提交” Icon/
着重解释下,加上-a命令后,会提交所有,包括未暂存的(跟踪但未添加暂存),什么意思?
举个例子,假设A文件,首次被添加至暂存区(已变成了跟踪文件),可是在后来的操作中,A文件在工作区被修改过,但并未将其手动添加,这种就称之为 未暂存文件。
这个例子说明了,如下3点内容:
- 只要添加过暂存区,就变成了跟踪文件。
- 在工作区修改跟踪文件后,暂存区不会自动更新该文件,必须手动添加,暂存区才会记录修改内容。
- 提交所有时,会将所有跟踪文件(暂存或未暂存的),先添加到暂存区,在提交。
执行示例命令后,如下图所示。
此时,执行查看所有分支,示例图如下,主分支master已经存在了。这里是为了解惑,之前初始化后,查看分支没有的疑问。我理解的是,分支上有提交内容后,才会显示。
master显示为绿色,且前方带有 * 号,表示你当前处于分支master,接下来所有操作都是基于此分支进行的。
2.7 创建和切换分支
# 创建新分支后,在切换到新分支
git branch name
git checkout name
#创建新分支,且直接切换到该新分支
git checkout -b name
#示例
git checkout -b 3.1
执行示例代码后,再次查看所有分支,如下图。新分支3.1创建后,直接切换。分支名以绿色显示,且前方带*号,表示你当前所处分支3.1。
新建分支3.1,是基于主分支master创建的,所以内容并不为空,而是复制master中的所有内容。
如何去确认呢?这里可以使用,查看分支差异命令。
#查看两个分支差异
git diff name1..name2
#示例
git diff master..3.1
执行示例命令后,无任何差异输出,再次验证了分支3.1是基于master创建的。
那是不是可以认为,每创建一个新分支,就是基于主分支的呢?
答案:不是的,我们可以做一个实验。
先在主分支上提交新内容,让主分支与分支3.1保持不同。然后切换到分支3.1后,在创建分支3.2,此时分别对比分支3.2与3.1,master的差异。会发现分支3.2与3.1无差异,这也就表明,创建新分支时,默认复制你当前所处分支内容。
#切换到主分支master
git checkout master
#检查切换成功
git branch -a
#主分支二次提交
git commit -m "二次提交" Main.py
#查看主分支与3.1差异
git diff master..3.1
#切换到分支3.1
git checkout 3.1
#创建分支3.2
git checkout -b 3.2
#分别查看分支3.2与3.1,master之间的差异
git diff 3.1..3.2
git diff master..3.2
windows下查看差异,碰到这种冒号:,之前键入 q ,即可退出。
2.8 删除分支
删除分支前,切记,要先切换到其他分支,才能删除,否则报错。
#先切换分支,在执行删除
git checkout name1
git branch -d name2
#示例
git checkout master
git branch -d 3.1
2.9 合并分支
将原分支(你修改的分支)合并到目标分支。
#切换到目标分支
git checkout target-branch
#合并分支,将原分支ori-branch合并到目标分支target-branch
git merge ori-branch
插个题外话,如果主分支master更新了(如添加新内容),3.1分支(创建时直接复制master分支的内容)不做任何操作,会自动更新吗?答案是不会的,需要手动更新(合并)。
2.9.1 无冲突合并
举例,在3.2分支上,添加和提交新文件untitled.ui,然后合并到分支3.1。
2.9.2 冲突合并
Git中较为常见的冲突,一般是指内容冲突。
- 同一文件的同一位置被不同分支修改。
- 同一文件的不同位置被不同分支分别进行了修改,这种是没有直接冲突的,Git会自动合并,但是大部分修改会导致代码行的位置变化。
这里还是以举例子说明,分别在master、3.1分支下,修改Mainform.py中第9行的代码,且两分支修改内容不同,执行合并。
结果如下图,提示自动合并失败,冲突文件为Mainform.py,此时需手动调整冲突再次提交结果。
2.9.3 特殊情况
不知道大家有没有碰到这样的情况,在拉取主分支后,忘记切换到自己所属分支上了,然后就开始了创作(修改),等到提交的时候,发现自己竟然是在主分支上修改的。此时,既不想丢弃自己辛苦的创作,又想保持主分支干净(无任何修改痕迹)。所以,最好的结果,就是让修改内容提交到自己所属分支上,主分支保持原状。
以举例子方式,假如我在分支3.1下进行修改后,想同步合并到分支master上,但又不想提交至分支3.1(分支3.1保持未修改前状态)。
首先切换到3.1分支下,修改Mainform.py文件(添加一行代码)并保存后,直接使用命令切换至master分支,如下图,会提示Mainform.py文件有未提交的修改。
此时,已经成功切换到了master分支下,打开Mainform.py文件后,进行检查,是修改后的样子。然后,就可以直接执行添加暂存区和提交。
上述操作执行成功后,你在3.1分支上的修改内容,就同步提交到了分支master上。最后,不放心的,可以切换到分支3.1上,检查下修改内容是否提交到3.1上了,因为咱们没有在分支3.1上操作,所以就不会。
2.9.4 常规选择
我们在某一分支上进行创作后,通常,你可以有三种选择:
1、 提交更改:切换到分支3.1后,执行添加暂存区和提交操作(git add / git commit)。
2、 放弃更改:切换到分支3.1后,执行放弃更改命令 git checkout --Mainform.py。
3、 暂存更改:如果你不想现在提交,可以使用Git暂存功能,等用时在恢复暂存。
第3中方式,不同于上述两种,无需先切换到分支3.1下,它在任何一分支下(前提是分支下有该文件),执行均有效。
还是以例子说明,我是直接在master分支下执行暂存,结果如下图所示。
执行后,会发现master分支下的修改消失了,3.1分支下的修改也消失了。然后,我尝试在3.1分支下,执行暂存,最终是同样的结果。
此外,我尝试了,在master分支下执行暂存,在3.1分支下执行恢复暂存,惊讶地发现两个分支下的修改同时消失,也同时恢复了。
我怀疑暂存和恢复功能,无需区分分支,是一个统一的动作。感兴趣的小伙伴可以尝试。
#查看更改
git diff 文件名
#暂存更改
git stash
#恢复暂存
git stash pop
#放弃更改
git checkout --文件名
2.9.5 Vim退出操作
操作过程中,如果碰到了如下的vim编辑界面,不知道怎么操作,看过来。
如下图所示,按 Esc
键,然后键入 :wq
来保存并退出。
还有碰见这种情况的,如下图所示,键入 q 字母即可退出。
3、远程仓库
在我们工作时,通常使用的是公司远程仓库,即一台云端服务器,不允许在上面开发,只存储代码。大家协同工作时,每个人都要先从远程仓库中克隆代码。
3.1 克隆
依旧是在你想存放代码的主目录下,右键->open Git Bash Here,键入克隆指令。
#克隆
git clone <repo-url>
克隆成功后,主目录下会自带.git目录。
查看所有分支,本地分支以分支名显示,远程分支通常以remotes/origin/分支名显示。
这个master本地分支,其实不是我们人为创建的。而是,在克隆远程仓库时,Git会自动为你创建一个本地分支,通常复制的是远程主分支master或main,具体取决于远程仓库的默认分支设置。
3.2 拉取和推送
克隆后,默认创建的本地分支master会与远程分支remotes/origin/master建立跟踪关系。
此时,可以使用简单的拉取(从remotes/origin/master拉取最新代码到本地)和推送(将本地master修改内容推送到远端)命令。
#拉取
git pull
#推送
git push
如果本地分支,并没有与远程分支建立跟踪关系,在拉取和推送时,需注明远程分支名称。
git pull remotes/origin/master
git push remotes/origin/master
3.3 创建本地分支
克隆成功后,本地分支通常与远程仓库的主分支建立跟踪关系,在本地进行开发后,可能会不小心推送到远程,破坏了主分支,就会影响到别人。
这种情况,建议在远程仓库中,创建一个独属你的分支own。进而在本地,创建一个新分支,是基于远程仓库中独属你的分支owm。这样,你在本地任何开发,一不小心推送到远程,也不用担心,毕竟也影响不到别人。
#基于远程分支创建本地分支,并切换
git checkout -b branch_name remote/origin/name
基于远程分支9.1,新建了一个本地分支9.1,这两个分支是建立了跟踪关系的。
跟踪关系具有传递性?不具备,需手动添加。
假如新建一个本地分支9.2,是基于本地分支9.1创建的。因为本地分支9.1 与远程分支9.1建立了跟踪关系的,那本地分支9.2会不会与远程分支9.1建立跟踪关系呢?
答案是不会的,需要自己手动添加。
以上内容,纯属自己所想所写,如有不对,欢迎评论区更正!!!
以后如有新想法,会持续更新!!!